Subject: Built motion from commit 283992dd.|2.5.41
From: Andrea Amorese <[email-masked]>
Date: Wed, 22 Dec 2021 15:55:48 +0000 (+0100)

Built motion from commit 283992dd.|2.5.41
---

diff --git a/apidoc/api_data.js b/apidoc/api_data.js
index f0b2a3c..02628ea 100644
--- a/apidoc/api_data.js
+++ b/apidoc/api_data.js
@@ -1301,6 +1301,44 @@ define({ "api": [
   },
   {
     "type": "post",
+    "url": "/api/auth/google",
+    "title": "Creates a new User token",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/auth/google -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
+        "type": "json"
+      }
+    ],
+    "name": "Local_login",
+    "group": "Authentication",
+    "parameter": {
+      "fields": {
+        "Body": [
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": false,
+            "field": "name",
+            "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": false,
+            "field": "password",
+            "description": ""
+          }
+        ]
+      }
+    },
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/authGoogle/index.js",
+    "groupTitle": "Authentication"
+  },
+  {
+    "type": "post",
     "url": "/api/auth/local",
     "title": "Creates a new User token",
     "examples": [
@@ -1339,12 +1377,12 @@ define({ "api": [
   },
   {
     "type": "post",
-    "url": "/api/auth/google",
+    "url": "/api/auth/activedirectory",
     "title": "Creates a new User token",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/auth/google -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
+        "content": "curl https://{domain}/api/auth/activedirectory -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
         "type": "json"
       }
     ],
@@ -1372,7 +1410,7 @@ define({ "api": [
     },
     "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/authGoogle/index.js",
+    "filename": "server/api/authActiveDirectory/index.js",
     "groupTitle": "Authentication"
   },
   {
@@ -4281,6 +4319,13 @@ define({ "api": [
             "group": "Body",
             "type": "String",
             "optional": true,
+            "field": "labelText",
+            "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": true,
             "field": "messagesAlignment",
             "description": ""
           },
@@ -5493,16 +5538,16 @@ define({ "api": [
   },
   {
     "type": "get",
-    "url": "/api/cloudProviders/{id}",
-    "title": "Gets a single CloudProvider",
+    "url": "/api/cloudProviders/oauth2/microsoft/authorize/{id}",
+    "title": "Generates the Microsoft Identity platform authorization url",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}",
+        "content": "curl https://{domain}/api/cloudProviders/oauth2/microsoft/authorize/{id} -v -u {name}:{password}",
         "type": "json"
       }
     ],
-    "name": "ShowCloudProviders",
+    "name": "Oauth2MicrosoftAuthorize",
     "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
@@ -5510,340 +5555,51 @@ define({ "api": [
     "groupTitle": "CloudProviders"
   },
   {
-    "type": "put",
-    "url": "/api/cloudProviders/{id}",
-    "title": "Update an existing CloudProvider",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateCloudProviders",
+    "type": "post",
+    "url": "/api/cloudProviders/oauth2/microsoft/callback",
+    "title": "Receives an authorization code from Microsoft Identity platform",
+    "name": "Oauth2MicrosoftCallback",
     "group": "CloudProviders",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/cloudProvider/index.js",
     "groupTitle": "CloudProviders"
   },
   {
-    "type": "post",
-    "url": "/api/cm_contact_has_items",
-    "title": "Creates a new CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateCmContactHasItems",
-    "group": "CmContactHasItems",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "CmContactId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "item",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "ItemTypeId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "ItemClass",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "description",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "delete",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Deletes a CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_contact_has_items",
-    "title": "Gets a list of CmContactHasItems",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/cm_contact_has_items?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/cm_contact_has_items?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/cm_contact_has_items?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/cm_contact_has_items?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/cm_contact_has_items?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Gets a single CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "ShowCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "put",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Update an existing CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "post",
-    "url": "/api/cm_hopper_additional_phones",
-    "title": "Creates a new CmHopperAdditionalPhone",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "CmHopperId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": false,
-            "field": "phone",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "scheduledat",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countbusyretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countcongestionretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countnoanswerretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countnosuchnumberretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countdropretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countabandonedretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countmachineretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countagentrejectretry",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
-    "type": "delete",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Deletes a CmHopperAdditionalPhone",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
     "type": "get",
-    "url": "/api/cm_hopper_additional_phones",
-    "title": "Gets a list of CmHopperAdditionalPhones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/cm_hopper_additional_phones?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/cm_hopper_additional_phones?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Gets a single CmHopperAdditionalPhone",
+    "url": "/api/cloudProviders/{id}",
+    "title": "Gets a single CloudProvider",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -v -u {name}:{password}",
+        "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}",
         "type": "json"
       }
     ],
-    "name": "ShowCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
+    "name": "ShowCloudProviders",
+    "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
+    "filename": "server/api/cloudProvider/index.js",
+    "groupTitle": "CloudProviders"
   },
   {
     "type": "put",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Update an existing CmHopperAdditionalPhone",
+    "url": "/api/cloudProviders/{id}",
+    "title": "Update an existing CloudProvider",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
+        "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
         "type": "json"
       }
     ],
-    "name": "updateCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
+    "name": "updateCloudProviders",
+    "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
+    "filename": "server/api/cloudProvider/index.js",
+    "groupTitle": "CloudProviders"
   },
   {
     "type": "post",
@@ -6447,42 +6203,6 @@ define({ "api": [
     "groupTitle": "Cm_Contacts"
   },
   {
-    "type": "post",
-    "url": "/api/cm/contacts/{id}/duplicatePhones",
-    "title": "Sets new contact additional phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/duplicateAdditionalPhones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "duplicateAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm/contacts/{id}/phones",
-    "title": "Gets contact phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/phones -v -u {name}:{password} -X GET",
-        "type": "json"
-      }
-    ],
-    "name": "getAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
     "type": "get",
     "url": "/api/cm/contacts/{id}/journey",
     "title": "Gets customer journey",
@@ -6556,42 +6276,6 @@ define({ "api": [
   },
   {
     "type": "post",
-    "url": "/api/cm/contacts/{id}/rescheduleAdditionalPhones",
-    "title": "Sets new contact additional phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/rescheduleAdditionalPhones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "rescheduleAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "post",
-    "url": "/api/cm/contacts/{id}/phones",
-    "title": "Sets new contact phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/phones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "setAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/contacts/{id}/tags",
     "title": "Sets new tags",
     "examples": [
@@ -6878,13 +6562,6 @@ define({ "api": [
             "optional": true,
             "field": "countagentrejectretry",
             "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
           }
         ]
       }
@@ -7624,6 +7301,24 @@ define({ "api": [
     "groupTitle": "Cm_Hopper"
   },
   {
+    "type": "post",
+    "url": "/api/cm/hopper/previewrecall",
+    "title": "Gets Preview Dialer Contacts for Recall",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/cm/hopper/previewrecall -d '{\"hopperId\": 1}' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "getPreviewRecall",
+    "group": "Cm_Hopper",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/cmHopper/index.js",
+    "groupTitle": "Cm_Hopper"
+  },
+  {
     "type": "put",
     "url": "/api/cm/hopper/{id}",
     "title": "Update an existing Hopper",
@@ -8207,24 +7902,6 @@ define({ "api": [
   },
   {
     "type": "post",
-    "url": "/api/cm/contacts/uploadUpdates/:id",
-    "title": "Import existing contacts by csv",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/uploadUpdates/:id -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "importUpdates",
-    "group": "Cm_contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_contacts"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/contacts/upload",
     "title": "Upload csv",
     "examples": [
@@ -8297,123 +7974,6 @@ define({ "api": [
   },
   {
     "type": "post",
-    "url": "/api/contact_item_types",
-    "title": "Creates a new ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateContactItemTypes",
-    "group": "ContactItemType",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": false,
-            "field": "name",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "rgbBackgroundColor",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "delete",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Deletes a ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "get",
-    "url": "/api/contact_item_types",
-    "title": "Gets a list of ContactItemTypes",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/contact_item_types?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/contact_item_types?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/contact_item_types?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/contact_item_types?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/contact_item_types?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "get",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Gets a single ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "ShowContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "put",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Update an existing ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/custom_field",
     "title": "Create a new custom field",
     "examples": [
@@ -11420,9 +10980,9 @@ define({ "api": [
     "groupTitle": "Fax_Messages"
   },
   {
-    "type": "post",
-    "url": "/api/fax/messages",
-    "title": "Create message and send Fax",
+    "type": "put",
+    "url": "/api/fax/messages/{id}/reject",
+    "title": "Rejects message",
     "examples": [
       {
         "title": "Example usage:",
@@ -11432,15 +10992,15 @@ define({ "api": [
     ],
     "name": "rejectMessage",
     "group": "Fax_Messages",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/faxMessage/index.js",
     "groupTitle": "Fax_Messages"
   },
   {
-    "type": "put",
-    "url": "/api/fax/messages/{id}/reject",
-    "title": "Rejects message",
+    "type": "post",
+    "url": "/api/fax/messages",
+    "title": "Create message and send Fax",
     "examples": [
       {
         "title": "Example usage:",
@@ -11450,7 +11010,7 @@ define({ "api": [
     ],
     "name": "rejectMessage",
     "group": "Fax_Messages",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/faxMessage/index.js",
     "groupTitle": "Fax_Messages"
@@ -20836,6 +20396,24 @@ define({ "api": [
   },
   {
     "type": "get",
+    "url": "/api/realtime/agents",
+    "title": "Gets realtime agents info",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/realtime/agents -v -u {name}:{password}  -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "getAgents",
+    "group": "Realtime",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/realtime/index.js",
+    "groupTitle": "Realtime"
+  },
+  {
+    "type": "get",
     "url": "/api/realtime/queues",
     "title": "Gets realtime queues info",
     "examples": [
@@ -26455,7 +26033,7 @@ define({ "api": [
   },
   {
     "type": "get",
-    "url": "/api/system/process",
+    "url": "/api/system",
     "title": "Gets system information",
     "examples": [
       {
@@ -26473,7 +26051,7 @@ define({ "api": [
   },
   {
     "type": "get",
-    "url": "/api/system",
+    "url": "/api/system/process",
     "title": "Gets system information",
     "examples": [
       {
@@ -26772,12 +26350,12 @@ define({ "api": [
   },
   {
     "type": "delete",
-    "url": "/api/fax/queues/{id}/teams",
+    "url": "/api/openchannel/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/openchannel/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26785,17 +26363,17 @@ define({ "api": [
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/faxQueue/index.js",
+    "filename": "server/api/openchannelQueue/index.js",
     "groupTitle": "Teams"
   },
   {
     "type": "delete",
-    "url": "/api/openchannel/queues/{id}/teams",
+    "url": "/api/voice/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/openchannel/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26803,17 +26381,17 @@ define({ "api": [
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/openchannelQueue/index.js",
+    "filename": "server/api/voiceQueue/index.js",
     "groupTitle": "Teams"
   },
   {
     "type": "delete",
-    "url": "/api/voice/queues/{id}/teams",
-    "title": "Remove teams from a queue",
+    "url": "/api/voice/Prefixes/{id}/teams",
+    "title": "Remove teams from a voice prefix",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26821,7 +26399,7 @@ define({ "api": [
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/voiceQueue/index.js",
+    "filename": "server/api/voicePrefix/index.js",
     "groupTitle": "Teams"
   },
   {
@@ -26844,6 +26422,24 @@ define({ "api": [
   },
   {
     "type": "delete",
+    "url": "/api/whatsapp/queues/{id}/teams",
+    "title": "Remove teams from a queue",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/whatsapp/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "type": "json"
+      }
+    ],
+    "name": "RemoveTeams",
+    "group": "Teams",
+    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/whatsappQueue/index.js",
+    "groupTitle": "Teams"
+  },
+  {
+    "type": "delete",
     "url": "/api/mail/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
@@ -26880,12 +26476,12 @@ define({ "api": [
   },
   {
     "type": "delete",
-    "url": "/api/whatsapp/queues/{id}/teams",
+    "url": "/api/fax/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/whatsapp/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26893,7 +26489,7 @@ define({ "api": [
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/whatsappQueue/index.js",
+    "filename": "server/api/faxQueue/index.js",
     "groupTitle": "Teams"
   },
   {
@@ -31921,6 +31517,42 @@ define({ "api": [
   },
   {
     "type": "post",
+    "url": "/api/voice/prefixes/{id}/teams",
+    "title": "Add teams to voice prefix",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -d '{\"ids\": [1,2]}' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
+        "type": "json"
+      }
+    ],
+    "name": "AddTeams",
+    "group": "Voice_Prefix",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/voicePrefix/index.js",
+    "groupTitle": "Voice_Prefix"
+  },
+  {
+    "type": "get",
+    "url": "/api/voice/prefixes/{id}/teams",
+    "title": "Gets voice prefix team",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -v -u {name}:{password}  -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "GetTeams",
+    "group": "Voice_Prefix",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/voicePrefix/index.js",
+    "groupTitle": "Voice_Prefix"
+  },
+  {
+    "type": "post",
     "url": "/api/voice/prefixes/{id}/users",
     "title": "Add agents to a prefix",
     "examples": [
@@ -33189,6 +32821,13 @@ define({ "api": [
             "optional": true,
             "field": "dialPredictiveIntervalMinThreshold",
             "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "Boolean",
+            "optional": true,
+            "field": "dialPreviewAutoRecallMe",
+            "description": ""
           }
         ]
       }
diff --git a/apidoc/api_data.json b/apidoc/api_data.json
index f515d42..e15d4ab 100644
--- a/apidoc/api_data.json
+++ b/apidoc/api_data.json
@@ -1301,6 +1301,44 @@
   },
   {
     "type": "post",
+    "url": "/api/auth/google",
+    "title": "Creates a new User token",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/auth/google -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
+        "type": "json"
+      }
+    ],
+    "name": "Local_login",
+    "group": "Authentication",
+    "parameter": {
+      "fields": {
+        "Body": [
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": false,
+            "field": "name",
+            "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": false,
+            "field": "password",
+            "description": ""
+          }
+        ]
+      }
+    },
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/authGoogle/index.js",
+    "groupTitle": "Authentication"
+  },
+  {
+    "type": "post",
     "url": "/api/auth/local",
     "title": "Creates a new User token",
     "examples": [
@@ -1339,12 +1377,12 @@
   },
   {
     "type": "post",
-    "url": "/api/auth/google",
+    "url": "/api/auth/activedirectory",
     "title": "Creates a new User token",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/auth/google -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
+        "content": "curl https://{domain}/api/auth/activedirectory -d '{\"name\": \"john.doe\", \"password\": \"password\"}' \\\n -H \"Content-Type: application/json\" -X POST",
         "type": "json"
       }
     ],
@@ -1372,7 +1410,7 @@
     },
     "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/authGoogle/index.js",
+    "filename": "server/api/authActiveDirectory/index.js",
     "groupTitle": "Authentication"
   },
   {
@@ -4281,6 +4319,13 @@
             "group": "Body",
             "type": "String",
             "optional": true,
+            "field": "labelText",
+            "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "String",
+            "optional": true,
             "field": "messagesAlignment",
             "description": ""
           },
@@ -5493,16 +5538,16 @@
   },
   {
     "type": "get",
-    "url": "/api/cloudProviders/{id}",
-    "title": "Gets a single CloudProvider",
+    "url": "/api/cloudProviders/oauth2/microsoft/authorize/{id}",
+    "title": "Generates the Microsoft Identity platform authorization url",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}",
+        "content": "curl https://{domain}/api/cloudProviders/oauth2/microsoft/authorize/{id} -v -u {name}:{password}",
         "type": "json"
       }
     ],
-    "name": "ShowCloudProviders",
+    "name": "Oauth2MicrosoftAuthorize",
     "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
@@ -5510,340 +5555,51 @@
     "groupTitle": "CloudProviders"
   },
   {
-    "type": "put",
-    "url": "/api/cloudProviders/{id}",
-    "title": "Update an existing CloudProvider",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateCloudProviders",
+    "type": "post",
+    "url": "/api/cloudProviders/oauth2/microsoft/callback",
+    "title": "Receives an authorization code from Microsoft Identity platform",
+    "name": "Oauth2MicrosoftCallback",
     "group": "CloudProviders",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/cloudProvider/index.js",
     "groupTitle": "CloudProviders"
   },
   {
-    "type": "post",
-    "url": "/api/cm_contact_has_items",
-    "title": "Creates a new CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateCmContactHasItems",
-    "group": "CmContactHasItems",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "CmContactId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "item",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "ItemTypeId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "ItemClass",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "description",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "delete",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Deletes a CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_contact_has_items",
-    "title": "Gets a list of CmContactHasItems",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/cm_contact_has_items?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/cm_contact_has_items?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/cm_contact_has_items?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/cm_contact_has_items?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/cm_contact_has_items?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Gets a single CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "ShowCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "put",
-    "url": "/api/cm_contact_has_items/{id}",
-    "title": "Update an existing CmContactHasItem",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_contact_has_items/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateCmContactHasItems",
-    "group": "CmContactHasItems",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContactHasItem/index.js",
-    "groupTitle": "CmContactHasItems"
-  },
-  {
-    "type": "post",
-    "url": "/api/cm_hopper_additional_phones",
-    "title": "Creates a new CmHopperAdditionalPhone",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "CmHopperId",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": false,
-            "field": "phone",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "scheduledat",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countbusyretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countcongestionretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countnoanswerretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countnosuchnumberretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countdropretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countabandonedretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countmachineretry",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "countagentrejectretry",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
-    "type": "delete",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Deletes a CmHopperAdditionalPhone",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
     "type": "get",
-    "url": "/api/cm_hopper_additional_phones",
-    "title": "Gets a list of CmHopperAdditionalPhones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/cm_hopper_additional_phones?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/cm_hopper_additional_phones?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/cm_hopper_additional_phones?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Gets a single CmHopperAdditionalPhone",
+    "url": "/api/cloudProviders/{id}",
+    "title": "Gets a single CloudProvider",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -v -u {name}:{password}",
+        "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}",
         "type": "json"
       }
     ],
-    "name": "ShowCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
+    "name": "ShowCloudProviders",
+    "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
+    "filename": "server/api/cloudProvider/index.js",
+    "groupTitle": "CloudProviders"
   },
   {
     "type": "put",
-    "url": "/api/cm_hopper_additional_phones/{id}",
-    "title": "Update an existing CmHopperAdditionalPhone",
+    "url": "/api/cloudProviders/{id}",
+    "title": "Update an existing CloudProvider",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm_hopper_additional_phones/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
+        "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
         "type": "json"
       }
     ],
-    "name": "updateCmHopperAdditionalPhones",
-    "group": "CmHopperAdditionalPhones",
+    "name": "updateCloudProviders",
+    "group": "CloudProviders",
     "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/cmHopperAdditionalPhone/index.js",
-    "groupTitle": "CmHopperAdditionalPhones"
+    "filename": "server/api/cloudProvider/index.js",
+    "groupTitle": "CloudProviders"
   },
   {
     "type": "post",
@@ -6447,42 +6203,6 @@
     "groupTitle": "Cm_Contacts"
   },
   {
-    "type": "post",
-    "url": "/api/cm/contacts/{id}/duplicatePhones",
-    "title": "Sets new contact additional phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/duplicateAdditionalPhones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "duplicateAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "get",
-    "url": "/api/cm/contacts/{id}/phones",
-    "title": "Gets contact phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/phones -v -u {name}:{password} -X GET",
-        "type": "json"
-      }
-    ],
-    "name": "getAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
     "type": "get",
     "url": "/api/cm/contacts/{id}/journey",
     "title": "Gets customer journey",
@@ -6556,42 +6276,6 @@
   },
   {
     "type": "post",
-    "url": "/api/cm/contacts/{id}/rescheduleAdditionalPhones",
-    "title": "Sets new contact additional phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/rescheduleAdditionalPhones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "rescheduleAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "post",
-    "url": "/api/cm/contacts/{id}/phones",
-    "title": "Sets new contact phones",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/{id}/phones -d '{\"phones\": [p1,p2]}' -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "setAdditionalPhones",
-    "group": "Cm_Contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_Contacts"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/contacts/{id}/tags",
     "title": "Sets new tags",
     "examples": [
@@ -6878,13 +6562,6 @@
             "optional": true,
             "field": "countagentrejectretry",
             "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
           }
         ]
       }
@@ -7624,6 +7301,24 @@
     "groupTitle": "Cm_Hopper"
   },
   {
+    "type": "post",
+    "url": "/api/cm/hopper/previewrecall",
+    "title": "Gets Preview Dialer Contacts for Recall",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/cm/hopper/previewrecall -d '{\"hopperId\": 1}' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "getPreviewRecall",
+    "group": "Cm_Hopper",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/cmHopper/index.js",
+    "groupTitle": "Cm_Hopper"
+  },
+  {
     "type": "put",
     "url": "/api/cm/hopper/{id}",
     "title": "Update an existing Hopper",
@@ -8207,24 +7902,6 @@
   },
   {
     "type": "post",
-    "url": "/api/cm/contacts/uploadUpdates/:id",
-    "title": "Import existing contacts by csv",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/cm/contacts/uploadUpdates/:id -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "importUpdates",
-    "group": "Cm_contacts",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/cmContact/index.js",
-    "groupTitle": "Cm_contacts"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/contacts/upload",
     "title": "Upload csv",
     "examples": [
@@ -8297,123 +7974,6 @@
   },
   {
     "type": "post",
-    "url": "/api/contact_item_types",
-    "title": "Creates a new ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST",
-        "type": "json"
-      }
-    ],
-    "name": "CreateContactItemTypes",
-    "group": "ContactItemType",
-    "parameter": {
-      "fields": {
-        "Body": [
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": false,
-            "field": "name",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "Integer",
-            "optional": true,
-            "field": "OrderBy",
-            "description": ""
-          },
-          {
-            "group": "Body",
-            "type": "String",
-            "optional": true,
-            "field": "rgbBackgroundColor",
-            "description": ""
-          }
-        ]
-      }
-    },
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "delete",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Deletes a ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -v -u {name}:{password} -X DELETE",
-        "type": "json"
-      }
-    ],
-    "name": "DeleteContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "get",
-    "url": "/api/contact_item_types",
-    "title": "Gets a list of ContactItemTypes",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "GetContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will always return paged results. Motion returns paging data in the <code>Content-Range</code> header in the form start - end / total.</p> <p>Upon success Motion will return a HTTP status code <code>200 OK</code> if the entire collection was returned otherwise it will return a HTTP status code <code>206</code> Partial Content.</p> <p>Motion renders the resulting JSON representation in the response body.</p> <h2>Retrieving Specific Fields</h2> <p>To return only specific fields for a result set you can utilize the <code>fields</code> parameter. This parameter accepts a comma-separated list.</p> <p>A call returning only <code>id</code> and <code>name</code> for a result set would look like this.</p> <p><code>GET /api/contact_item_types?fields=id,name</code></p> <h2>Filtering</h2> <p>You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.</p> <p>A call returning a result set for records with <code>name</code> of <code>john.doe</code> or <code>jane.miller</code>.</p> <p><code>GET /api/contact_item_types?name=john.doe,jane.miller</code></p> <p>If you use the key <code>filter</code> the result will be filtered by the value you specify.</p> <p><code>GET /api/contact_item_types?filter=john</code></p> <h2>Sorting</h2> <p>To sort a result set based on one or several fields you can utilize the <code>sort</code> parameter. This parameters accepts a comma-separated list.</p> <p>Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (<code>-</code>).</p> <p>A call sorting a result by <code>id</code> ascending and then <code>name</code> descending would look like this.</p> <p><code>GET /api/contact_item_types?sort=id,-name</code></p> <h2>Offset and Limit</h2> <p>Query results are always paged. Motion leverages the <code>offset</code> and <code>limit</code> parameters to facilitate this.</p> <p>When the neither of these parameters are explicitly supplied the handler will assume the a default <code>limit</code> of <code>100</code>.</p> <p><code>offset</code> is a number indicating the start position in the result set you want to return.</p> <p><code>limit</code> is a number indicating how many records past the start position you want returned.</p> <p>A call with a result set starting at <code>5</code> and returning no more than <code>25</code> records would look like this.</p> <p><code>GET /api/contact_item_types?offset=5&amp;limit=25</code></p> <p>If there were <code>50</code> records in total, the returned <code>Content-Range</code> header would look like this.</p> <p><code>Content-Range: 5-30/50</code></p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "get",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Gets a single ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -v -u {name}:{password}",
-        "type": "json"
-      }
-    ],
-    "name": "ShowContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "put",
-    "url": "/api/contact_item_types/{id}",
-    "title": "Update an existing ContactItemType",
-    "examples": [
-      {
-        "title": "Example usage:",
-        "content": "curl https://{domain}/api/contact_item_types/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT",
-        "type": "json"
-      }
-    ],
-    "name": "updateContactItemTypes",
-    "group": "ContactItemType",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
-    "version": "0.0.0",
-    "filename": "server/api/contactItemType/index.js",
-    "groupTitle": "ContactItemType"
-  },
-  {
-    "type": "post",
     "url": "/api/cm/custom_field",
     "title": "Create a new custom field",
     "examples": [
@@ -11420,9 +10980,9 @@
     "groupTitle": "Fax_Messages"
   },
   {
-    "type": "post",
-    "url": "/api/fax/messages",
-    "title": "Create message and send Fax",
+    "type": "put",
+    "url": "/api/fax/messages/{id}/reject",
+    "title": "Rejects message",
     "examples": [
       {
         "title": "Example usage:",
@@ -11432,15 +10992,15 @@
     ],
     "name": "rejectMessage",
     "group": "Fax_Messages",
-    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/faxMessage/index.js",
     "groupTitle": "Fax_Messages"
   },
   {
-    "type": "put",
-    "url": "/api/fax/messages/{id}/reject",
-    "title": "Rejects message",
+    "type": "post",
+    "url": "/api/fax/messages",
+    "title": "Create message and send Fax",
     "examples": [
       {
         "title": "Example usage:",
@@ -11450,7 +11010,7 @@
     ],
     "name": "rejectMessage",
     "group": "Fax_Messages",
-    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
     "filename": "server/api/faxMessage/index.js",
     "groupTitle": "Fax_Messages"
@@ -20836,6 +20396,24 @@
   },
   {
     "type": "get",
+    "url": "/api/realtime/agents",
+    "title": "Gets realtime agents info",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/realtime/agents -v -u {name}:{password}  -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "getAgents",
+    "group": "Realtime",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/realtime/index.js",
+    "groupTitle": "Realtime"
+  },
+  {
+    "type": "get",
     "url": "/api/realtime/queues",
     "title": "Gets realtime queues info",
     "examples": [
@@ -26455,7 +26033,7 @@
   },
   {
     "type": "get",
-    "url": "/api/system/process",
+    "url": "/api/system",
     "title": "Gets system information",
     "examples": [
       {
@@ -26473,7 +26051,7 @@
   },
   {
     "type": "get",
-    "url": "/api/system",
+    "url": "/api/system/process",
     "title": "Gets system information",
     "examples": [
       {
@@ -26772,12 +26350,12 @@
   },
   {
     "type": "delete",
-    "url": "/api/fax/queues/{id}/teams",
+    "url": "/api/openchannel/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/openchannel/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26785,17 +26363,17 @@
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/faxQueue/index.js",
+    "filename": "server/api/openchannelQueue/index.js",
     "groupTitle": "Teams"
   },
   {
     "type": "delete",
-    "url": "/api/openchannel/queues/{id}/teams",
+    "url": "/api/voice/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/openchannel/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26803,17 +26381,17 @@
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/openchannelQueue/index.js",
+    "filename": "server/api/voiceQueue/index.js",
     "groupTitle": "Teams"
   },
   {
     "type": "delete",
-    "url": "/api/voice/queues/{id}/teams",
-    "title": "Remove teams from a queue",
+    "url": "/api/voice/Prefixes/{id}/teams",
+    "title": "Remove teams from a voice prefix",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26821,7 +26399,7 @@
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/voiceQueue/index.js",
+    "filename": "server/api/voicePrefix/index.js",
     "groupTitle": "Teams"
   },
   {
@@ -26844,6 +26422,24 @@
   },
   {
     "type": "delete",
+    "url": "/api/whatsapp/queues/{id}/teams",
+    "title": "Remove teams from a queue",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/whatsapp/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "type": "json"
+      }
+    ],
+    "name": "RemoveTeams",
+    "group": "Teams",
+    "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/whatsappQueue/index.js",
+    "groupTitle": "Teams"
+  },
+  {
+    "type": "delete",
     "url": "/api/mail/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
@@ -26880,12 +26476,12 @@
   },
   {
     "type": "delete",
-    "url": "/api/whatsapp/queues/{id}/teams",
+    "url": "/api/fax/queues/{id}/teams",
     "title": "Remove teams from a queue",
     "examples": [
       {
         "title": "Example usage:",
-        "content": "curl https://{domain}/api/whatsapp/queues/{id}/teams -v -u {name}:{password} -X DELETE",
+        "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE",
         "type": "json"
       }
     ],
@@ -26893,7 +26489,7 @@
     "group": "Teams",
     "description": "<p>Motion will return a HTTP status code <code>204</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
     "version": "0.0.0",
-    "filename": "server/api/whatsappQueue/index.js",
+    "filename": "server/api/faxQueue/index.js",
     "groupTitle": "Teams"
   },
   {
@@ -31921,6 +31517,42 @@
   },
   {
     "type": "post",
+    "url": "/api/voice/prefixes/{id}/teams",
+    "title": "Add teams to voice prefix",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -d '{\"ids\": [1,2]}' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST",
+        "type": "json"
+      }
+    ],
+    "name": "AddTeams",
+    "group": "Voice_Prefix",
+    "description": "<p>Motion will return a HTTP status code <code>201</code> upon success.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/voicePrefix/index.js",
+    "groupTitle": "Voice_Prefix"
+  },
+  {
+    "type": "get",
+    "url": "/api/voice/prefixes/{id}/teams",
+    "title": "Gets voice prefix team",
+    "examples": [
+      {
+        "title": "Example usage:",
+        "content": "curl https://{domain}/api/voice/prefixes/{id}/teams -v -u {name}:{password}  -X GET",
+        "type": "json"
+      }
+    ],
+    "name": "GetTeams",
+    "group": "Voice_Prefix",
+    "description": "<p>Motion will return a HTTP status code <code>200</code> upon success. Motion return a HTTP status code <code>404</code> if the corresponding record could not be located.</p> <p>Motion renders the resulting JSON representation in the response body.</p>",
+    "version": "0.0.0",
+    "filename": "server/api/voicePrefix/index.js",
+    "groupTitle": "Voice_Prefix"
+  },
+  {
+    "type": "post",
     "url": "/api/voice/prefixes/{id}/users",
     "title": "Add agents to a prefix",
     "examples": [
@@ -33189,6 +32821,13 @@
             "optional": true,
             "field": "dialPredictiveIntervalMinThreshold",
             "description": ""
+          },
+          {
+            "group": "Body",
+            "type": "Boolean",
+            "optional": true,
+            "field": "dialPreviewAutoRecallMe",
+            "description": ""
           }
         ]
       }
diff --git a/apidoc/api_project.js b/apidoc/api_project.js
index ad9c6f3..75dccf7 100644
--- a/apidoc/api_project.js
+++ b/apidoc/api_project.js
@@ -1,6 +1,6 @@
 define({
   "name": "xCALLY Motion API",
-  "version": "2.5.33",
+  "version": "2.5.41",
   "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.",
   "title": "xCALLY MOTION API",
   "header": {
@@ -17,7 +17,7 @@ define({
   "apidoc": "0.3.0",
   "generator": {
     "name": "apidoc",
-    "time": "2021-12-22T08:21:09.698Z",
+    "time": "2021-12-22T15:46:55.589Z",
     "url": "http://apidocjs.com",
     "version": "0.24.0"
   }
diff --git a/apidoc/api_project.json b/apidoc/api_project.json
index 777309f..8688b9d 100644
--- a/apidoc/api_project.json
+++ b/apidoc/api_project.json
@@ -1,6 +1,6 @@
 {
   "name": "xCALLY Motion API",
-  "version": "2.5.33",
+  "version": "2.5.41",
   "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.",
   "title": "xCALLY MOTION API",
   "header": {
@@ -17,7 +17,7 @@
   "apidoc": "0.3.0",
   "generator": {
     "name": "apidoc",
-    "time": "2021-12-22T08:21:09.698Z",
+    "time": "2021-12-22T15:46:55.589Z",
     "url": "http://apidocjs.com",
     "version": "0.24.0"
   }
diff --git a/package.json b/package.json
index ec4914b..032f4db 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "motion",
-  "version": "2.5.33",
+  "version": "2.5.41",
   "description": "xCALLY Motion is the new Realtime asynchronous solution for your multichannel contact center over Asterisk.",
   "main": "server/app.js",
   "engines": {
@@ -29,13 +29,14 @@
     "Vito Macchia <[email-masked]>",
     "Marco Lecce <[email-masked]>",
     "Rodolfo Bevione <[email-masked]>",
-    "Andrea Amorese <[email-masked]>"
+    "Andrea Amorese <[email-masked]>",
+    "Valerio Cietto <[email-masked]>"
   ],
   "private": true,
   "license": "EULA",
   "scripts": {
     "start": "nodemon server/app.js",
-    "js-beautify": "js-beautify `node -p \"require('glob').sync('./**/*.{js,html}', { nodir: true, ignore: ['./node_modules/**', './client/bower_components/**', './bower_components/**', './client/assets/**', './snippet/**', './dist/**', './.tmp/**', './server/files/**'] }).join('\\n')\"`",
+    "js-beautify": "js-beautify `node -p \"require('glob').sync('./**/*.{js,html}', { nodir: true, ignore: ['./node_modules/**', './client/bower_components/**', './bower_components/**', './client/assets/**', './snippet/**', './dist/**', './.tmp/**'] }).join('\\n')\"`",
     "eslint:check": "eslint .",
     "eslint:fix": "eslint --fix .",
     "prettier:check": "prettier --check './**/*'",
@@ -44,12 +45,14 @@
     "test": "mocha server/test --timeout 5000"
   },
   "dependencies": {
+    "activedirectory2": "2.1.0",
     "apiai-promise": "github:gcareri/apiai-promise",
     "archiver": "2.1.1",
     "asterisk-manager": "0.1.16",
     "aws-sdk": "2.610.0",
     "bimedia-machine-uuid": "1.0.1",
     "bluebird": "3.7.2",
+    "html-entities": "2.3.2",
     "body-parser": "1.19.0",
     "compare-versions": "3.6.0",
     "composable-middleware": "0.3.0",
@@ -115,7 +118,7 @@
     "sequelize": "3.35.1",
     "serve-favicon": "2.5.0",
     "simple-git": "1.132.0",
-    "socket.io": "2.2.0",
+    "socket.io": "2.1.1",
     "socket.io-emitter": "3.1.1",
     "socket.io-redis": "5.2.0",
     "socketio-jwt": "4.5.0",
diff --git a/public/app/errors/404/i18n/hu.json b/public/app/errors/404/i18n/hu.json
new file mode 100644
index 0000000..b061703
--- /dev/null
+++ b/public/app/errors/404/i18n/hu.json
@@ -0,0 +1,8 @@
+{
+  "ERROR404": {
+    "CODE": "404",
+    "MESSAGE": "Sorry but we couldn’t find the page you are looking for",
+    "SEARCH": "Search for anything",
+    "GO_BACK": "Go back to dashboard"
+  }
+}
diff --git a/public/app/errors/500/i18n/hu.json b/public/app/errors/500/i18n/hu.json
new file mode 100644
index 0000000..b218b70
--- /dev/null
+++ b/public/app/errors/500/i18n/hu.json
@@ -0,0 +1,11 @@
+{
+  "ERROR500": {
+    "CODE": "500",
+    "MESSAGE": "Well, you broke the internet!",
+    "SUBMESSAGE": "Just kidding, looks like we have an internal issue, please try again in couple minutes",
+    "REPORT": "Report this problem",
+    "JIRA_MESSAGE": "Your request has been received and will be processed shortly.",
+    "JIRA_SUBMESSAGE": "Sorry for the inconvenience. If you have any questions or concerns, please do not hesitate to contact us.",
+    "GO_BACK": "Go back to dashboard"
+  }
+}
diff --git a/public/app/footer/i18n/hu.json b/public/app/footer/i18n/hu.json
new file mode 100644
index 0000000..8a47415
--- /dev/null
+++ b/public/app/footer/i18n/hu.json
@@ -0,0 +1,6 @@
+{
+  "FOOTER": {
+    "COOKIE_LAW": "We use cookies to give you the best experience. Read our <a target=\"_blank\" href=\"https://wiki.xcallymotion.com/display/XMV/Cookie+Policy\" class=\"blue-fg\">cookie policy</a>.",
+    "ERRORS": {}
+  }
+}
diff --git a/public/app/forgot/i18n/de.json b/public/app/forgot/i18n/de.json
index 53a27fb..5c4734e 100644
--- a/public/app/forgot/i18n/de.json
+++ b/public/app/forgot/i18n/de.json
@@ -1,15 +1,15 @@
 {
   "FORGOTPASSWORD": {
-    "TITLE": "Ihr Passwort wiederherstellen",
-    "EMAIL_ADRESS": "E-mail Adresse",
+    "TITLE": "Passwort wiederherstellen",
+    "EMAIL_ADRESS": "E-Mail Adresse",
     "SEND_RESET_LINK": "LINK ZUM ZURÜCKSETZEN SENDEN",
     "GO_BACK": "Zurück zum Login",
     "LINK_SENT": "Link gesendet",
-    "LINNK_SENT_MESSAGE": "Eine e-Mail mit einem Link zum Zurücksetzen des Kennworts wurde an Ihre Adresse gesendet!",
-    "PASSWORD_RESET_ERROR": "Passwort Fehler zurücksetzen",
+    "LINNK_SENT_MESSAGE": "Eine E-Mail mit einem Link zum Zurücksetzen des Passwortes wurde an Ihre Adresse gesendet.",
+    "PASSWORD_RESET_ERROR": "Fehler beim Zurücksetzen des Passwortes",
     "ERRORS": {
-      "EMAIL_REQUIRED": "Im Feld E-Mail ist erforderlich",
-      "EMAIL_MUST_VALID": "E-Mail muss eine gültige e-mail Adresse"
+      "EMAIL_REQUIRED": "Eingabe E-Mail Adresse erforderlich",
+      "EMAIL_MUST_VALID": "Es muss eine gültige E-Mail Adresse eingegeben werden"
     }
   }
 }
diff --git a/public/app/forgot/i18n/hu.json b/public/app/forgot/i18n/hu.json
new file mode 100644
index 0000000..be7b81a
--- /dev/null
+++ b/public/app/forgot/i18n/hu.json
@@ -0,0 +1,15 @@
+{
+  "FORGOTPASSWORD": {
+    "TITLE": "Recover your password",
+    "EMAIL_ADRESS": "Email address",
+    "SEND_RESET_LINK": "SEND RESET LINK",
+    "GO_BACK": "Go back to login",
+    "LINK_SENT": "Link Sent",
+    "LINNK_SENT_MESSAGE": "An email containing a link to reset your password has been sent to your address!",
+    "PASSWORD_RESET_ERROR": "Password Reset Error",
+    "ERRORS": {
+      "EMAIL_REQUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format"
+    }
+  }
+}
diff --git a/public/app/header/i18n/hu.json b/public/app/header/i18n/hu.json
new file mode 100644
index 0000000..f78785b
--- /dev/null
+++ b/public/app/header/i18n/hu.json
@@ -0,0 +1,6 @@
+{
+  "HEADER": {
+    "NEWS": "Please visit our <a target=\"_blank\" href=\"https://wiki.xcallymotion.com/display/XMV\" class=\"blue-100-fg\">Wiki</a> to discover the new cool features available on XCALLY.",
+    "ERRORS": {}
+  }
+}
diff --git a/public/app/login/i18n/de.json b/public/app/login/i18n/de.json
index c090dfa..bced170 100644
--- a/public/app/login/i18n/de.json
+++ b/public/app/login/i18n/de.json
@@ -1,16 +1,16 @@
 {
   "LOGIN": {
-    "TITLE": "Melden Sie sich bei Ihrem Konto an",
+    "TITLE": "Bitte mit Ihrem Konto anmelden",
     "EMAIL": "E-Mail",
     "PASSWORD": "Passwort",
-    "REMEMBER_ME": "Erinnere Dich an Mich",
+    "REMEMBER_ME": "Anmeldedaten merken",
     "FORGOT_PASSWORD": "Passwort vergessen?",
-    "LOG_IN": "LOG IN",
+    "LOG_IN": "ANMELDEN",
     "OR": "Oder",
-    "WITH_GOOGLE": "Melden Sie sich mit Google",
-    "WITH_FACEBOOK": "Mit Facebook anmelden",
+    "WITH_GOOGLE": "Anmeldung mit Google",
+    "WITH_FACEBOOK": "Anmeldung mit Facebook",
     "DONT_HAVE_ACCOUNT": "Sie haben noch kein Konto?",
-    "CREATE_ACCOUNT": "Erstellen Sie ein Konto",
+    "CREATE_ACCOUNT": "Konto erstellen",
     "ERRORS": {
       "EMAIL_REQUIRED": "Pflichtfeld",
       "EMAIL_MUST_VALID": "Falsches Format",
@@ -18,8 +18,8 @@
       "USERNAME_REQUIRED": "Pflichtfeld"
     },
     "USERNAME": "Benutzername",
-    "CANCEL": "Stornieren",
-    "SELECT": "Wählen",
+    "CANCEL": "Abbrechen",
+    "SELECT": "Auswählen",
     "TELEPHONES": "Telefone"
   }
 }
diff --git a/public/app/login/i18n/en.json b/public/app/login/i18n/en.json
index 8a25905..78f3f74 100644
--- a/public/app/login/i18n/en.json
+++ b/public/app/login/i18n/en.json
@@ -12,6 +12,7 @@
     "LOG_IN": "LOG IN",
     "OR": "OR",
     "WITH_GOOGLE": "Log in with Google",
+    "WITH_AD": "Log in with Active Directory",
     "WITH_FACEBOOK": "Log in with Facebook",
     "DONT_HAVE_ACCOUNT": "No account?",
     "CREATE_ACCOUNT": "Create an account",
diff --git a/public/app/login/i18n/hu.json b/public/app/login/i18n/hu.json
new file mode 100644
index 0000000..8a25905
--- /dev/null
+++ b/public/app/login/i18n/hu.json
@@ -0,0 +1,25 @@
+{
+  "LOGIN": {
+    "TELEPHONES": "Telephones",
+    "SELECT": "Select",
+    "CANCEL": "Cancel",
+    "TITLE": "Log in to your account",
+    "EMAIL": "Email",
+    "USERNAME": "Username",
+    "PASSWORD": "Password",
+    "REMEMBER_ME": "Remember Me",
+    "FORGOT_PASSWORD": "Forgot Password?",
+    "LOG_IN": "LOG IN",
+    "OR": "OR",
+    "WITH_GOOGLE": "Log in with Google",
+    "WITH_FACEBOOK": "Log in with Facebook",
+    "DONT_HAVE_ACCOUNT": "No account?",
+    "CREATE_ACCOUNT": "Create an account",
+    "ERRORS": {
+      "EMAIL_REQUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "USERNAME_REQUIRED": "Mandatory field"
+    }
+  }
+}
diff --git a/public/app/main/apps/analytics/i18n/de.json b/public/app/main/apps/analytics/i18n/de.json
index e60162b..e6b577a 100644
--- a/public/app/main/apps/analytics/i18n/de.json
+++ b/public/app/main/apps/analytics/i18n/de.json
@@ -13,7 +13,7 @@
       "METRIC_REQUIRED": "Pflichtfeld",
       "COLUMN_REQUIRED": "Pflichtfeld",
       "VALUE_REQUIRED": "Pflichtfeld",
-      "CUSTOM_METRIC_REQUIRED": "benutzerdefinierte Metrik (erforderlich)",
+      "CUSTOM_METRIC_REQUIRED": "Pflichtfeld",
       "ALIAS_REQUIRED": "Pflichtfeld"
     },
     "NEW_METRIC": "Neue Metrik",
@@ -23,8 +23,8 @@
     "SAVE": "Speichern",
     "BACK": "Zurück",
     "SELECTED": "Ausgewählte",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Keine auswählen",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
     "TYPE": "Typ",
     "EXTRACTEDREPORTS": "Extrahierte Berichte",
     "DATE_RANGE_FROM": "Datum von",
@@ -56,18 +56,18 @@
     "GENERAL": "Allgemein",
     "FIELDS": "Felder",
     "CONDITION": "Bedingung",
-    "OPERATOR": "Betreiber",
+    "OPERATOR": "Operator",
     "GROUP": "Gruppe",
     "COLUMN": "Spalte",
     "VALUE": "Wert",
     "PREVIEW": "Vorschau",
-    "LIMITED_RESULT": "BEGRENZTES ERGEBNIS",
+    "LIMITED_RESULT": "Ergebins begrenzt",
     "NO_DATA": "Keine Daten",
     "CONDITIONS": "Bedingungen",
     "ALIAS": "Alias",
     "FUNCTION": "Funktion",
     "GROUP_BY": "Gruppieren nach",
-    "ORDER_BY": "Bestellung von",
+    "ORDER_BY": "Sortieren nach",
     "ADD_REPORTFIELD": "Feld hinzufügen",
     "EDIT_REPORTFIELD": "Feld bearbeiten",
     "DELETE_REPORTFIELD": "Feld löschen",
@@ -75,12 +75,12 @@
     "NO_METRIC_FOUND": "Keine Metrik gefunden",
     "NO_AVAILABLE_INFO": "keine Informationen verfügbar",
     "CUSTOM_METRIC": "Benutzerdefinierte Metrik",
-    "DELETE_EXTRACTEDREPORT": "Löschen extrahierte Berichte",
+    "DELETE_EXTRACTEDREPORT": "Extrahierte Berichte löschen",
     "EDIT_EXTRACTEDREPORT": "Extrahierte Berichte bearbeiten",
-    "DOWNLOAD_EXTRACTEDREPORT": "Herunterladen extrahierte Berichte",
+    "DOWNLOAD_EXTRACTEDREPORT": "Extrahierte Berichte herunterladen",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
+    "OF": "von",
     "DELETE": "Löschen",
     "REPORTNAME": "Berichtsname",
     "SEND_IF_EMPTY": "Senden, wenn leer",
diff --git a/public/app/main/apps/analytics/i18n/hu.json b/public/app/main/apps/analytics/i18n/hu.json
new file mode 100644
index 0000000..71cf72f
--- /dev/null
+++ b/public/app/main/apps/analytics/i18n/hu.json
@@ -0,0 +1,89 @@
+{
+  "ANALYTICS": {
+    "SEND_IF_EMPTY": "Send if empty",
+    "REPORTNAME": "Report Name",
+    "DELETE": "Delete",
+    "NAME": "Name",
+    "ANALYTICS": "Analytics",
+    "METRICS": "Metrics",
+    "ID": "Id",
+    "TABLE": "Table",
+    "DESCRIPTION": "Description",
+    "SEARCH_FOR_ANYONE": "Search",
+    "METRIC": "Metric",
+    "ERRORS": {
+      "NAME_REQUIRED": "Mandatory field",
+      "METRIC_REQUIRED": "Mandatory field",
+      "COLUMN_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "CUSTOM_METRIC_REQUIRED": "Mandatory field",
+      "ALIAS_REQUIRED": "Mandatory field"
+    },
+    "NEW_METRIC": "New Metric",
+    "ADD_METRIC": "Add Metric",
+    "EDIT_METRIC": "Edit Metric",
+    "DELETE_METRIC": "Delete Metric",
+    "SAVE": "Save",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "TYPE": "Type",
+    "EXTRACTEDREPORTS": "Extracted Reports",
+    "DATE_RANGE_FROM": "Date Range From",
+    "DATE_RANGE_TO": "Date Range To",
+    "GENERATED_AT": "Generated At",
+    "STATUS": "Status",
+    "OUTPUT": "Output",
+    "REPORTS": "Reports",
+    "SEARCH_FOR_FOLDER": "Search for folder",
+    "CREATED_AT": "Created At",
+    "NEW_REPORT": "New Report",
+    "ADD_REPORT": "Add Report",
+    "COPY_REPORT": "Copy Report",
+    "PREVIEW_REPORT": "Preview Report",
+    "WEB_REPORT": "Web Report",
+    "RUN_REPORT": "Run Report",
+    "DOWNLOAD_JSON_REPORT": "Export Report JSON",
+    "EDIT_REPORT": "Edit Report",
+    "DELETE_REPORT": "Delete Report",
+    "CREATE": "Create Folder",
+    "RENAME": "Rename Folder",
+    "REMOVE": "Remove Folder",
+    "SELECT_NODE": "Select Folder",
+    "ERROR": "Error",
+    "QUERY_ERROR": "Query Error",
+    "MESSAGE": "Message",
+    "CLOSE": "Close",
+    "FORMAT": "Format",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "FIELDS": "Fields",
+    "CONDITION": "Condition",
+    "OPERATOR": "Operator",
+    "GROUP": "Group",
+    "COLUMN": "Column",
+    "VALUE": "Value",
+    "PREVIEW": "Preview",
+    "LIMITED_RESULT": "*Limited Results",
+    "NO_DATA": "No data results",
+    "CONDITIONS": "Conditions",
+    "ALIAS": "Alias",
+    "FUNCTION": "Function",
+    "GROUP_BY": "Group By",
+    "ORDER_BY": "Order By",
+    "ADD_REPORTFIELD": "Add Field",
+    "EDIT_REPORTFIELD": "Edit Field",
+    "DELETE_REPORTFIELD": "Delete Field",
+    "METRIC_NAME": "Metric",
+    "NO_METRIC_FOUND": "No metric found",
+    "NO_AVAILABLE_INFO": "No available info",
+    "CUSTOM_METRIC": "Custom Metric",
+    "DELETE_EXTRACTEDREPORT": "Delete Extracted Report",
+    "EDIT_EXTRACTEDREPORT": "Edit Extracted Report",
+    "DOWNLOAD_EXTRACTEDREPORT": "Download Extracted Report",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of"
+  }
+}
diff --git a/public/app/main/apps/callysquare/i18n/hu.json b/public/app/main/apps/callysquare/i18n/hu.json
new file mode 100644
index 0000000..1e523a8
--- /dev/null
+++ b/public/app/main/apps/callysquare/i18n/hu.json
@@ -0,0 +1,243 @@
+{
+  "CALLYSQUARE": {
+    "ACCOUNT_ID": "Account",
+    "ADDUSER_PROJECTS": "Add Users to Project",
+    "ADD_ODBC": "Add ODBC",
+    "ADD_PROJECT": "Add Project",
+    "ADD_VARIABLE": "Add Variable",
+    "AGENTS": "Agents",
+    "AGI": "AGI",
+    "ALL_USERS": "All Users",
+    "ANSWER": "Answer",
+    "APIKEY": "ApiKey",
+    "APPID": "App ID",
+    "APPLICATION": "Application",
+    "APPSECRET": "App Secret",
+    "ARGS": "Arguments",
+    "ATTACHMENT_NAME": "Attachment Name",
+    "ATTACHMENT_PATH": "Attachment Path",
+    "ATTACHMENT_TYPE": "Attachment Type",
+    "AUDIO": "Audio",
+    "AUDIOENCODING": "Audio Encoding",
+    "AWSLEX": "Amazon Lex",
+    "AWSPOLLY": "AWS Polly",
+    "AWS_ACCESS_KEY_ID": "Access Key ID",
+    "AWS_BOT_NAME": "Bot name",
+    "AWS_LEX_REGION": "Region",
+    "AWS_POLLY_REGION": "Region",
+    "AWS_POLLY_VOICE": "Voice",
+    "AWS_SECRET_ACCESS_KEY": "Secret Access Key",
+    "AWS_TEXT_TYPE": "Text type",
+    "BACK": "Back",
+    "BCC": "BCC",
+    "BEEP": "Beep",
+    "BODY": "Body",
+    "CALLBACK": "Callback",
+    "CALLBACK_PRIORITY": "Priority",
+    "CALLYSQUARE": "Cally Square",
+    "CC": "CC",
+    "CHOOSE_ATTACHMENT": "Choose Attachment",
+    "CLIENT_EMAIL": "Client Email",
+    "CLOSE": "Close",
+    "COMMAND": "Command",
+    "COMPUTEDVARIABLES": "Computed Variables Script Path",
+    "CONDITION": "Condition",
+    "CONTEXT": "Context",
+    "COPY": "Copy",
+    "COPY_PROJECT": "Copy Project",
+    "CREATED_AT": "Created At",
+    "CUSTOM_ACTION": "Custom Action",
+    "CUSTOM_ACTION_DATA": "Custom Action Data",
+    "CUSTOM_APP": "Custom Application",
+    "DATABASE": "Database",
+    "DELAY": "delay [min]",
+    "DELETE": "Delete",
+    "DELETE_ODBC": "Delete ODBC",
+    "DELETE_PROJECT": "Delete Project",
+    "DELETE_SQUARERECORDING": "Delete Square Recording",
+    "DESCRIPTION": "Description",
+    "DIAL": "Dial",
+    "DIALOGFLOW": "Dialogflow",
+    "DIALOGFLOWV2": "DialogflowV2",
+    "DIALOGFLOWV2_LANGUAGE": "Language",
+    "DIALOGFLOWV2_PROJECT_ID": "Project ID",
+    "DIALOGFLOW_LANGUAGE": "Language",
+    "DIGIT": "Max Digits",
+    "DIGITS": "Digits",
+    "DOWNLOAD_SQUARERECORDING": "Download Square Recording",
+    "DROP_TO_UPLOAD": "DROP TO UPLOAD",
+    "DROP_TO_UPLOAD_MESSAGE": "You can also drop files here to upload. Only XML - Max. 5MB",
+    "DSN": "DSN",
+    "EDIT": "Edit",
+    "EDIT_ODBC": "Edit ODBC",
+    "EDIT_PROJECT": "Edit Project",
+    "EDIT_SQUARERECORDING": "Edit Square Recording",
+    "EDIT_XML": "Edit XML",
+    "END": "End",
+    "ERRORS": {
+      "DSN_REQUIRED": "Mandatory field",
+      "FIELD_REQUIRED": "Mandatory field",
+      "NAME_REQUIRED": "Mandatory field",
+      "PROJECT_REQUIRED": "Mandatory field",
+      "URL_REQUIRED": "Mandatory field"
+    },
+    "ESCAPE_DIGITS": "Escape Digits",
+    "EXTEN": "Exten",
+    "EXTENSION": "Extension",
+    "EXT_DIAL": "External Dial",
+    "FILE": "Filename",
+    "FILENAME": "Filename",
+    "FILE_ID": "Audio",
+    "FINALLY": "Finally",
+    "FINDBY": "Find By",
+    "GETDIGITS": "Get Digits",
+    "GETSECRETDIGITS": "Get Secret Digits",
+    "GOAL": "Goal",
+    "GOALNAME": "Goal Name",
+    "GOOGLEASR": "GoogleASR",
+    "GOOGLE_ASR_LANGUAGE": "Language",
+    "GOOGLE_CLOUD_TTS": "Google Cloud TTS",
+    "GOOGLE_CLOUD_TTS_TEXT_TYPE": "Text Type",
+    "GOOGLE_TTS_LANGUAGE": "Language",
+    "GOSUB": "GoSub",
+    "GOTOC": "GoTo",
+    "GOTOIF": "GoToIf",
+    "GOTOIFTIME": "GoToIfTime",
+    "GO_TO_PROJECTS": "Go to projects",
+    "GRAMMAR": "Grammar",
+    "HANGUP": "Hangup",
+    "HEADERS": "Headers",
+    "HELP": {
+      "BCC": "You can add multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "CC": "You can add multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "DSN": "Example: DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion",
+      "MAILBOX": "mailbox@context",
+      "MAX_TEXT_TTS": "The maximum number of characters supported is 200",
+      "TO": "You can add multiple addresses separated by commas (e.g. [email-masked], [email-masked])"
+    },
+    "HIDDENDIGITSNUM": "Hiddden Digits Number",
+    "HIDDENDIGITSPOS": "hidden Digits Position",
+    "ID": "Id",
+    "IMPORT": "Import",
+    "IMPORT_XML": "Import XML",
+    "INTERVAL_ID": "Interval",
+    "INTKEY": "Interrupt Key",
+    "ISPEECHASR": "iSpeech ASR",
+    "ISPEECHTTS": "iSpeech Text-To-Speech",
+    "ISPEECH_ASR_LANGUAGE": "Language",
+    "ISPEECH_TTS_LANGUAGE": "Language",
+    "KEY": "Key",
+    "LABEL": "Label",
+    "LANGUAGECODE": "Language Code",
+    "LASTNAME": "Last Name",
+    "LIST_ID": "List",
+    "LOGIN": "Login",
+    "LOGOUT": "Logout",
+    "LUMENVOXASR": "Lumenvox ASR",
+    "LUMENVOXTTS": "Lumenvox Text-To-Speech",
+    "MACRO": "Macro",
+    "MAILBOX": "Mailbox",
+    "MATH": "Math",
+    "MAXDIGIT": "Maximum Digits",
+    "MENU": "Menu",
+    "METHOD": "Method",
+    "MINDIGIT": "Minimum Digits",
+    "MODEL": "Model",
+    "MRCPRECOG": "MRCPRecog",
+    "MRCPSYNTH": "MRCPSynth",
+    "NAME": "Name",
+    "NDAACTIVITY_TYPE": "Activity Type",
+    "NDAGENERATE_AUDIO": "Generate Audio File",
+    "NDASSISTANT_URL": "NDASSISTANT Url",
+    "NDAUTH_URL": "NDAUTH Url",
+    "NEW": "New",
+    "NEW_ODBC": "New ODBC connection",
+    "NEW_PROJECT": "New Project",
+    "NEW_VARIABLE": "New Variable",
+    "NOOP": "NoOp",
+    "NOTES": "Notes",
+    "NO_AVAILABLE_INFO": "No available info",
+    "NUMBER": "Number",
+    "ODBC": "ODBC",
+    "ODBC_ID": "ODBC Connection",
+    "OF": "of",
+    "OPEN": "Open",
+    "OPEN_NEW_WINDOW": "Open in a new window",
+    "OPEN_PROJECT": "Open Project",
+    "OPERATION": "Operation",
+    "OPTIONS": "Options",
+    "OPTS": "Options",
+    "OUTPUT": "Output",
+    "PAGE": "Page",
+    "PASSWORD": "Password",
+    "PAUSE": "Pause",
+    "PAUSE_ID": "Pause type",
+    "PERMISSIONADD_PROJECTS": "Add Users to Project",
+    "PHONE": "Phone",
+    "PLAYBACK": "Playback",
+    "POSITION": "Position",
+    "PRIORITY": "Priority",
+    "PRIVATE_KEY": "Private Key",
+    "PROJECT": "Project",
+    "PROJECTS": "Projects",
+    "PROJECT_ID": "Project",
+    "QUERY": "Query",
+    "QUEUE": "Queue",
+    "QUEUE_ID": "Queue",
+    "RAWBODY": "Body",
+    "RAWHEADERS": "Headers",
+    "RECORD": "Record",
+    "RECORDINGFORMAT": "Recording Format",
+    "RESPONSE": "Response Timeout",
+    "RESTAPI": "Rest API",
+    "RETRY": "Retries",
+    "ROWSPERPAGE": "Rows per page",
+    "SAVE": "Save",
+    "SAYDIGITS": "Say Digits",
+    "SAYNUMBER": "Say number",
+    "SAYPHONETIC": "Say Phonetics",
+    "SEARCH_FOR_ANYONE": "Search",
+    "SELECTED": "Selected",
+    "SELECTED_USERS": "Selected Users",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "SENDFAX": "Send Fax",
+    "SENDMAIL": "Send Email",
+    "SENDSMS": "Send SMS",
+    "SESTEKASR": "Sestek ASR",
+    "SESTEKNDA": "Sestek NDA",
+    "SESTEKTTS": "Sestek TTS",
+    "SET": "Set",
+    "SIP_ID": "SIP",
+    "SMS_ACCOUNT_ID": "Account",
+    "SMS_TEXT": "Text",
+    "SPEED": "Speed",
+    "SQUARERECORDINGS": "Recordings",
+    "SSMLGENDER": "Gender",
+    "START": "Start",
+    "SUBJECT": "Subject",
+    "SUBPROJECT": "Sub Project",
+    "SYSTEM": "System",
+    "TELEPHONES": "Telephones",
+    "TEMPLATE_ID": "Template",
+    "TEST_ODBC": "Test ODBC",
+    "TEXT": "Text",
+    "TILDEASR": "Tilde ASR",
+    "TIMEOUT": "Timeout",
+    "TO": "To",
+    "TRUNK_NAME": "Trunk",
+    "TTS": "Google Text-To-Speech",
+    "UNIQUEID": "Unique ID",
+    "UNPAUSE": "End Pause",
+    "UPDATE_DESCRIPTION": "Update Description",
+    "UPDATE_INFO": "Update Info",
+    "URI": "URI",
+    "URL": "URL",
+    "USERNAME": "Username",
+    "USERS": "Users",
+    "VARIABLE_ID": "Variable",
+    "VARIABLE_VALUE": "Value",
+    "VOICEMAIL": "Voicemail",
+    "VSWITCH": "Variable Switch"
+  }
+}
diff --git a/public/app/main/apps/chat/i18n/ar.json b/public/app/main/apps/chat/i18n/ar.json
index 9ff6d56..0eb2983 100644
--- a/public/app/main/apps/chat/i18n/ar.json
+++ b/public/app/main/apps/chat/i18n/ar.json
@@ -87,7 +87,8 @@
       "CLIENTEMAIL_REQUIRED": "حقل الزامي",
       "PRIVATEKEY_REQUIRED": "حقل الزامي",
       "PROJECTID_REQUIRED": "حقل الزامي",
-      "VIDAOOTOPIC_REQUIRED": "حقل الزامي"
+      "VIDAOOTOPIC_REQUIRED": "حقل الزامي",
+      "EMAIL_ACCOUNT_REQUIRED": "حقل الزامي"
     },
     "HELP": {
       "AGENTIDENTIFIER": "محدد هوية وكيل خدمه العملاء",
@@ -468,6 +469,21 @@
     "NOTE": "ملحوظة",
     "VIDAOOMETADATA": "البيانات الوصفية Vidaoo",
     "VIDAOONOTE": "ملاحظة فيداو",
-    "VIDAOOTOPIC": "موضوع فيداو"
+    "VIDAOOTOPIC": "موضوع فيداو",
+    "CHANNELID": "معرف القناة",
+    "EDIT_TVOX": "تحرير TVox",
+    "MOTIONTITLE": "عنوان الحركة",
+    "MOTIONURL": "عنوان URL للحركة",
+    "MOTIONURLONANSWER": "عنوان URL للحركة عند الإجابة",
+    "MOTIONURLONRING": "رابط الحركة على الحلقة",
+    "SERVICEID": "معرف الخدمة",
+    "SERVICENAME": "اسم الخدمة",
+    "TVOX": "TVox",
+    "TVOXIP": "عنوان IP TVox",
+    "TVOXLOGINURL": "رابط تسجيل الدخول إلى TVox REST",
+    "TVOXPASSWD": "كلمة مرور TVox",
+    "TVOXSESSIONURL": "عنوان REST الخاص بجلسة TVox",
+    "TVOXURL": "عنوان URL IP الخاص بـ TVox",
+    "TVOXUSERNAME": "اسم مستخدم TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/cs.json b/public/app/main/apps/chat/i18n/cs.json
index f8c1d39..74dd5f5 100644
--- a/public/app/main/apps/chat/i18n/cs.json
+++ b/public/app/main/apps/chat/i18n/cs.json
@@ -245,7 +245,8 @@
       "CLIENTEMAIL_REQUIRED": "Povinné pole",
       "PRIVATEKEY_REQUIRED": "Povinné pole",
       "PROJECTID_REQUIRED": "Povinné pole",
-      "VIDAOOTOPIC_REQUIRED": "Povinné pole"
+      "VIDAOOTOPIC_REQUIRED": "Povinné pole",
+      "EMAIL_ACCOUNT_REQUIRED": "Povinné pole"
     },
     "CM_FIELD": "Contact Manager Field",
     "CHATPROACTIVEACTIONS": "Proactive Actions",
@@ -468,6 +469,21 @@
     "NOTE": "Poznámka",
     "VIDAOOMETADATA": "Vidaoo metadata",
     "VIDAOONOTE": "Vidaoo Note",
-    "VIDAOOTOPIC": "Téma Vidaoo"
+    "VIDAOOTOPIC": "Téma Vidaoo",
+    "CHANNELID": "ID kanálu",
+    "EDIT_TVOX": "Upravit TVox",
+    "MOTIONTITLE": "Název pohybu",
+    "MOTIONURL": "Pohybová URL",
+    "MOTIONURLONANSWER": "Pohybovat URL při odpovědi",
+    "MOTIONURLONRING": "Pohybová URL na prstenu",
+    "SERVICEID": "ID služby",
+    "SERVICENAME": "Název služby",
+    "TVOX": "TVox",
+    "TVOXIP": "IP adresa TVox",
+    "TVOXLOGINURL": "TVox Přihlášení REST Url",
+    "TVOXPASSWD": "Heslo TVox",
+    "TVOXSESSIONURL": "Adresa URL REST TVox Session",
+    "TVOXURL": "IP adresa TVoxu",
+    "TVOXUSERNAME": "Uživatelské jméno TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/da.json b/public/app/main/apps/chat/i18n/da.json
index e83df14..cd377dd 100644
--- a/public/app/main/apps/chat/i18n/da.json
+++ b/public/app/main/apps/chat/i18n/da.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Obligatorisk felt",
       "PRIVATEKEY_REQUIRED": "Obligatorisk felt",
       "PROJECTID_REQUIRED": "Obligatorisk felt",
-      "VIDAOOTOPIC_REQUIRED": "Obligatorisk felt"
+      "VIDAOOTOPIC_REQUIRED": "Obligatorisk felt",
+      "EMAIL_ACCOUNT_REQUIRED": "Obligatorisk felt"
     },
     "CM_FIELD": "Kontakt Manager mark",
     "CHATPROACTIVEACTIONS": "Proaktive handlinger",
@@ -468,6 +469,21 @@
     "NOTE": "Bemærk",
     "VIDAOOMETADATA": "Vidaoo Metadata",
     "VIDAOONOTE": "Vidaoo-note",
-    "VIDAOOTOPIC": "Vidaoo Emne"
+    "VIDAOOTOPIC": "Vidaoo Emne",
+    "CHANNELID": "Kanal -id",
+    "EDIT_TVOX": "Rediger TVox",
+    "MOTIONTITLE": "Motion Titel",
+    "MOTIONURL": "Bevægelses -URL",
+    "MOTIONURLONANSWER": "Bevægelses -URL ved svar",
+    "MOTIONURLONRING": "Bevægelses -URL på ring",
+    "SERVICEID": "Service -id",
+    "SERVICENAME": "Servicenavn",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP -adresse",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "TVox -adgangskode",
+    "TVOXSESSIONURL": "TVox Session REST Url",
+    "TVOXURL": "TVox IP -URL",
+    "TVOXUSERNAME": "TVox brugernavn"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/de.json b/public/app/main/apps/chat/i18n/de.json
index 4bc9896..3de6aae 100644
--- a/public/app/main/apps/chat/i18n/de.json
+++ b/public/app/main/apps/chat/i18n/de.json
@@ -2,12 +2,12 @@
   "CHAT": {
     "AMAZONLEX": "Amazon Lex",
     "TEXT": "Text",
-    "TIMES": "Anzahl von Malen pro Interaktion",
+    "TIMES": "Anzahl der Zeiten pro Interaktion",
     "EDIT_AUTOREPLY": "Automatische Antwort bearbeiten",
     "AUTOREPLY": "Automatische Antwort",
-    "NEW_CHATDISPOSITION": "Neue Chat-Disposition",
+    "NEW_CHATDISPOSITION": "Neue Chat-Qualifizierung",
     "ENABLECUSTOMERATTACHMENT": "Kundenanhänge aktivieren",
-    "OFFLINE_CHAT_BUTTON": "Offline-Chat-Taste",
+    "OFFLINE_CHAT_BUTTON": "Button Chat offline",
     "OFFLINESTATUS": "Offline Status",
     "NAME": "Name",
     "CHATQUEUES": "Chat-Warteschlangen",
@@ -15,29 +15,29 @@
     "STRATEGY": "Strategie",
     "AGENT_TIMEOUT": "Agent Timeout",
     "DESCRIPTION": "Beschreibung",
-    "KEY": "Key",
+    "KEY": "Schlüssel",
     "ALIAS": "Alias-Name",
     "VARIABLE": "Variable",
     "INTERVAL": "Intervall",
-    "EDIT_CLOSE": "Bearbeiten Schließen",
+    "EDIT_CLOSE": "Bearbeitung abschließen",
     "TIMEZONE": "Zeitzone",
     "MESSAGE": "Nachricht",
     "ADVANCED": "Erweitert",
     "FORWARDTRANSCRIPT": "Transkript weiterleiten",
     "FORWARDTRANSCRIPTMESSAGE": "Transkript-Nachricht weiterleiten",
-    "SKIPMESSAGEBUTTON": "Nachrichtentaste überspringen",
+    "SKIPMESSAGEBUTTON": "Nachrichtenbutton überspringen",
     "EDIT_MESSAGE": "Nachricht bearbeiten",
-    "CONDITION_AGREEMENT": "Bedingungsvereinbarung",
-    "NONE": "Keine",
+    "CONDITION_AGREEMENT": "Konditionelle Vereinbarung",
+    "NONE": "Nichts",
     "PRIORITY": "Priorität",
     "ONLINESTATUS": "Online Status",
-    "UNMANAGEDSTATUS": "Nicht verwalteter Status",
+    "UNMANAGEDSTATUS": "Status nicht bearbeitet",
     "AUTOCLOSE": "Automatisches Schließen aktivieren",
-    "ENABLEUNMANAGEDNOTE": "Nicht verwaltete Nachricht aktivieren",
-    "UNMANAGEDMESSAGE": "Nachricht",
+    "ENABLEUNMANAGEDNOTE": "Unbearbeitete Nachricht aktivieren",
+    "UNMANAGEDMESSAGE": "Unbearbeitete Nachricht",
     "SKIPUNMANAGED": "Nachricht überspringen",
     "SENDUNMANAGED": "Nachricht senden",
-    "WEBSITESCRIPT": "Website-Script",
+    "WEBSITESCRIPT": "Webseiten-Skript",
     "DELETE_OFFLINEMESSAGE": "Löschen",
     "OFFLINEMESSAGES": "Offline Nachrichten",
     "FORWARD_OFFLINE": "Offline weiterleiten",
@@ -45,25 +45,25 @@
     "FORWARD_OFFLINE_ADDRESS": "Offline-Adresse weiterleiten",
     "CLOSINGFORM": "Formular schließen",
     "ENABLERATING": "Bewertung aktivieren",
-    "ENABLECUSTOMERWRITING": "Dem Kunden \"schreiben\" erlauben, bevor der Agent akzeptiert",
+    "ENABLECUSTOMERWRITING": "Kunde kann schreiben, bevor Chat akzeptiert wird",
     "ENABLEFEEDBACK": "Feedback aktivieren",
     "RATINGTYPE": "Bewertungstyp",
-    "CLOSINGMESSAGE": "Nachricht schließen",
-    "CLOSINGMESSAGEBUTTON": "Nachrichtentaste schließen",
+    "CLOSINGMESSAGE": "Abschluss Nachricht",
+    "CLOSINGMESSAGEBUTTON": "Button für Abschluss Nachricht",
     "RATINGSTARSNUMBER": "Anzahl der Bewertungssterne",
     "EDIT_GOTOIF": "GotoIf bearbeiten",
     "CONDITION": "Bedingung",
-    "TRUEPRIORITY": "Echte Priorität",
+    "TRUEPRIORITY": "Wahre Priorität",
     "FALSEPRIORITY": "Falsche Priorität",
     "VALUE": "Wert",
     "WEBSITEALIAS": "Website-Alias",
     "ERRORS": {
       "TEXT_REQUIRED": "Pflichtfeld",
       "SENDUNMANAGED_REQUIRED": "Pflichtfeld",
-      "SENDUNMANAGED_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "SKIPUNMANAGED_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{{{max}} haben",
-      "UNMANAGEDMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{{{max}} haben",
-      "WEBSITEALIAS_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{{{max}} haben",
+      "SENDUNMANAGED_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "SKIPUNMANAGED_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "UNMANAGEDMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "WEBSITEALIAS_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "AGENT_REQUIRED": "Pflichtfeld",
       "QUEUE_REQUIRED": "Pflichtfeld",
       "CONDITION_REQUIRED": "Pflichtfeld",
@@ -84,56 +84,56 @@
       "TIMEOUT_REQUIRED": "Pflichtfeld",
       "REJECTURL_MUST_VALID_URL": "Falsches Format",
       "CLOSEURL_MUST_VALID_URL": "Falsches Format",
-      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "POLLING_INTERVAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "POLLING_INTERVAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "WAITINGMESSAGE_REQUIRED": "Pflichtfeld",
       "WAITINGTITLE_REQUIRED": "Pflichtfeld",
-      "KEY_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
+      "KEY_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "KEY_REQUIRED": "Pflichtfeld",
-      "WAITINGMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "WAITINGTITLE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "RATINGSTARSNUMBER_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "HEADER_OFFLINE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "OFFLINE_CHAT_BUTTON_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "CLOSINGQUESTION_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "TEXT_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
+      "WAITINGMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "WAITINGTITLE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "RATINGSTARSNUMBER_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "HEADER_OFFLINE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "OFFLINE_CHAT_BUTTON_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "CLOSINGQUESTION_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "TEXT_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "VALUE_REQUIRED": "Pflichtfeld",
-      "OFFLINEMESSAGESUBJECT_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "OFFLINEMESSAGEBODY_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "PLACEHOLDERMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "NOTETITLE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "FORMSUBMITSUCCESSMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "FORMSUBMITFAILUREMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
-      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
+      "OFFLINEMESSAGESUBJECT_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "OFFLINEMESSAGEBODY_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "PLACEHOLDERMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "NOTETITLE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "FORMSUBMITSUCCESSMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "FORMSUBMITFAILUREMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
+      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "FONTSIZE_REQUIRED": "Pflichtfeld",
       "COMMAND_REQUIRED": "Pflichtfeld",
-      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "NAME_MUST_VALID_PATTERN": "Falsches Format",
-      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Pflichtfeld",
-      "VERTICALPOSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "VERTICALPOSITION_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "VERTICALPOSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "VERTICALPOSITION_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "VERTICALPOSITION_REQUIRED": "Pflichtfeld",
-      "CUSTOMERALIAS_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
+      "CUSTOMERALIAS_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "TAG_REQUIRED": "Pflichtfeld",
-      "MESSAGEFONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "MESSAGEFONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "MESSAGEFONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "MESSAGEFONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "MESSAGEFONTSIZE_REQUIRED": "Pflichtfeld",
       "AGENTALIAS_REQUIRED": "Pflichtfeld",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "AGENTTRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
       "CUSTOMERALIAS_REQUIRED": "Pflichtfeld",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "QUEUETRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
-      "SYSTEMALIAS_MAX_LENGTH": "Der Wert muss eine maximale Länge gleich {{max}} haben",
+      "SYSTEMALIAS_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "SYSTEMALIAS_REQUIRED": "Pflichtfeld",
       "ACCESSKEYID_REQUIRED": "Pflichtfeld",
       "BOTNAME_REQUIRED": "Pflichtfeld",
@@ -143,20 +143,21 @@
       "CLIENTEMAIL_REQUIRED": "Pflichtfeld",
       "PRIVATEKEY_REQUIRED": "Pflichtfeld",
       "PROJECTID_REQUIRED": "Pflichtfeld",
-      "VIDAOOTOPIC_REQUIRED": "Pflichtfeld"
+      "VIDAOOTOPIC_REQUIRED": "Pflichtfeld",
+      "EMAIL_ACCOUNT_REQUIRED": "Pflichtfeld"
     },
-    "CM_FIELD": "Kontakt Manager Feld",
-    "CHATPROACTIVEACTIONS": "Proaktive Aktionen",
-    "NEW_CHATPROACTIVEACTION": "Neue proaktive Aktion",
-    "EDIT_CHATPROACTIVEACTION": "Proaktive Aktion bearbeiten",
-    "DELETE_CHATPROACTIVEACTION": "Proaktive Aktion löschen",
-    "ADD_CHATPROACTIVEACTION": "Proaktive Aktion hinzufügen",
-    "NO_CHATPROACTIVEACTION_AVAILABLE": "Keine proaktiven Aktionen verfügbar",
+    "CM_FIELD": "Kontaktmanager-Feld",
+    "CHATPROACTIVEACTIONS": "Proaktive Anfragen",
+    "NEW_CHATPROACTIVEACTION": "Neue proaktive Anfrage",
+    "EDIT_CHATPROACTIVEACTION": "Proaktive Anfrage bearbeiten",
+    "DELETE_CHATPROACTIVEACTION": "Proaktive Anfrage löschen",
+    "ADD_CHATPROACTIVEACTION": "Proaktive Anfrage hinzufügen",
+    "NO_CHATPROACTIVEACTION_AVAILABLE": "Keine proaktiven Anfragen verfügbar",
     "NO_OFFLINEMESSAGE_AVAILABLE": "Keine Offline-Nachrichten verfügbar",
-    "MOUSEOVER": "Maus über",
+    "MOUSEOVER": "Mouse-Over",
     "TIMEOUT": "Timeout",
     "TYPE": "Typ",
-    "SELECTOR": "Wählschalter",
+    "SELECTOR": "Selektion",
     "AGENT": "Agent",
     "GOTO": "Goto",
     "GOTOIF": "GotoIf",
@@ -164,7 +165,7 @@
     "QUEUE": "Warteschlange",
     "BUILDER": "Builder",
     "PREVIEW": "Vorschau",
-    "EDIT_AGENT": "Agent bearbeiten",
+    "EDIT_AGENT": "Agenten bearbeiten",
     "EDIT_QUEUE": "Warteschlange bearbeiten",
     "EDIT_GOTO": "Goto bearbeiten",
     "EDIT_GOTOIf": "GotoIf bearbeiten",
@@ -186,18 +187,18 @@
     "LIST": "Liste",
     "SNIPPET": "Snippet",
     "FORMS": "Formulare",
-    "UP": "Bis",
-    "DOWN": "Unten",
-    "COLLAPSE": "Zusammenklappen",
-    "PROACTIVEACTIONS": "Proaktive Aktionen",
-    "DISPOSITIONS": "Dispositionen",
+    "UP": "Nach Oben",
+    "DOWN": "Nach Unten",
+    "COLLAPSE": "Einklappen",
+    "PROACTIVEACTIONS": "Proaktive Anfragen",
+    "DISPOSITIONS": "Qualifizierungen",
     "WEBHOOKS": "WebHooks",
     "ACTIONS": "Aktionen",
     "FIDELITY": "Treue",
-    "APPEARANCE": "Aussehen",
+    "APPEARANCE": "Darstellung",
     "MAINCOLOR": "Hauptfarbe",
     "FOCUSCOLOR": "Fokusfarbe",
-    "BUTTONCOLOR": "Tastenfarbe",
+    "BUTTONCOLOR": "Buttonfarbe",
     "HEADERSHAPE": "Kopfzeilenform",
     "ANIMATION": "Animation",
     "DEFAULT": "Standard",
@@ -210,65 +211,65 @@
     "LABELS": "Labels",
     "HEADER_ONLINE": "Online-Kopfzeile",
     "ONLINE_MESSAGE": "Online Nachricht",
-    "NAME_TITLE": "Name Eingabebezeichnung",
-    "USERNAME_PLACEHOLDER": "Benutzername Eingabe Platzhalter",
-    "EMAIL_TITLE": "E-Mail-Eingabe Label",
-    "EMAIL_PLACEHOLDER": "Platzhalter für E-Mail-Eingabe",
-    "START_CHAT_BUTTON": "'Chat starten' Taste",
-    "AGENTS_BUSY": "Meldung für besetzte Agenten",
+    "NAME_TITLE": "Name Titel",
+    "USERNAME_PLACEHOLDER": "Platzhalter für Nutzernamen",
+    "EMAIL_TITLE": "E-Mail Titel",
+    "EMAIL_PLACEHOLDER": "Platzhalter für E-Mail Adresse",
+    "START_CHAT_BUTTON": "'Chat starten' Button",
+    "AGENTS_BUSY": "Agenten besetzt",
     "HEADER_OFFLINE": "Offline-Kopfzeile",
     "OFFLINE_MESSAGE": "Offline Nachricht",
-    "MESSAGE_TITLE": "Nachrichtenbezeichnung",
-    "ENQUIRY_MESSAGE_PLACEHOLDER": "Platzhalter für die Eingabe von Anfragenachrichten",
-    "ENQUIRY_BUTTON": "Anfrage-Taste Text",
+    "MESSAGE_TITLE": "Nachricht Titel",
+    "ENQUIRY_MESSAGE_PLACEHOLDER": "Platzhalter für Nachrichteneingabe",
+    "ENQUIRY_BUTTON": "Anfrage-Button",
     "RATING_MESSAGE": "Bewertungsnachricht",
-    "RATING_SEND": "Bewertung Senden Tasten-Text",
-    "RATING_SKIP": "Bewertung Überspringen Tasten-Text",
+    "RATING_SEND": "Button Bewertung senden",
+    "RATING_SKIP": "Button Bewertung überspringen",
     "ONLINE": "Online",
     "OFFLINE": "Offline",
-    "PROACTIVE": "Proaktive",
+    "PROACTIVE": "Proaktiv",
     "ACCEPT": "Akzeptieren",
-    "ACCEPTMETHOD": "Methode",
+    "ACCEPTMETHOD": "Methode akzeptieren",
     "ACCEPTURL": "URL akzeptieren",
     "REJECT": "Ablehnen",
     "REJECTMETHOD": "Methode ablehnen",
     "REJECTURL": "URL ablehnen",
-    "CLOSE": "Schliessen",
+    "CLOSE": "Schließen",
     "CLOSEMETHOD": "Methode schließen",
     "CLOSEURL": "URL schließen",
-    "EMBEDDING": "Einbettung",
+    "EMBEDDING": "Einbetten",
     "GENERAL": "Allgemein",
     "SELECTED": "Ausgewählte",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
     "BACK": "Zurück",
     "HELP": {
-      "MAPKEY": "Das folgende Motion Contact Manager-Feld:",
-      "FROMKEY": "Wird in Ihrem Motion Chat-Snippet wie folgt zugeordnet:",
-      "TOKEN": "Automatisch generiertes Token, das im Skript verwendet wird",
+      "MAPKEY": "Das folgende Feld aus dem Kontaktmanager:",
+      "FROMKEY": "wird in dem Chat-Snippet wie folgt zugeordnet:",
+      "TOKEN": "Automatisch generierter Token zur Verwendung im Skript",
       "COPYSCRIPTTOCLIPBOARD": "Kopieren Sie den Skripttext und fügen Sie ihn in Ihre Website ein",
       "FORWARD_OFFLINE": "Sie können mehrere durch Kommas getrennte Adressen hinzufügen (z. B. [email-masked], [email-masked])",
       "MOTIONADDRESS": "Das Feld muss das folgende Format haben: ≪protocol>://<IP-Adresse>[:<port>]. Beispiel: https://X.Y.Z.W",
       "MOTIONPROXY": "Das Feld muss das folgende Format haben: ≪Protocol>:// ≪IP-Adresse>: ≪port>]. Beispiel: https://X.Y.Z.W",
       "NAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
-      "LIST": "Contact Manager-Liste, die zum Zuordnen von Kontakten verwendet wird",
+      "LIST": "Liste für die Zuordnung aus dem Kontaktmanager",
       "KEY": "Website-Kurzname (5 Zeichen), der auf der Registerkarte \"Agent\" angezeigt wird",
-      "INTEVAL": "Wird aus der Liste der verfügbaren Intervalle ausgewählt",
-      "TIMEZONE": "Wählen Sie eine aus der Liste aus (Standard = lokale Zeitzone)",
-      "ENABLERATING": "Aktivieren Sie es, wenn Sie möchten, dass der Webbesucher die Interaktion am Ende bewerten kann",
-      "ENABLEFEEDBACK": "Aktivieren Sie es, wenn Sie möchten, dass der Webbesucher am Ende ein Feedback (bis zu 150 Zeichen) senden kann",
-      "FORWARDTRANSCRIPT": "Aktivieren Sie diese Option, wenn der Webbesucher aufgefordert wird, ein Chat-Protokoll per E-Mail zu erhalten",
-      "AUTOCLOSE": "Aktivieren Sie diese Option, wenn Chat-Sitzungen als nicht verwaltet geschlossen werden sollen, wenn kein Agent verfügbar ist. Weitere Informationen finden Sie unter: https://wiki.xcallymotion.com/display/XMV/Chat+Websites#ChatWebsites-Snippet",
-      "ENABLEUNMANAGEDNOTE": "Aktivieren Sie diese Option, wenn dem Besucher eine Nachricht angezeigt werden soll, wenn alle Agenten besetzt sind und der Chat nicht mehr verwaltet wird",
-      "ENABLECUSTOMERWRITING": "Aktivieren Sie es, wenn der Chat gestartet werden soll, ohne auf einen verfügbaren Agenten zu warten (Achtung: Wenn Sie ihn aktivieren, werden Ihre Chats niemals nicht verwaltet). Weitere Informationen finden Sie unter: https://wiki.xcallymotion.com/display/XMV/ Chat + Websites # ChatWebsites-Snippet ",
-      "INTERVAL": "Wählen Sie eins aus der Liste aus",
+      "INTEVAL": "Wählen aus der Liste der verfügbaren Intervalle",
+      "TIMEZONE": "Zeitzone auswählen (Standard = lokale Zeitzone)",
+      "ENABLERATING": "Bewertung nach Chat durch Kunden aktivieren",
+      "ENABLEFEEDBACK": "Feedback nach Chat durch Kunden aktivieren (Max. 150 Zeichen)",
+      "FORWARDTRANSCRIPT": "Chatprotokoll nach Abschluss per E-Mail senden",
+      "AUTOCLOSE": "Aktivieren Sie diese Option, wenn Chat-Sitzungen als nicht bearbeitet geschlossen werden sollen, sofern kein Agent verfügbar ist.",
+      "ENABLEUNMANAGEDNOTE": "Automatische Nachricht an den Kunden, wenn alle Agenten besetzt sind und somit der Chat nicht verfügbar ist",
+      "ENABLECUSTOMERWRITING": "Legt fest, ob der Kunde bereits im Chat schreiben kann, bevor ein Agent den Chat entgegen nimmmt. Hinweis: Dadurch kein Status \"unbearbeitet\"",
+      "INTERVAL": "Bitte aus der Liste wählen",
       "HIDEWHENOFFLINE": "Snippet ausblenden, wenn offline",
-      "AGENTIDENTIFIER": "Repräsentiert die Agentenkennung innerhalb der Chat-Sitzung im Snippet",
+      "AGENTIDENTIFIER": "Agentenkennung innerhalb der Chat-Sitzung im Snippet",
       "WEBSITEALIAS": "Ein Präfix, mit dem der Agentenname (Präfix + Agenten-ID) erstellt wird, der dem Webbesucher während der Chat-Sitzung angezeigt wird",
-      "VERTICALPOSITION": "Stellt den Abstand in Prozent von oben dar",
-      "WELCOMEMESSAGE": "Lassen Sie das Feld leer, wenn Sie keine Willkommensnachricht senden möchten",
-      "MANDATORYDISPOSITION": "Obligatorische Disposition",
-      "MANDATORYDISPOSITIONPAUSEID": "Pausieren Sie die Verwendung, wenn die obligatorische Disposition aktiviert ist"
+      "VERTICALPOSITION": "Prozentualer Abstand in Prozent vom oberen Bildschirmrand",
+      "WELCOMEMESSAGE": "Leer lassen, um keine Nachricht zu senden",
+      "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+      "MANDATORYDISPOSITIONPAUSEID": "PausenID bei erforderlicher Qualifizierung"
     },
     "ADDRESS": "Adresse",
     "ONLINESTATE": "Online Status",
@@ -276,88 +277,88 @@
     "RATINGSTATE": "Bewertungsstatus",
     "ENQUIRY": "Anfrage",
     "OFFLINETEMPLATE": "Offline Vorlage",
-    "CHATDISPOSITIONS": "Chat-Dispositionen",
-    "NO_CHATDISPOSITION_AVAILABLE": "Keine Chat-Dispositionen verfügbar",
-    "ADD_CHATDISPOSITION": "Chat Disposition hinzufügen",
+    "CHATDISPOSITIONS": "Chat-Qualifizierungen",
+    "NO_CHATDISPOSITION_AVAILABLE": "Keine Qualifizierung verfügbar",
+    "ADD_CHATDISPOSITION": "Qualifizierung hinzufügen",
     "DELETE": "Löschen",
-    "EDIT_CHATDISPOSITION": "Chat-Disposition bearbeiten",
-    "DELETE_CHATDISPOSITION": "Chat-Disposition löschen",
+    "EDIT_CHATDISPOSITION": "Qualifizierung bearbeiten",
+    "DELETE_CHATDISPOSITION": "Qualifizierung löschen",
     "CHAT": "Chat",
     "ID": "ID",
     "NEW_CHATQUEUE": "Neue Chat-Warteschlange",
     "NEW_CHATWEBSITE": "Neue Chat-Website",
-    "ROUNDED": "Abgerundet",
-    "SQUARED": "Quadratisch",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
+    "ROUNDED": "Rundes Design",
+    "SQUARED": "Eckiges Design",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
     "ALL_TEAMS": "Alle Teams",
     "SELECTED_TEAMS": "Ausgewählte Teams",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
+    "OF": "von",
     "CONTACT": "Kontakt",
     "STARTEDAT": "Gestartet am",
     "STATUS": "Status",
     "CLOSED": "Geschlossen",
-    "OPENED": "Öffnen",
-    "OPEN": "Öffnen",
+    "OPENED": "Geöffnet",
+    "OPEN": "Offen",
     "ACCOUNT": "Konto",
     "INTERACTION": "Interaktion",
     "INTERACTIONS": "Interaktionen",
     "WEBSITE": "Website",
-    "ALL": "Alle",
-    "SELECT_STATUS": "Wählen Sie einen Status",
+    "ALL": "Alles",
+    "SELECT_STATUS": "Status auswählen",
     "FILTER": "Filter",
     "FILTERS": "Filter",
     "TEAMADD_CHATQUEUE": "Team zur Chat-Warteschlange hinzufügen",
-    "AGENTADD_CHATQUEUE": "Agent zur Chat-Warteschlange hinzufügen",
+    "AGENTADD_CHATQUEUE": "Agenten zur Chat-Warteschlange hinzufügen",
     "ALL_AGENTS": "Alle Agenten",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
     "CLOSEDAT": "Geschlossen am",
-    "DISPOSITION": "Disposition",
+    "DISPOSITION": "Qualifizierung",
     "CREATEDAT": "Erstellt am",
     "NOTES": "Notizen",
     "NO_INTERACTION_AVAILABLE": "Keine Interaktionen verfügbar",
-    "SELECTED_WEBSITE": "Wählen Sie eine Website",
+    "SELECTED_WEBSITE": "Ausgewählte Webseite",
     "GOTOP": "Gotop",
     "EDIT_GOTOP": "Gotop bearbeiten",
-    "SELECT_WEBSITE": "Wählen Sie eine Website",
+    "SELECT_WEBSITE": "Webseite auswählen",
     "INFO": "Info",
     "OFFLINEMESSAGES_CHATWEBSITE": "Zu Offline-Nachrichten gehen",
-    "WAITINGTITLE": "Wartetitel",
-    "WAITINGMESSAGE": "Wartende Nachricht",
+    "WAITINGTITLE": "Titel während Warten",
+    "WAITINGMESSAGE": "Wartenachricht",
     "RATING": "Bewertung",
     "NO_RATINGVALUE": "Keine Bewertung",
-    "AGENTSADD_QUEUE": "Agent zur Chat-Warteschlange hinzufügen",
+    "AGENTSADD_QUEUE": "Agenten zur Chat-Warteschlange hinzufügen",
     "QUEUES": "Warteschlangen",
     "LOGGED_IN": "Angemeldet",
-    "PAUSED": "Pausiert",
+    "PAUSED": "in Pause",
     "READY": "Bereit",
-    "WAITING": "Warten",
-    "WRITING": "Schreiben",
+    "WAITING": "Wartezustand",
+    "WRITING": "am Schreiben",
     "MAIL": "E-Mail",
     "SMS": "SMS",
-    "OPENCHANNEL": "Openchannel",
+    "OPENCHANNEL": "Offener Kanal",
     "FAX": "Fax",
     "PAUSE": "Pause",
     "REALTIME": "Echtzeit",
     "AGENTS": "Agenten",
     "FULLNAME": "Vollständiger Name",
-    "INTERNAL": "Interne",
+    "INTERNAL": "Intern",
     "PHONE_STATE": "Telefonstatus",
     "PHONE_STATUS": "Telefonstatus",
     "LOGOUT": "Abmelden",
     "UNPAUSE": "Pause beenden",
-    "AGENTADD_QUEUE": "Agent zur Chat-Warteschlange hinzufügen",
+    "AGENTADD_QUEUE": "Agenten zur Chat-Warteschlange hinzufügen",
     "DEFAULT_PAUSE": "Standard Pause",
     "UNKNOWN": "Unbekannt",
-    "UNREGISTERED": "Unregistrierte",
+    "UNREGISTERED": "Nicht registriert",
     "UNAVAILABLE": "Nicht verfügbar",
     "NOT_INUSE": "Nicht in Verwendung",
     "REACHABLE": "Erreichbar",
-    "IN_USE": "Im Einsatz",
-    "VOICE": "Sprache",
+    "IN_USE": "In Verwendung",
+    "VOICE": "Anrufe",
     "NO_AGENT_ONLINE": "Kein Agent Online",
-    "GOTOREALTIME_CHATQUEUE": "Go to Echtzeit-Chat-Warteschlange",
+    "GOTOREALTIME_CHATQUEUE": "Zur Echtzeit-Warteschlange für Chat gehen",
     "PARTIALPAUSE": "Teilpause",
     "BUSY": "Besetzt",
     "TIMER": "Timer",
@@ -365,39 +366,39 @@
     "CAPACITY": "Kapazität",
     "TAGS": "Tags",
     "SHOWAGENTAVATAR": "Persönlichen Agenten-Avatar anzeigen",
-    "AGENTAVATAR": "Agent Avatar",
-    "SPYINTERACTION": "Spion",
+    "AGENTAVATAR": "Agenten-Avatar",
+    "SPYINTERACTION": "Mitlesen",
     "INTERACTIONS_CHATWEBSITE": "Zu den Interaktionen gehen",
     "REFRESH_INTERACTIONS": "Interaktionen aktualisieren",
-    "CLOSINGQUESTION": "Frage schließen",
+    "CLOSINGQUESTION": "Abschlussfrage",
     "WEBSCRIPT": "Webskript",
-    "NO_CHATCANNEDANSWER_AVAILABLE": "Keine vordefinierten Antworten verfügbar",
-    "NEW_CHATCANNEDANSWER": "Neue vordefinierte Antwort",
-    "ADD_CHATCANNEDANSWER": "Vordefinierte Antwort hinzufügen",
-    "EDIT_CHATCANNEDANSWER": "Vordefinierte Antwort bearbeiten",
-    "DELETE_CHATCANNEDANSWER": "Vordefinierte Antwort löschen",
-    "OFFLINEMESSAGESUBJECT": "Betreff der Nachricht",
-    "OFFLINEMESSAGEBODY": "Nachrichtentext",
-    "FORMSUBMITSUCCESSMESSAGE": "Erfolgsmeldung beim Absenden des Formulars",
-    "FORMSUBMITFAILUREMESSAGE": "Fehlermeldung beim Absenden des Formulars",
-    "PLACEHOLDERMESSAGE": "Platzhalter für Nachrichten",
+    "NO_CHATCANNEDANSWER_AVAILABLE": "Keine Textvorlagen verfügbar",
+    "NEW_CHATCANNEDANSWER": "Neue Textvorlage",
+    "ADD_CHATCANNEDANSWER": "Textvorlage hinzufügen",
+    "EDIT_CHATCANNEDANSWER": "Textvorlage bearbeiten",
+    "DELETE_CHATCANNEDANSWER": "Textvorlage löschen",
+    "OFFLINEMESSAGESUBJECT": "Betreff der Nachricht bei Offline",
+    "OFFLINEMESSAGEBODY": "Test der Nachricht bei Offline",
+    "FORMSUBMITSUCCESSMESSAGE": "Meldung Formular erfolgreich gesendet",
+    "FORMSUBMITFAILUREMESSAGE": "Meldung Fehler beim Senden des Formulars",
+    "PLACEHOLDERMESSAGE": "Nachricht für Platzhalter",
     "NOTETITLE": "Titel der Notiz",
     "DELETE_INTERACTION": "Interaktion löschen",
     "FONTSIZE": "Schriftgröße",
     "TEXTCOLOR": "Textfarbe",
-    "COMMAND": "Befehl",
+    "COMMAND": "Eingabe",
     "EDIT_SYSTEM": "System bearbeiten",
     "SYSTEM": "System",
     "NOTIFICATION": "Benachrichtigung",
     "NOTIFICATIONSHAKE": "Schütteln",
-    "NOTIFICATIONSOUND": "Ton",
+    "NOTIFICATIONSOUND": "Klingeln",
     "NOTIFICATIONTEMPLATE": "Vorlage",
-    "HIDEWHENOFFLINE": "Ausblenden",
-    "INSERT_MESSAGE_HERE": "Fügen Sie hier Ihre Textnachricht ein",
+    "HIDEWHENOFFLINE": "Ausblenden, wenn offline",
+    "INSERT_MESSAGE_HERE": "Nachricht hier eingeben",
     "AGENTALIAS": "Agent Alias",
     "AGENTFULLNAME": "Vollständiger Name des Agenten",
     "AGENTIDENTIFIER": "Identifikator",
-    "WAITFORTHEASSIGNEDAGENT": "Warten auf den zugewiesenen Agenten",
+    "WAITFORTHEASSIGNEDAGENT": "Warten auf den zugewiesenen Mitarbeiter",
     "ALIGNMENT": "Ausrichtung",
     "BOTTOM_RIGHT": "Unten rechts",
     "LEFT": "Links",
@@ -415,7 +416,7 @@
     "CUSTOMERALIAS": "Kunden-Alias",
     "EDIT_TAG": "Tag bearbeiten",
     "TAG": "Tag",
-    "AGENTADD_CHATWEBSITE": "Agent zur Chat-Website hinzufügen",
+    "AGENTADD_CHATWEBSITE": "Agenten zur Chat-Website hinzufügen",
     "BACKGROUNDCOLOR": "Hintergrundfarbe",
     "MESSAGEFONTSIZE": "Schriftgröße der Nachricht",
     "AGENTTRANSFER": "Agententransfer",
@@ -423,32 +424,32 @@
     "DIALOGFLOW": "Dialogflow",
     "EDIT_DIALOGFLOW": "Dialogflow bearbeiten",
     "LANGUAGE": "Sprache",
-    "QUEUETRANSFER": "Warteschlangenübertragung",
+    "QUEUETRANSFER": "Transfer in Warteschlange",
     "QUEUETRANSFERTIMEOUT": "Timeout bei der Warteschlangenübertragung",
     "SYSTEMALIAS": "Systemalias",
     "SYSTEMAVATAR": "System-Avatar",
     "TRANSFER": "Transfer",
     "WELCOMEMESSAGE": "Willkommensnachricht",
-    "ENABLECUSTOMERCHECKMARKS": "Aktivieren vom Kunden gelieferten / gelesenen Benachrichtigungen",
-    "CANNEDANSWERS": "Vordefinierte Antworten",
-    "CHATCANNEDANSWERS": "Vordefinierte Antworten",
+    "ENABLECUSTOMERCHECKMARKS": "Bestätigung Nachricht erhalten/gelesen",
+    "CANNEDANSWERS": "Textvorlagen",
+    "CHATCANNEDANSWERS": "Textvorlagen",
     "DOWNLOAD_INTERACTION": "Herunterladen",
-    "LOGIN_TIME": "Login-Zeit",
-    "PAUSE_TIME": "Pausenzeit",
+    "LOGIN_TIME": "Zeit angemeldet",
+    "PAUSE_TIME": "Zeit in Pause",
     "ACCESSKEYID": "Zugangsschlüssel-ID",
-    "BOTNAME": "Bot-Name",
+    "BOTNAME": "Botname",
     "EDIT_AMAZONLEX": "Amazon Lex bearbeiten",
     "LEXREGION": "Region",
     "SECRETACCESSKEY": "Geheimer Zugangsschlüssel",
-    "TEAMS_ASSOCIATION": "Teams Verband",
-    "MANDATORYDISPOSITION": "Obligatorische Disposition",
-    "MANDATORYDISPOSITIONPAUSEID": "Pausieren Sie die Verwendung, wenn die obligatorische Disposition aktiviert ist",
-    "ENABLESENDBUTTON": "Sendetaste aktivieren",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
+    "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+    "MANDATORYDISPOSITIONPAUSEID": "PausenID, wenn Qualifizierung erforderlich",
+    "ENABLESENDBUTTON": "Senden-Button aktivieren",
     "FEEDBACKTITLE": "Feedback-Titel",
-    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme verfügbar",
-    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
+    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufzeichnung verfügbar",
+    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufzeichnung läuft",
     "DOWNLOAD_WITHOUT_ATTACHMENTS": "Herunterladen ohne Anhänge",
-    "DOWNLOAD_WITH_ATTACHMENTS": "Mit Anhängen herunterladen",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Herunterladen inkl. Anhänge",
     "LASTMESSAGE": "Letzte Nachricht",
     "VIDAOO": "Vidaoo",
     "VIDAOOAPIKEY": "Vidaoo Api Key",
@@ -458,16 +459,31 @@
     "CLIENTEMAIL": "Kunden-E-Mail",
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Dialogflow V2 bearbeiten",
-    "PRIVATEKEY": "Privat Key",
+    "PRIVATEKEY": "Privater Schlüssel",
     "PROJECTID": "Projekt-ID",
     "EMAIL_ACCOUNT": "Email-Konto",
     "OPEN_NEW_INTERACTION": "Neue Interaktion öffnen",
-    "SUBJECT": "Gegenstand",
+    "SUBJECT": "Betreff",
     "ADD_NOTE": "Notiz hinzufügen",
-    "CANNED_ANSWER_NOT_FOUND": "Es wurden keine vordefinierten Antworten gefunden",
-    "NOTE": "Hinweis",
+    "CANNED_ANSWER_NOT_FOUND": "Keine Textvorlagen gefunden",
+    "NOTE": "Notiz",
     "VIDAOOMETADATA": "Vidaoo-Metadaten",
     "VIDAOONOTE": "Vidaoo-Hinweis",
-    "VIDAOOTOPIC": "Vidaoo-Thema"
+    "VIDAOOTOPIC": "Vidaoo-Thema",
+    "CHANNELID": "Kanal ID",
+    "EDIT_TVOX": "TVox bearbeiten",
+    "MOTIONTITLE": "Bewegungstitel",
+    "MOTIONURL": "Bewegungs-URL",
+    "MOTIONURLONANSWER": "Bewegungs-URL bei Antwort",
+    "MOTIONURLONRING": "Bewegungs-URL auf Ring",
+    "SERVICEID": "Service-ID",
+    "SERVICENAME": "Dienstname",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP-Adresse",
+    "TVOXLOGINURL": "TVox-Login-REST-URL",
+    "TVOXPASSWD": "TVox-Passwort",
+    "TVOXSESSIONURL": "TVox-Sitzungs-REST-URL",
+    "TVOXURL": "TVox-IP-URL",
+    "TVOXUSERNAME": "TVox-Benutzername"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/en.json b/public/app/main/apps/chat/i18n/en.json
index 88b668e..3b36c02 100644
--- a/public/app/main/apps/chat/i18n/en.json
+++ b/public/app/main/apps/chat/i18n/en.json
@@ -182,6 +182,21 @@
     "VALUE": "Value",
     "MANDATORYDISPOSITION": "Mandatory disposition",
     "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled",
+    "SERVICEID": "Service ID",
+    "CHANNELID": "Channel ID",
+    "EDIT_TVOX": "Edit TVox",
+    "SERVICENAME": "Service name",
+    "TVOX": "TVox",
+    "TVOXURL": "TVox IP URL",
+    "TVOXIP": "TVox IP Address",
+    "TVOXUSERNAME": "TVox Username",
+    "TVOXPASSWD": "TVox Password",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXSESSIONURL": "TVox Session REST Url",
+    "MOTIONURLONRING": "Motion URL On Ring",
+    "MOTIONURLONANSWER": "Motion URL On Answer",
+    "MOTIONTITLE": "Motion Title",
+    "MOTIONURL": "Motion URL",
     "ERRORS": {
       "PROJECTID_REQUIRED": "Mandatory Field",
       "CLIENTEMAIL_REQUIRED": "Mandatory Field",
@@ -268,7 +283,8 @@
       "WAITINGMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
       "WAITINGTITLE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
       "RATINGSTARSNUMBER_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
-      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field"
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
+      "EMAIL_ACCOUNT_REQUIRED": "Mandatory field"
     },
     "CM_FIELD": "Contact Manager Field",
     "CHATPROACTIVEACTIONS": "Proactive Actions",
@@ -468,6 +484,7 @@
     "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
     "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
     "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
-    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments"
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments",
+    "LABELTEXT": "Label text"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/es.json b/public/app/main/apps/chat/i18n/es.json
index 7cc2bcd..1c15a88 100644
--- a/public/app/main/apps/chat/i18n/es.json
+++ b/public/app/main/apps/chat/i18n/es.json
@@ -87,7 +87,8 @@
       "CLIENTEMAIL_REQUIRED": "Campo obligatorio",
       "PRIVATEKEY_REQUIRED": "Campo obligatorio",
       "PROJECTID_REQUIRED": "Campo obligatorio",
-      "VIDAOOTOPIC_REQUIRED": "Campo obligatorio"
+      "VIDAOOTOPIC_REQUIRED": "Campo obligatorio",
+      "EMAIL_ACCOUNT_REQUIRED": "Campo obligatorio"
     },
     "HELP": {
       "AUTOCLOSE": "Habilítelo si desea que las sesiones de chat se cierren como No gestionadas si no hay ningún agente disponible. Obtenga más información al respecto en: https://wiki.xcallymotion.com/display/XMV/Chat Websites",
@@ -468,6 +469,21 @@
     "NOTE": "Nota",
     "VIDAOOMETADATA": "Metadatos de Vidaoo",
     "VIDAOONOTE": "Nota de Vidaoo",
-    "VIDAOOTOPIC": "Tema Vidaoo"
+    "VIDAOOTOPIC": "Tema Vidaoo",
+    "CHANNELID": "Canal ID",
+    "EDIT_TVOX": "Editar TVox",
+    "MOTIONTITLE": "Título de movimiento",
+    "MOTIONURL": "URL de movimiento",
+    "MOTIONURLONANSWER": "URL de movimiento en respuesta",
+    "MOTIONURLONRING": "URL de movimiento en el anillo",
+    "SERVICEID": "ID de servicio",
+    "SERVICENAME": "Nombre del Servicio",
+    "TVOX": "TVox",
+    "TVOXIP": "Dirección IP de TVox",
+    "TVOXLOGINURL": "URL de REST de inicio de sesión de TVox",
+    "TVOXPASSWD": "Contraseña de TVox",
+    "TVOXSESSIONURL": "URL de REST de la sesión de TVox",
+    "TVOXURL": "URL de IP de TVox",
+    "TVOXUSERNAME": "Nombre de usuario de TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/et.json b/public/app/main/apps/chat/i18n/et.json
index ab28b0f..62e0d45 100644
--- a/public/app/main/apps/chat/i18n/et.json
+++ b/public/app/main/apps/chat/i18n/et.json
@@ -245,7 +245,8 @@
       "CLIENTEMAIL_REQUIRED": "Kohustuslik väli",
       "PRIVATEKEY_REQUIRED": "Kohustuslik väli",
       "PROJECTID_REQUIRED": "Kohustuslik väli",
-      "VIDAOOTOPIC_REQUIRED": "Kohustuslik väli"
+      "VIDAOOTOPIC_REQUIRED": "Kohustuslik väli",
+      "EMAIL_ACCOUNT_REQUIRED": "Kohustuslik väli"
     },
     "CM_FIELD": "Contact Manager Field",
     "CHATPROACTIVEACTIONS": "Proactive Actions",
@@ -468,6 +469,21 @@
     "NOTE": "Märge",
     "VIDAOOMETADATA": "Vidaoo metaandmed",
     "VIDAOONOTE": "Vidaoo märkus",
-    "VIDAOOTOPIC": "Vidaoo teema"
+    "VIDAOOTOPIC": "Vidaoo teema",
+    "CHANNELID": "Kanali ID",
+    "EDIT_TVOX": "Muutke TVoxi",
+    "MOTIONTITLE": "Liikumise pealkiri",
+    "MOTIONURL": "Liikumise URL",
+    "MOTIONURLONANSWER": "Liikumise URL vastuses",
+    "MOTIONURLONRING": "Liikumise URL helinal",
+    "SERVICEID": "Teenuse ID",
+    "SERVICENAME": "Teenuse nimi",
+    "TVOX": "TVox",
+    "TVOXIP": "TVoxi IP -aadress",
+    "TVOXLOGINURL": "TVox Logi sisse REST Url",
+    "TVOXPASSWD": "TVoxi parool",
+    "TVOXSESSIONURL": "TVoxi seansi REST Url",
+    "TVOXURL": "TVoxi IP -aadress",
+    "TVOXUSERNAME": "TVoxi kasutajanimi"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/fa.json b/public/app/main/apps/chat/i18n/fa.json
index 7d2cca2..7fbb9a1 100644
--- a/public/app/main/apps/chat/i18n/fa.json
+++ b/public/app/main/apps/chat/i18n/fa.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "زمینه اجباری",
       "PRIVATEKEY_REQUIRED": "زمینه اجباری",
       "PROJECTID_REQUIRED": "زمینه اجباری",
-      "VIDAOOTOPIC_REQUIRED": "زمینه اجباری"
+      "VIDAOOTOPIC_REQUIRED": "زمینه اجباری",
+      "EMAIL_ACCOUNT_REQUIRED": "فیلد اجباری"
     },
     "CM_FIELD": "تماس با مدير گروه رشته",
     "CHATPROACTIVEACTIONS": "اقدامات فعالانه تر توبيخ",
@@ -468,6 +469,21 @@
     "NOTE": "توجه داشته باشید",
     "VIDAOOMETADATA": "فراداده Vidaoo",
     "VIDAOONOTE": "Vidaoo Note",
-    "VIDAOOTOPIC": "مبحث Vidaoo"
+    "VIDAOOTOPIC": "مبحث Vidaoo",
+    "CHANNELID": "شناسه کانال",
+    "EDIT_TVOX": "TVox را ویرایش کنید",
+    "MOTIONTITLE": "عنوان حرکت",
+    "MOTIONURL": "نشانی وب حرکت",
+    "MOTIONURLONANSWER": "URL حرکت در پاسخ",
+    "MOTIONURLONRING": "URL حرکت روی حلقه",
+    "SERVICEID": "شناسه خدمات",
+    "SERVICENAME": "نام سرویس",
+    "TVOX": "TVox",
+    "TVOXIP": "آدرس IP TVox",
+    "TVOXLOGINURL": "آدرس TVEST ورود به سیستم TVox",
+    "TVOXPASSWD": "رمز TVox",
+    "TVOXSESSIONURL": "نشانی اینترنتی TVox Session REST",
+    "TVOXURL": "آدرس IP TVox",
+    "TVOXUSERNAME": "نام کاربری TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/fi.json b/public/app/main/apps/chat/i18n/fi.json
index a51d7db..0c00771 100644
--- a/public/app/main/apps/chat/i18n/fi.json
+++ b/public/app/main/apps/chat/i18n/fi.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Pakollinen kenttä",
       "PRIVATEKEY_REQUIRED": "Pakollinen kenttä",
       "PROJECTID_REQUIRED": "Pakollinen kenttä",
-      "VIDAOOTOPIC_REQUIRED": "Pakollinen kenttä"
+      "VIDAOOTOPIC_REQUIRED": "Pakollinen kenttä",
+      "EMAIL_ACCOUNT_REQUIRED": "Pakollinen kenttä"
     },
     "CM_FIELD": "Contact Manager kenttä",
     "CHATPROACTIVEACTIONS": "Ennakoivat toimet",
@@ -468,6 +469,21 @@
     "NOTE": "Merkintä",
     "VIDAOOMETADATA": "Vidaoo-metatiedot",
     "VIDAOONOTE": "Vidaoo-huomautus",
-    "VIDAOOTOPIC": "Vidaoo-aihe"
+    "VIDAOOTOPIC": "Vidaoo-aihe",
+    "CHANNELID": "Kanavan tunnus",
+    "EDIT_TVOX": "Muokkaa TVoxia",
+    "MOTIONTITLE": "Liikkeen otsikko",
+    "MOTIONURL": "Liike -URL",
+    "MOTIONURLONANSWER": "Liike -URL -osoite vastauksessa",
+    "MOTIONURLONRING": "Liike -URL soitossa",
+    "SERVICEID": "Palvelun tunnus",
+    "SERVICENAME": "Palvelun nimi",
+    "TVOX": "TVox",
+    "TVOXIP": "TVoxin IP -osoite",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "TVox -salasana",
+    "TVOXSESSIONURL": "TVox -istunnon REST -URL -osoite",
+    "TVOXURL": "TVoxin IP -osoite",
+    "TVOXUSERNAME": "TVox -käyttäjänimi"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/fr.json b/public/app/main/apps/chat/i18n/fr.json
index 4f23aa0..873c589 100644
--- a/public/app/main/apps/chat/i18n/fr.json
+++ b/public/app/main/apps/chat/i18n/fr.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Champ obligatoire",
       "PRIVATEKEY_REQUIRED": "Champ obligatoire",
       "PROJECTID_REQUIRED": "Champ obligatoire",
-      "VIDAOOTOPIC_REQUIRED": "Champ obligatoire"
+      "VIDAOOTOPIC_REQUIRED": "Champ obligatoire",
+      "EMAIL_ACCOUNT_REQUIRED": "Champ obligatoire"
     },
     "CM_FIELD": "Contact Manager Domaine",
     "CHATPROACTIVEACTIONS": "Des actions proactives",
@@ -468,6 +469,21 @@
     "NOTE": "Noter",
     "VIDAOOMETADATA": "Métadonnées Vidaoo",
     "VIDAOONOTE": "Note Vidaoo",
-    "VIDAOOTOPIC": "Sujet Vidaoo"
+    "VIDAOOTOPIC": "Sujet Vidaoo",
+    "CHANNELID": "Identifiant de la chaine",
+    "EDIT_TVOX": "Modifier TVox",
+    "MOTIONTITLE": "Titre du mouvement",
+    "MOTIONURL": "URL de mouvement",
+    "MOTIONURLONANSWER": "URL de mouvement sur réponse",
+    "MOTIONURLONRING": "URL de mouvement sur sonnerie",
+    "SERVICEID": "Identifiant de service",
+    "SERVICENAME": "Nom du service",
+    "TVOX": "TVox",
+    "TVOXIP": "Adresse IP TVox",
+    "TVOXLOGINURL": "URL REST de connexion TVox",
+    "TVOXPASSWD": "Mot de passe TVox",
+    "TVOXSESSIONURL": "URL REST de la session TVox",
+    "TVOXURL": "URL IP TVox",
+    "TVOXUSERNAME": "Nom d'utilisateur TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/he.json b/public/app/main/apps/chat/i18n/he.json
index a8a8e5f..5a20fb1 100644
--- a/public/app/main/apps/chat/i18n/he.json
+++ b/public/app/main/apps/chat/i18n/he.json
@@ -245,7 +245,8 @@
       "CLIENTEMAIL_REQUIRED": "שדה חובה",
       "PRIVATEKEY_REQUIRED": "שדה חובה",
       "PROJECTID_REQUIRED": "שדה חובה",
-      "VIDAOOTOPIC_REQUIRED": "שדה חובה"
+      "VIDAOOTOPIC_REQUIRED": "שדה חובה",
+      "EMAIL_ACCOUNT_REQUIRED": "שדה חובה"
     },
     "CM_FIELD": "שדה 'מנהל אנשי הקשר'",
     "CHATPROACTIVEACTIONS": "פעולות יזומות",
@@ -468,6 +469,21 @@
     "NOTE": "הערה",
     "VIDAOOMETADATA": "מטא נתונים של Vidaoo",
     "VIDAOONOTE": "הערה Vidaoo",
-    "VIDAOOTOPIC": "נושא Vidaoo"
+    "VIDAOOTOPIC": "נושא Vidaoo",
+    "CHANNELID": "מזהה ערוץ",
+    "EDIT_TVOX": "ערוך TVox",
+    "MOTIONTITLE": "כותרת התנועה",
+    "MOTIONURL": "כתובת URL לתנועה",
+    "MOTIONURLONANSWER": "כתובת URL לתנועה בתשובה",
+    "MOTIONURLONRING": "כתובת URL לתנועה על הטבעת",
+    "SERVICEID": "מזהה שירות",
+    "SERVICENAME": "שם השירות",
+    "TVOX": "TVox",
+    "TVOXIP": "כתובת IP של TVox",
+    "TVOXLOGINURL": "כתובת אתר REST כניסה ל- TVox",
+    "TVOXPASSWD": "סיסמת TVox",
+    "TVOXSESSIONURL": "כתובת אתר מנוחה ל- TVox Session",
+    "TVOXURL": "כתובת ה- IP של TVox",
+    "TVOXUSERNAME": "שם המשתמש של TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/hi.json b/public/app/main/apps/chat/i18n/hi.json
index 22c60cb..5b0f3e2 100644
--- a/public/app/main/apps/chat/i18n/hi.json
+++ b/public/app/main/apps/chat/i18n/hi.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "आवश्यक स्थान",
       "PRIVATEKEY_REQUIRED": "आवश्यक स्थान",
       "PROJECTID_REQUIRED": "आवश्यक स्थान",
-      "VIDAOOTOPIC_REQUIRED": "आवश्यक स्थान"
+      "VIDAOOTOPIC_REQUIRED": "आवश्यक स्थान",
+      "EMAIL_ACCOUNT_REQUIRED": "अनिवार्य क्षेत्र"
     },
     "CM_FIELD": "संपर्क प्रबंधक क्षेत्र",
     "CHATPROACTIVEACTIONS": "सक्रिय क्रियाएं",
@@ -468,6 +469,21 @@
     "NOTE": "ध्यान दें",
     "VIDAOOMETADATA": "वीडियो मेटाडेटा",
     "VIDAOONOTE": "वीडियो नोटoo",
-    "VIDAOOTOPIC": "Vidaoo विषय"
+    "VIDAOOTOPIC": "Vidaoo विषय",
+    "CHANNELID": "चैनल आईडी",
+    "EDIT_TVOX": "टीवीओक्स संपादित करें",
+    "MOTIONTITLE": "मोशन शीर्षक",
+    "MOTIONURL": "मोशन यूआरएल",
+    "MOTIONURLONANSWER": "उत्तर पर मोशन यूआरएल",
+    "MOTIONURLONRING": "मोशन यूआरएल ऑन रिंग",
+    "SERVICEID": "सेवा आईडी",
+    "SERVICENAME": "सेवा का नाम",
+    "TVOX": "टीवीओक्स",
+    "TVOXIP": "टीवीओक्स आईपी पता",
+    "TVOXLOGINURL": "TVox लॉगिन REST Url",
+    "TVOXPASSWD": "टीवीओक्स पासवर्ड",
+    "TVOXSESSIONURL": "TVox सत्र REST Url",
+    "TVOXURL": "टीवीओक्स आईपी यूआरएल",
+    "TVOXUSERNAME": "TVox उपयोगकर्ता नाम"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/hu.json b/public/app/main/apps/chat/i18n/hu.json
new file mode 100644
index 0000000..13cbf3f
--- /dev/null
+++ b/public/app/main/apps/chat/i18n/hu.json
@@ -0,0 +1,489 @@
+{
+  "CHAT": {
+    "EDIT_DIALOGFLOWV2": "Edit Dialogflow V2",
+    "DIALOGFLOWV2": "Dialogflow V2",
+    "PRIVATEKEY": "Private Key",
+    "CLIENTEMAIL": "Client Email",
+    "PROJECTID": "Project ID",
+    "VIDAOOESCALATION": "Start Video Call",
+    "VIDAOOAPIKEY": "Vidaoo Api Key",
+    "VIDAOOSESSION": "Start Video Call",
+    "VIDAOOTOPIC": "Vidaoo Topic",
+    "VIDAOONOTE": "Vidaoo Note",
+    "VIDAOOMETADATA": "Vidaoo Metadata",
+    "VIDEO": "Video",
+    "VIDAOO": "Vidaoo",
+    "EDIT_AMAZONLEX": "Edit Amazon Lex",
+    "AMAZONLEX": "Amazon Lex",
+    "ACCESSKEYID": "Access Key ID",
+    "SECRETACCESSKEY": "Secret Access Key",
+    "LEXREGION": "Region",
+    "BOTNAME": "Bot Name",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "DOWNLOAD_INTERACTION": "Download",
+    "ENABLECUSTOMERCHECKMARKS": "Enable customer delivered/read notifications",
+    "TRANSFER": "Transfer",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "SYSTEMAVATAR": "System Avatar",
+    "SYSTEMALIAS": "System Alias",
+    "OPEN_NEW_INTERACTION": "Open new interaction",
+    "EMAIL_ACCOUNT": "Email account",
+    "SUBJECT": "Subject",
+    "WELCOMEMESSAGE": "Welcome Message",
+    "LANGUAGE": "Language",
+    "EDIT_DIALOGFLOW": "Edit Dialogflow",
+    "DIALOGFLOW": "Dialogflow",
+    "BACKGROUNDCOLOR": "Background Color",
+    "MESSAGEFONTSIZE": "Message Font Size",
+    "ADD_NOTE": "Add note",
+    "NOTE": "Note",
+    "TAG": "Tag",
+    "EDIT_TAG": "Edit Tag",
+    "CUSTOMERALIAS": "Customer Alias",
+    "SNIPPETSWIPEOUT": "Snippet swipe out",
+    "CUSTOMERAVATAR": "Customer Avatar",
+    "SHOWCUSTOMERAVATAR": "Show customer avatar",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
+    "DEFAULTTITLE": "Default Title",
+    "MESSAGESALIGNMENT": "Messages Alignment",
+    "ALTERNATE": "Alternate",
+    "CENTERED": "Centered",
+    "POSITION": "Position",
+    "VERTICALPOSITION": "Vertical position",
+    "ALIGNMENT": "Alignment",
+    "VERTICALALIGNMENT": "Vertical alignment",
+    "BOTTOM_RIGHT": "Bottom right",
+    "RIGHT": "Right",
+    "LEFT": "Left",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "AGENTIDENTIFIER": "Identifier",
+    "WEBSITEALIAS": "Website Alias",
+    "AGENTALIAS": "Agent Alias",
+    "AGENTFULLNAME": "Agent Fullname",
+    "INSERT_MESSAGE_HERE": "Insert your text message here",
+    "HIDEWHENOFFLINE": "Hide",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "SYSTEM": "System",
+    "EDIT_SYSTEM": "Edit System",
+    "COMMAND": "Command",
+    "TEXTCOLOR": "Text Color",
+    "FONTSIZE": "Font Size",
+    "WEBSCRIPT": "Web Script",
+    "CANNEDANSWERS": "Canned Answers",
+    "CHATCANNEDANSWERS": "Canned Answers",
+    "NO_CHATCANNEDANSWER_AVAILABLE": "No Canned Answers Available",
+    "NEW_CHATCANNEDANSWER": "New Canned Answer",
+    "ADD_CHATCANNEDANSWER": "Add Canned Answer",
+    "EDIT_CHATCANNEDANSWER": "Edit",
+    "DELETE_CHATCANNEDANSWER": "Delete",
+    "OFFLINEMESSAGESUBJECT": "Message subject",
+    "OFFLINEMESSAGEBODY": "Message body",
+    "FORMSUBMITSUCCESSMESSAGE": "Form submit success message",
+    "FORMSUBMITFAILUREMESSAGE": "Form submit failure message",
+    "PLACEHOLDERMESSAGE": "Message placeholder",
+    "NOTETITLE": "Note's title",
+    "CLOSINGQUESTION": "Closing question",
+    "TAGS": "Tags",
+    "SHOWAGENTAVATAR": "Show personal agent avatar",
+    "AGENTAVATAR": "Agent Avatar",
+    "SPYINTERACTION": "Spy",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "GOTOREALTIME_CHATQUEUE": "Go To Realtime Chat Queue",
+    "PARTIALPAUSE": "Partial Pause",
+    "BUSY": "Busy",
+    "TIMER": "Timer",
+    "IDLE": "Idle",
+    "CAPACITY": "Capacity",
+    "AGENTSADD_QUEUE": "Add Agent to Chat Queue",
+    "QUEUES": "Queues",
+    "LOGGED_IN": "Logged in",
+    "PAUSED": "Paused",
+    "READY": "Ready",
+    "WAITING": "Waiting",
+    "WRITING": "Writing",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Openchannel",
+    "FAX": "Fax",
+    "PAUSE": "Pause",
+    "REALTIME": "Realtime",
+    "AGENTS": "Agents",
+    "FULLNAME": "Full Name",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "LOGOUT": "Logout",
+    "UNPAUSE": "End Pause",
+    "AGENTADD_QUEUE": "Add Agent to Chat Queue",
+    "TEXT": "Text",
+    "TIMES": "Number of times per interaction",
+    "EDIT_AUTOREPLY": "Edit Auto Reply",
+    "AUTOREPLY": "Auto Reply",
+    "NEW_CHATDISPOSITION": "New Chat Disposition",
+    "ENABLECUSTOMERATTACHMENT": "Enable Customer Attachments",
+    "ENABLESENDBUTTON": "Enable Send Button",
+    "OFFLINE_CHAT_BUTTON": "'Offline Chat' Button",
+    "OFFLINESTATUS": "Offline Status",
+    "NAME": "Name",
+    "CHATQUEUES": "Chat Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "STRATEGY": "Strategy",
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "DESCRIPTION": "Description",
+    "KEY": "Key",
+    "ALIAS": "Alias",
+    "VARIABLE": "Variable",
+    "INTERVAL": "Interval",
+    "EDIT_CLOSE": "Edit Close",
+    "TIMEZONE": "Timezone",
+    "MESSAGE": "Message",
+    "ADVANCED": "Advanced",
+    "FORWARDTRANSCRIPT": "Forward Transcript",
+    "FORWARDTRANSCRIPTMESSAGE": "Forward Transcript Message",
+    "SKIPMESSAGEBUTTON": "Skip Message Button",
+    "EDIT_MESSAGE": "Edit Message",
+    "CONDITION_AGREEMENT": "Condition Agreement",
+    "NONE": "None",
+    "PRIORITY": "Priority",
+    "ONLINESTATUS": "Online Status",
+    "UNMANAGEDSTATUS": "Unmanaged Status",
+    "AUTOCLOSE": "Enable Autoclose",
+    "ENABLEUNMANAGEDNOTE": "Enable Unmanaged Message",
+    "UNMANAGEDMESSAGE": "Message",
+    "SKIPUNMANAGED": "Skip Message",
+    "SENDUNMANAGED": "Send Message",
+    "WEBSITESCRIPT": "Website Script",
+    "DELETE_OFFLINEMESSAGE": "Delete",
+    "OFFLINEMESSAGES": "Offline Messages",
+    "FORWARD_OFFLINE": "Forward Offline",
+    "SHOW_OFFLINEMESSAGE": "Show",
+    "FORWARD_OFFLINE_ADDRESS": "Forward Offline Address",
+    "CLOSINGFORM": "Closing Form",
+    "ENABLERATING": "Enable Rating",
+    "ENABLECUSTOMERWRITING": "Allow customer writing before agent accepting",
+    "ENABLEFEEDBACK": "Enable Feedback",
+    "FEEDBACKTITLE": "Feedback Title",
+    "RATINGTYPE": "Rating Type",
+    "CLOSINGMESSAGE": "Closing Message",
+    "CLOSINGMESSAGEBUTTON": "Closing Message Button",
+    "RATINGSTARSNUMBER": "Rating Stars Number",
+    "EDIT_GOTOIF": "Edit GotoIf",
+    "CONDITION": "Condition",
+    "TRUEPRIORITY": "True Priority",
+    "FALSEPRIORITY": "False Priority",
+    "VALUE": "Value",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled",
+    "SERVICEID": "Service ID",
+    "CHANNELID": "Channel ID",
+    "EDIT_TVOX": "Edit TVox",
+    "SERVICENAME": "Service name",
+    "TVOX": "TVox",
+    "TVOXURL": "TVox IP URL",
+    "TVOXIP": "TVox IP Address",
+    "TVOXUSERNAME": "TVox Username",
+    "TVOXPASSWD": "TVox Password",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXSESSIONURL": "TVox Session REST Url",
+    "MOTIONURLONRING": "Motion URL On Ring",
+    "MOTIONURLONANSWER": "Motion URL On Answer",
+    "MOTIONTITLE": "Motion Title",
+    "MOTIONURL": "Motion URL",
+    "ERRORS": {
+      "PROJECTID_REQUIRED": "Mandatory Field",
+      "CLIENTEMAIL_REQUIRED": "Mandatory Field",
+      "PRIVATEKEY_REQUIRED": "Mandatory Field",
+      "VIDAOOAPIKEY_REQUIRED": "Mandatory Field",
+      "VIDAOOTOPIC_REQUIRED": "Mandatory Field",
+      "BOTNAME_REQUIRED": "Mandatory Field",
+      "SECRETACCESSKEY_REQUIRED": "Mandatory Field",
+      "ACCESSKEYID_REQUIRED": "Mandatory Field",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "CUSTOMERALIAS_REQUIRED": "Mandatory Field",
+      "AGENTALIAS_REQUIRED": "Mandatory Field",
+      "SYSTEMALIAS_REQUIRED": "Mandatory Field",
+      "MESSAGEFONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MESSAGEFONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MESSAGEFONTSIZE_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "VERTICALPOSITION_REQUIRED": "Mandatory Field",
+      "VERTICALPOSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "VERTICALPOSITION_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FONTSIZE_REQUIRED": "Mandatory Field",
+      "TEXT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "CUSTOMERALIAS_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "SYSTEMALIAS_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "OFFLINEMESSAGESUBJECT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "OFFLINEMESSAGEBODY_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "PLACEHOLDERMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "NOTETITLE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "FORMSUBMITSUCCESSMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "FORMSUBMITFAILUREMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "CLOSINGQUESTION_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "HEADER_OFFLINE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "OFFLINE_CHAT_BUTTON_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "TEXT_REQUIRED": "Mandatory Field",
+      "SENDUNMANAGED_REQUIRED": "Mandatory Field",
+      "SENDUNMANAGED_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "SKIPUNMANAGED_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "UNMANAGEDMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "WEBSITEALIAS_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "AGENT_REQUIRED": "Mandatory Field",
+      "QUEUE_REQUIRED": "Mandatory Field",
+      "CONDITION_REQUIRED": "Mandatory Field",
+      "PRIORITY_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_REQUIRED": "Mandatory Field",
+      "FALSEPRIORITY_REQUIRED": "Mandatory Field",
+      "NAME_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_REQUIRED": "Mandatory Field",
+      "DISPOSITION_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_MUST_VALID_URL": "Wrong format",
+      "EMAIL_MUST_BE_VALID": "Wrong format",
+      "ADDRESS_REQUIRED": "Mandatory Field",
+      "ADDRESS_MUST_VALID_URL": "Wrong format",
+      "ENQUIRY_FORWARDING_ADDRESS_REQUIRED": "Mandatory Field",
+      "ACCEPTURL_MUST_VALID_URL": "Wrong format",
+      "TIMEOUT_REQUIRED": "Mandatory Field",
+      "REJECTURL_MUST_VALID_URL": "Wrong format",
+      "CLOSEURL_MUST_VALID_URL": "Wrong format",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": " The value must be greater than or equal to",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": " The value must be greater than or equal to",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": " The value must be greater than or equal to",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": " The value must be greater than or equal to",
+      "POLLING_INTERVAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": " The value must be greater than or equal to",
+      "WAITINGMESSAGE_REQUIRED": "Mandatory Field",
+      "WAITINGTITLE_REQUIRED": "Mandatory Field",
+      "KEY_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "KEY_REQUIRED": "Mandatory Field",
+      "WAITINGMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "WAITINGTITLE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "RATINGSTARSNUMBER_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
+      "EMAIL_ACCOUNT_REQUIRED": "Mandatory field"
+    },
+    "CM_FIELD": "Contact Manager Field",
+    "CHATPROACTIVEACTIONS": "Proactive Actions",
+    "NEW_CHATPROACTIVEACTION": "New Proactive Action",
+    "EDIT_CHATPROACTIVEACTION": "Edit Proactive Action",
+    "DELETE_CHATPROACTIVEACTION": "Delete Proactive Action",
+    "ADD_CHATPROACTIVEACTION": "Add Proactive Action",
+    "NO_CHATPROACTIVEACTION_AVAILABLE": "No Proactive Actions Available",
+    "NO_OFFLINEMESSAGE_AVAILABLE": "No Offline Messages Available",
+    "MOUSEOVER": "Mouse Over",
+    "TIMEOUT": "Timeout",
+    "TYPE": "Type",
+    "SELECTOR": "Selector",
+    "AGENT": "Agent",
+    "GOTO": "Goto",
+    "GOTOIF": "GotoIf",
+    "NOOP": "Noop",
+    "QUEUE": "Queue",
+    "BUILDER": "Builder",
+    "PREVIEW": "Preview",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_QUEUE": "Edit Queue",
+    "EDIT_GOTO": "Edit Goto",
+    "EDIT_GOTOIf": "Edit GotoIf",
+    "EDIT_NOOP": "Edit Noop",
+    "ADD_CHATQUEUE": "Add Chat Queue",
+    "EDIT_CHATQUEUE": "Edit Chat Queue",
+    "DELETE_CHATQUEUE": "Delete Chat Queue",
+    "SETTINGS": "Settings",
+    "SAVE": "Save",
+    "SCRIPT": "Script",
+    "TOKEN": "Token",
+    "CREATED_AT": "Created At",
+    "CHATWEBSITES": "Chat Websites",
+    "MOTIONADDRESS": "Website Domain",
+    "MOTIONPROXY": "Proxy Or Motion Domain",
+    "ADD_CHATWEBSITE": "Add Chat Website",
+    "EDIT_CHATWEBSITE": "Edit Chat Website",
+    "DELETE_CHATWEBSITE": "Delete Chat Website",
+    "LIST": "List",
+    "SNIPPET": "Snippet",
+    "FORMS": "Forms",
+    "UP": "Up",
+    "DOWN": "Down",
+    "COLLAPSE": "Collapse",
+    "PROACTIVEACTIONS": "Proactive Actions",
+    "DISPOSITIONS": "Dispositions",
+    "WEBHOOKS": "WebHooks",
+    "ACTIONS": "Actions",
+    "FIDELITY": "Fidelity",
+    "APPEARANCE": "Appearance",
+    "MAINCOLOR": "Main Color",
+    "FOCUSCOLOR": "Focus Color",
+    "BUTTONCOLOR": "Button Color",
+    "HEADERSHAPE": "Header Shape",
+    "ANIMATION": "Animation",
+    "DEFAULT": "Default",
+    "WHITELABEL": "White Label",
+    "LOGO": "Logo",
+    "DOWNLOADTRANSCRIPT": "Download Transcript",
+    "ENQUIRY_ENABLE": "Enquiry Enable",
+    "ENQUIRY_FORWARDING": "Enquiry Forwarding",
+    "ENQUIRY_FORWARDING_ADDRESS": "Enquiry Forwarding Address",
+    "LABELS": "Labels",
+    "HEADER_ONLINE": "Online Header",
+    "ONLINE_MESSAGE": "Online Message",
+    "NAME_TITLE": "Name Input Label",
+    "USERNAME_PLACEHOLDER": "Username Input Placeholder",
+    "EMAIL_TITLE": "Email Input Label",
+    "EMAIL_PLACEHOLDER": "Email Input Placeholder",
+    "START_CHAT_BUTTON": "'Start Chat' Button",
+    "AGENTS_BUSY": "Busy Agents Message",
+    "HEADER_OFFLINE": "Offline Header",
+    "OFFLINE_MESSAGE": "Offline Message",
+    "MESSAGE_TITLE": "Message Label",
+    "ENQUIRY_MESSAGE_PLACEHOLDER": "Enquiry Message Input Placeholder",
+    "ENQUIRY_BUTTON": "Enquiry Button Text",
+    "RATING_MESSAGE": "Rating Message",
+    "RATING_SEND": "Rating Send Button Text",
+    "RATING_SKIP": "Rating Skip Button Text",
+    "ONLINE": "Online",
+    "OFFLINE": "Offline",
+    "PROACTIVE": "Proactive",
+    "ACCEPT": "Accept",
+    "ACCEPTMETHOD": "Accept Method",
+    "ACCEPTURL": "Accept URL",
+    "REJECT": "Reject",
+    "REJECTMETHOD": "Reject Method",
+    "REJECTURL": "Reject URL",
+    "CLOSE": "Close",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "EMBEDDING": "Embedding",
+    "GENERAL": "General",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "BACK": "Back",
+    "HELP": {
+      "VERTICALPOSITION": "Represents the distance in percentage from top",
+      "AGENTIDENTIFIER": "Represents the agent identifier within the chat session in the snippet",
+      "HIDEWHENOFFLINE": "Hides snippet when offline",
+      "KEY": "Website short name (5 char) shown on the Agent Tab",
+      "TOKEN": "Automatically generated token used in the Script",
+      "INTEVAL": "To be selected from the list of the available intervals",
+      "TIMEZONE": "Select one from the list (default=local timezone)",
+      "ENABLERATING": "Enable it if you want the web visitor can rate the interaction at the end",
+      "ENABLEFEEDBACK": "Enable it if you want the web visitor can send a feedback (up to 150 char) at the end",
+      "FORWARDTRANSCRIPT": "Enable it if you want the web visitor is asked to receive a chat transcript via email",
+      "AUTOCLOSE": "Enable it if you want chat sessions to be closed as Unmanaged if no agent is available. Learn more about it at: https://wiki.xcallymotion.com/display/XMV/Chat+Websites#ChatWebsites-Snippet",
+      "ENABLEUNMANAGEDNOTE": "Enable it if you want the visitor is shown a message when all the agents are busy and the chat gets unmanaged",
+      "WEBSITEALIAS": "A prefix used to compose the agent name (prefix+Agent Id) shown to the web visitor during the chat session",
+      "ENABLECUSTOMERWRITING": " Enable it if you want the chat starts without waiting for an available agent (pay attention: if you enable it, your chats will never get unmanaged). Learn more at: https://wiki.xcallymotion.com/display/XMV/Chat+Websites#ChatWebsites-Snippet",
+      "MAPKEY": "The following Motion Contact Manager field:",
+      "FROMKEY": "Will be mapped in your Motion Chat Snippet as:",
+      "COPYSCRIPTTOCLIPBOARD": "Copy and paste the script text into your website",
+      "FORWARD_OFFLINE": "You can add multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "MOTIONADDRESS": "The field must have the following format: <protocol>://<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
+      "MOTIONPROXY": "The field must have the following format: <protocol>://<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "LIST": "Contact Manager list used to associate Contacts",
+      "INTERVAL": "Select one from the list",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled",
+      "WELCOMEMESSAGE": "Leave empty if you don't want to send any welcome message"
+    },
+    "ADDRESS": "Address",
+    "ONLINESTATE": "Online Status",
+    "OFFLINESTATE": "Offline Status",
+    "RATINGSTATE": "Rating State",
+    "ENQUIRY": "Enquiry",
+    "OFFLINETEMPLATE": "Offline Template",
+    "CHATDISPOSITIONS": "Chat Dispositions",
+    "NO_CHATDISPOSITION_AVAILABLE": "No Chat Dispositions available",
+    "ADD_CHATDISPOSITION": "Add Chat Disposition",
+    "DELETE": "Delete",
+    "EDIT_CHATDISPOSITION": "Edit Chat Disposition",
+    "DELETE_CHATDISPOSITION": "Delete Chat Disposition",
+    "ID": "Id",
+    "NEW_CHATQUEUE": "New Chat Queue",
+    "NEW_CHATWEBSITE": "New Chat Website",
+    "ROUNDED": "Rounded",
+    "SQUARED": "Squared",
+    "NO_AVAILABLE_INFO": "No available info",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "CONTACT": "Contact",
+    "STARTEDAT": "Started At",
+    "LASTMESSAGE": "Last message",
+    "STATUS": "Status",
+    "CLOSED": "Closed",
+    "OPENED": "Open",
+    "OPEN": "Open",
+    "ACCOUNT": "Account",
+    "INTERACTION": "Interaction",
+    "INTERACTIONS": "Interactions",
+    "WEBSITE": "Website",
+    "ALL": "All",
+    "SELECT_STATUS": "Select a status",
+    "FILTER": "Filter",
+    "FILTERS": "Filters",
+    "TEAMADD_CHATQUEUE": "Add Team to Chat Queue",
+    "AGENTADD_CHATQUEUE": "Add Agent to Chat Queue",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "CLOSEDAT": "Closed At",
+    "DISPOSITION": "Disposition",
+    "CREATEDAT": "Created At",
+    "NOTES": "Notes",
+    "NO_INTERACTION_AVAILABLE": "No interactions available",
+    "SELECTED_WEBSITE": "Select a website",
+    "GOTOP": "Gotop",
+    "EDIT_GOTOP": "Edit Gotop",
+    "SELECT_WEBSITE": "Select a website",
+    "INFO": "Info",
+    "OFFLINEMESSAGES_CHATWEBSITE": "Go to Offline Messages",
+    "WAITINGTITLE": "Waiting Title",
+    "WAITINGMESSAGE": "Waiting Message",
+    "RATING": "Rating",
+    "NO_RATINGVALUE": "No Rating",
+    "DEFAULT_PAUSE": "Default pause",
+    "UNKNOWN": "Unknown",
+    "UNREGISTERED": "Unregistered",
+    "UNAVAILABLE": "Unavailable",
+    "NOT_INUSE": "Not in use",
+    "REACHABLE": "Reachable",
+    "IN_USE": "In use",
+    "VOICE": "Voice",
+    "INTERACTIONS_CHATWEBSITE": "Go to Interactions",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "AGENTADD_CHATWEBSITE": "Add Agent to Chat Website",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments"
+  }
+}
diff --git a/public/app/main/apps/chat/i18n/id.json b/public/app/main/apps/chat/i18n/id.json
index 1823857..de9f60c 100644
--- a/public/app/main/apps/chat/i18n/id.json
+++ b/public/app/main/apps/chat/i18n/id.json
@@ -87,7 +87,8 @@
       "CLIENTEMAIL_REQUIRED": "Bidang wajib",
       "PRIVATEKEY_REQUIRED": "Bidang wajib",
       "PROJECTID_REQUIRED": "Bidang wajib",
-      "VIDAOOTOPIC_REQUIRED": "Bidang wajib"
+      "VIDAOOTOPIC_REQUIRED": "Bidang wajib",
+      "EMAIL_ACCOUNT_REQUIRED": "Bidang wajib"
     },
     "HELP": {
       "AGENTIDENTIFIER": "Mewakili pengenal agen dalam sesi obrolan di cuplikan",
@@ -468,6 +469,21 @@
     "NOTE": "Catatan",
     "VIDAOOMETADATA": "Metadata Vidaoo",
     "VIDAOONOTE": "Catatan Vidaoo",
-    "VIDAOOTOPIC": "Topik Vidaoo"
+    "VIDAOOTOPIC": "Topik Vidaoo",
+    "CHANNELID": "ID Saluran",
+    "EDIT_TVOX": "Edit TVox",
+    "MOTIONTITLE": "Judul Gerakan",
+    "MOTIONURL": "URL gerak",
+    "MOTIONURLONANSWER": "URL Gerakan Pada Jawaban",
+    "MOTIONURLONRING": "URL Gerakan Pada Dering",
+    "SERVICEID": "ID Layanan",
+    "SERVICENAME": "Nama layanan",
+    "TVOX": "TVox",
+    "TVOXIP": "Alamat IP TVox",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "Kata Sandi TVox",
+    "TVOXSESSIONURL": "Url Istirahat Sesi TVox",
+    "TVOXURL": "URL IP TVox",
+    "TVOXUSERNAME": "Nama Pengguna TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/it.json b/public/app/main/apps/chat/i18n/it.json
index 8a17ef3..4f7420d 100644
--- a/public/app/main/apps/chat/i18n/it.json
+++ b/public/app/main/apps/chat/i18n/it.json
@@ -225,7 +225,8 @@
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Campo obbligatorio",
       "CLIENTEMAIL_REQUIRED": "Campo obbligatorio",
       "PRIVATEKEY_REQUIRED": "Campo obbligatorio",
-      "PROJECTID_REQUIRED": "Campo obbligatorio"
+      "PROJECTID_REQUIRED": "Campo obbligatorio",
+      "EMAIL_ACCOUNT_REQUIRED": "Campo obbligatorio"
     },
     "ADD_CHATQUEUE": "Aggiungi Coda Chat",
     "EDIT_CHATQUEUE": "Modifica Coda Chat",
@@ -468,6 +469,22 @@
     "PROJECTID": "ID progetto",
     "EMAIL_ACCOUNT": "Account email",
     "SUBJECT": "Oggetto",
-    "OPEN_NEW_INTERACTION": "Apri una nuova interazione"
+    "OPEN_NEW_INTERACTION": "Apri una nuova interazione",
+    "CHANNELID": "Canale ID",
+    "EDIT_TVOX": "Modifica TVox",
+    "MOTIONTITLE": "Titolo del movimento",
+    "MOTIONURL": "URL movimento",
+    "MOTIONURLONANSWER": "URL di movimento alla risposta",
+    "MOTIONURLONRING": "URL di movimento su anello",
+    "SERVICEID": "ID servizio",
+    "SERVICENAME": "Nome di Servizio",
+    "TVOX": "TVox",
+    "TVOXIP": "Indirizzo IP TVox",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "Password TVox",
+    "TVOXSESSIONURL": "URL REST della sessione TVox",
+    "TVOXURL": "URL IP TVox",
+    "TVOXUSERNAME": "Nome utente TVox",
+    "LABELTEXT": "Testo dentro la Label"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/ja.json b/public/app/main/apps/chat/i18n/ja.json
index e371a97..ef8a2cb 100644
--- a/public/app/main/apps/chat/i18n/ja.json
+++ b/public/app/main/apps/chat/i18n/ja.json
@@ -87,7 +87,8 @@
       "CLIENTEMAIL_REQUIRED": "必須フィールド",
       "PRIVATEKEY_REQUIRED": "必須フィールド",
       "PROJECTID_REQUIRED": "必須フィールド",
-      "VIDAOOTOPIC_REQUIRED": "必須フィールド"
+      "VIDAOOTOPIC_REQUIRED": "必須フィールド",
+      "EMAIL_ACCOUNT_REQUIRED": "必須フィールド"
     },
     "HELP": {
       "AUTOCLOSE": "エージェントは応じられない場合は、チャットセッションをアンマネージドとしてクローズする場合に有効にします。詳細はhttps://wiki.xcallymotion.com/display/XMV/Chat+Websites#ChatWebsites-Snippetをご覧ください。",
@@ -468,6 +469,21 @@
     "NOTE": "注意",
     "VIDAOOMETADATA": "Vidaooメタデータ",
     "VIDAOONOTE": "Vidaooノート",
-    "VIDAOOTOPIC": "Vidaooトピック"
+    "VIDAOOTOPIC": "Vidaooトピック",
+    "CHANNELID": "チャネルID",
+    "EDIT_TVOX": "TVoxを編集する",
+    "MOTIONTITLE": "モーションタイトル",
+    "MOTIONURL": "モーションURL",
+    "MOTIONURLONANSWER": "回答時のモーションURL",
+    "MOTIONURLONRING": "リング上のモーションURL",
+    "SERVICEID": "サービスID",
+    "SERVICENAME": "サービス名",
+    "TVOX": "TVox",
+    "TVOXIP": "TVoxIPアドレス",
+    "TVOXLOGINURL": "TVoxログインRESTUrl",
+    "TVOXPASSWD": "TVoxパスワード",
+    "TVOXSESSIONURL": "TVoxセッションRESTUrl",
+    "TVOXURL": "TVox IP URL",
+    "TVOXUSERNAME": "TVoxユーザー名"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/ko.json b/public/app/main/apps/chat/i18n/ko.json
index 00de2b9..736d5d8 100644
--- a/public/app/main/apps/chat/i18n/ko.json
+++ b/public/app/main/apps/chat/i18n/ko.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "필수 필드",
       "PRIVATEKEY_REQUIRED": "필수 필드",
       "PROJECTID_REQUIRED": "필수 필드",
-      "VIDAOOTOPIC_REQUIRED": "필수 필드"
+      "VIDAOOTOPIC_REQUIRED": "필수 필드",
+      "EMAIL_ACCOUNT_REQUIRED": "필수 필드"
     },
     "CM_FIELD": "CM 필드",
     "CHATPROACTIVEACTIONS": "채팅 사전 활동",
@@ -468,6 +469,21 @@
     "NOTE": "노트",
     "VIDAOOMETADATA": "Vidaoo 메타 데이터",
     "VIDAOONOTE": "Vidaoo Note",
-    "VIDAOOTOPIC": "Vidaoo 주제"
+    "VIDAOOTOPIC": "Vidaoo 주제",
+    "CHANNELID": "채널 ID",
+    "EDIT_TVOX": "TVox 편집",
+    "MOTIONTITLE": "모션 제목",
+    "MOTIONURL": "모션 URL",
+    "MOTIONURLONANSWER": "응답 시 모션 URL",
+    "MOTIONURLONRING": "링의 모션 URL",
+    "SERVICEID": "서비스 ID",
+    "SERVICENAME": "작업 명",
+    "TVOX": "티복스",
+    "TVOXIP": "동방신기 IP 주소",
+    "TVOXLOGINURL": "TVox 로그인 REST URL",
+    "TVOXPASSWD": "티복스 비밀번호",
+    "TVOXSESSIONURL": "TVox 세션 REST URL",
+    "TVOXURL": "동방신기 IP URL",
+    "TVOXUSERNAME": "TVox 사용자 이름"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/lt.json b/public/app/main/apps/chat/i18n/lt.json
index 2784f62..7e32b0d 100644
--- a/public/app/main/apps/chat/i18n/lt.json
+++ b/public/app/main/apps/chat/i18n/lt.json
@@ -249,7 +249,8 @@
       "CLIENTEMAIL_REQUIRED": "Privalomas laukas",
       "PRIVATEKEY_REQUIRED": "Privalomas laukas",
       "PROJECTID_REQUIRED": "Privalomas laukas",
-      "VIDAOOTOPIC_REQUIRED": "Privalomas laukas"
+      "VIDAOOTOPIC_REQUIRED": "Privalomas laukas",
+      "EMAIL_ACCOUNT_REQUIRED": "Privalomas laukas"
     },
     "CM_FIELD": "Kontaktų vadybininko laukas",
     "CHATPROACTIVEACTIONS": "Aktyvūs veiksmai",
@@ -468,6 +469,21 @@
     "NOTE": "Pastaba",
     "VIDAOOMETADATA": "„Vidaoo“ metaduomenys",
     "VIDAOONOTE": "„Vidaoo Note“",
-    "VIDAOOTOPIC": "„Vidaoo“ tema"
+    "VIDAOOTOPIC": "„Vidaoo“ tema",
+    "CHANNELID": "Kanalo ID",
+    "EDIT_TVOX": "Redaguoti TVox",
+    "MOTIONTITLE": "Pasiūlymo pavadinimas",
+    "MOTIONURL": "Judėjimo URL",
+    "MOTIONURLONANSWER": "Judesio URL į atsakymą",
+    "MOTIONURLONRING": "Judesio URL skambant",
+    "SERVICEID": "Paslaugos ID",
+    "SERVICENAME": "Paslaugos pavadinimas",
+    "TVOX": "TVox",
+    "TVOXIP": "„TVox“ IP adresas",
+    "TVOXLOGINURL": "TVox Prisijungimo REST Url",
+    "TVOXPASSWD": "TVox slaptažodis",
+    "TVOXSESSIONURL": "„TVox“ sesijos poilsio URL",
+    "TVOXURL": "„TVox“ IP adresas",
+    "TVOXUSERNAME": "„TVox“ vartotojo vardas"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/lv.json b/public/app/main/apps/chat/i18n/lv.json
index 0b83861..931a660 100644
--- a/public/app/main/apps/chat/i18n/lv.json
+++ b/public/app/main/apps/chat/i18n/lv.json
@@ -87,7 +87,8 @@
       "CLIENTEMAIL_REQUIRED": "Obligāts lauks",
       "PRIVATEKEY_REQUIRED": "Obligāts lauks",
       "PROJECTID_REQUIRED": "Obligāts lauks",
-      "VIDAOOTOPIC_REQUIRED": "Obligāts lauks"
+      "VIDAOOTOPIC_REQUIRED": "Obligāts lauks",
+      "EMAIL_ACCOUNT_REQUIRED": "Obligāts lauks"
     },
     "HELP": {
       "KEY": "Tīmekļa vietnes īss nosaukums (piecas rakstzīmes), kas ir attēlots cilnē Aģenti",
@@ -468,6 +469,21 @@
     "NOTE": "Piezīme",
     "VIDAOOMETADATA": "Vidaoo metadati",
     "VIDAOONOTE": "Vidaoo piezīme",
-    "VIDAOOTOPIC": "Vidaoo tēma"
+    "VIDAOOTOPIC": "Vidaoo tēma",
+    "CHANNELID": "Kanāla ID",
+    "EDIT_TVOX": "Rediģēt TVox",
+    "MOTIONTITLE": "Kustības nosaukums",
+    "MOTIONURL": "Kustības URL",
+    "MOTIONURLONANSWER": "Kustības URL uz atbildi",
+    "MOTIONURLONRING": "Kustības URL uz gredzenu",
+    "SERVICEID": "Pakalpojuma ID",
+    "SERVICENAME": "Pakalpojuma nosaukums",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP adrese",
+    "TVOXLOGINURL": "TVox pieteikšanās REST Url",
+    "TVOXPASSWD": "TVox parole",
+    "TVOXSESSIONURL": "TVox sesijas REST Url",
+    "TVOXURL": "TVox IP URL",
+    "TVOXUSERNAME": "TVox lietotājvārds"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/nl.json b/public/app/main/apps/chat/i18n/nl.json
index ce943b6..19585ca 100644
--- a/public/app/main/apps/chat/i18n/nl.json
+++ b/public/app/main/apps/chat/i18n/nl.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Verplicht veld",
       "PRIVATEKEY_REQUIRED": "Verplicht veld",
       "PROJECTID_REQUIRED": "Verplicht veld",
-      "VIDAOOTOPIC_REQUIRED": "Verplicht veld"
+      "VIDAOOTOPIC_REQUIRED": "Verplicht veld",
+      "EMAIL_ACCOUNT_REQUIRED": "Verplicht veld"
     },
     "CM_FIELD": "Contact Manager veld",
     "CHATPROACTIVEACTIONS": "Proactieve acties",
@@ -468,6 +469,21 @@
     "NOTE": "Opmerking",
     "VIDAOOMETADATA": "Vidaoo-metagegevens",
     "VIDAOONOTE": "Vidaoo Opmerking",
-    "VIDAOOTOPIC": "Vidaoo-onderwerp"
+    "VIDAOOTOPIC": "Vidaoo-onderwerp",
+    "CHANNELID": "Kanaal Nr",
+    "EDIT_TVOX": "TVox bewerken",
+    "MOTIONTITLE": "Bewegingstitel",
+    "MOTIONURL": "Bewegings-URL",
+    "MOTIONURLONANSWER": "Bewegings-URL bij antwoord",
+    "MOTIONURLONRING": "Bewegings-URL op bel",
+    "SERVICEID": "Service-ID",
+    "SERVICENAME": "Servicenaam",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP-adres",
+    "TVOXLOGINURL": "TVox Login REST URL",
+    "TVOXPASSWD": "TVox-wachtwoord",
+    "TVOXSESSIONURL": "TVox-sessie REST-URL",
+    "TVOXURL": "TVox IP-URL",
+    "TVOXUSERNAME": "TVox-gebruikersnaam"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/no.json b/public/app/main/apps/chat/i18n/no.json
index 179de89..a5dd7c4 100644
--- a/public/app/main/apps/chat/i18n/no.json
+++ b/public/app/main/apps/chat/i18n/no.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Obligatoriske felt",
       "PRIVATEKEY_REQUIRED": "Obligatoriske felt",
       "PROJECTID_REQUIRED": "Obligatoriske felt",
-      "VIDAOOTOPIC_REQUIRED": "Obligatoriske felt"
+      "VIDAOOTOPIC_REQUIRED": "Obligatoriske felt",
+      "EMAIL_ACCOUNT_REQUIRED": "Obligatoriske felt"
     },
     "CM_FIELD": "Kontakt leder",
     "CHATPROACTIVEACTIONS": "Proaktive tiltak",
@@ -468,6 +469,21 @@
     "NOTE": "Merk",
     "VIDAOOMETADATA": "Vidaoo Metadata",
     "VIDAOONOTE": "Vidaoo Merk",
-    "VIDAOOTOPIC": "Vidaoo Emne"
+    "VIDAOOTOPIC": "Vidaoo Emne",
+    "CHANNELID": "Kanal -ID",
+    "EDIT_TVOX": "Rediger TVox",
+    "MOTIONTITLE": "Bevegelsestittel",
+    "MOTIONURL": "Bevegelses -URL",
+    "MOTIONURLONANSWER": "Bevegelses -URL på svar",
+    "MOTIONURLONRING": "Bevegelses -URL på ring",
+    "SERVICEID": "Tjeneste -ID",
+    "SERVICENAME": "Tjenestenavn",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP -adresse",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "TVox -passord",
+    "TVOXSESSIONURL": "TVox Session REST url",
+    "TVOXURL": "TVox IP -URL",
+    "TVOXUSERNAME": "TVox brukernavn"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/pl.json b/public/app/main/apps/chat/i18n/pl.json
index 5867f6e..2c1c73a 100644
--- a/public/app/main/apps/chat/i18n/pl.json
+++ b/public/app/main/apps/chat/i18n/pl.json
@@ -165,7 +165,8 @@
       "CLIENTEMAIL_REQUIRED": "Pole obowiązkowe",
       "PRIVATEKEY_REQUIRED": "Pole obowiązkowe",
       "PROJECTID_REQUIRED": "Pole obowiązkowe",
-      "VIDAOOTOPIC_REQUIRED": "Pole obowiązkowe"
+      "VIDAOOTOPIC_REQUIRED": "Pole obowiązkowe",
+      "EMAIL_ACCOUNT_REQUIRED": "Pole obowiązkowe"
     },
     "CM_FIELD": "Pole Contact Manager",
     "CHATPROACTIVEACTIONS": "Działania proaktywne",
@@ -468,6 +469,21 @@
     "NOTE": "Uwaga",
     "VIDAOOMETADATA": "Metadane wideo",
     "VIDAOONOTE": "Notatka wideo",
-    "VIDAOOTOPIC": "Temat wideo"
+    "VIDAOOTOPIC": "Temat wideo",
+    "CHANNELID": "ID kanału",
+    "EDIT_TVOX": "Edytuj TVox",
+    "MOTIONTITLE": "Tytuł ruchu",
+    "MOTIONURL": "URL ruchu",
+    "MOTIONURLONANSWER": "Ruch URL po odpowiedzi",
+    "MOTIONURLONRING": "Ruch URL na dzwonku",
+    "SERVICEID": "Identyfikator usługi",
+    "SERVICENAME": "Nazwa serwisu",
+    "TVOX": "TVox",
+    "TVOXIP": "Adres IP TVox",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "Hasło TVox",
+    "TVOXSESSIONURL": "Adres URL REST sesji TVox",
+    "TVOXURL": "Adres IP TVox",
+    "TVOXUSERNAME": "Nazwa użytkownika TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/pt-BR.json b/public/app/main/apps/chat/i18n/pt-BR.json
index 3b5d3f5..121f315 100644
--- a/public/app/main/apps/chat/i18n/pt-BR.json
+++ b/public/app/main/apps/chat/i18n/pt-BR.json
@@ -245,7 +245,8 @@
       "CLIENTEMAIL_REQUIRED": "Campo Obrigatório",
       "PRIVATEKEY_REQUIRED": "Campo Obrigatório",
       "PROJECTID_REQUIRED": "Campo Obrigatório",
-      "VIDAOOTOPIC_REQUIRED": "Campo Obrigatório"
+      "VIDAOOTOPIC_REQUIRED": "Campo Obrigatório",
+      "EMAIL_ACCOUNT_REQUIRED": "Campo obrigatório"
     },
     "CM_FIELD": "Contact Manager Field",
     "CHATPROACTIVEACTIONS": "Ações proativas",
@@ -468,6 +469,21 @@
     "NOTE": "Observação",
     "VIDAOOMETADATA": "Vidaoo Metadata",
     "VIDAOONOTE": "Vidaoo Note",
-    "VIDAOOTOPIC": "Tema Vidaoo"
+    "VIDAOOTOPIC": "Tema Vidaoo",
+    "CHANNELID": "ID do canal",
+    "EDIT_TVOX": "Editar TVox",
+    "MOTIONTITLE": "Título de Movimento",
+    "MOTIONURL": "URL de movimento",
+    "MOTIONURLONANSWER": "URL de movimento na resposta",
+    "MOTIONURLONRING": "URL de movimento no anel",
+    "SERVICEID": "ID de serviço",
+    "SERVICENAME": "Nome do Serviço",
+    "TVOX": "TVox",
+    "TVOXIP": "Endereço IP da TVox",
+    "TVOXLOGINURL": "URL REST de login da TVox",
+    "TVOXPASSWD": "Senha TVox",
+    "TVOXSESSIONURL": "Url REST da sessão TVox",
+    "TVOXURL": "URL de TVox IP",
+    "TVOXUSERNAME": "Nome de usuário da TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/pt-PT.json b/public/app/main/apps/chat/i18n/pt-PT.json
index 12a153b..efce015 100644
--- a/public/app/main/apps/chat/i18n/pt-PT.json
+++ b/public/app/main/apps/chat/i18n/pt-PT.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Campo Obrigatório",
       "PRIVATEKEY_REQUIRED": "Campo Obrigatório",
       "PROJECTID_REQUIRED": "Campo Obrigatório",
-      "VIDAOOTOPIC_REQUIRED": "Campo Obrigatório"
+      "VIDAOOTOPIC_REQUIRED": "Campo Obrigatório",
+      "EMAIL_ACCOUNT_REQUIRED": "Campo obrigatório"
     },
     "CM_FIELD": "Campo Contact Manager",
     "CHATPROACTIVEACTIONS": "Ações proativas",
@@ -468,6 +469,21 @@
     "NOTE": "Observação",
     "VIDAOOMETADATA": "Vidaoo Metadata",
     "VIDAOONOTE": "Vidaoo Note",
-    "VIDAOOTOPIC": "Tema Vidaoo"
+    "VIDAOOTOPIC": "Tema Vidaoo",
+    "CHANNELID": "ID do canal",
+    "EDIT_TVOX": "Editar TVox",
+    "MOTIONTITLE": "Título de Movimento",
+    "MOTIONURL": "URL de movimento",
+    "MOTIONURLONANSWER": "URL de movimento na resposta",
+    "MOTIONURLONRING": "URL de movimento no anel",
+    "SERVICEID": "ID de serviço",
+    "SERVICENAME": "Nome do Serviço",
+    "TVOX": "TVox",
+    "TVOXIP": "Endereço IP da TVox",
+    "TVOXLOGINURL": "URL REST de login da TVox",
+    "TVOXPASSWD": "Senha TVox",
+    "TVOXSESSIONURL": "Url REST da sessão TVox",
+    "TVOXURL": "URL de TVox IP",
+    "TVOXUSERNAME": "Nome de usuário da TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/ru.json b/public/app/main/apps/chat/i18n/ru.json
index f51c2fa..e552477 100644
--- a/public/app/main/apps/chat/i18n/ru.json
+++ b/public/app/main/apps/chat/i18n/ru.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Обязательное поле",
       "PRIVATEKEY_REQUIRED": "Обязательное поле",
       "PROJECTID_REQUIRED": "Обязательное поле",
-      "VIDAOOTOPIC_REQUIRED": "Обязательное поле"
+      "VIDAOOTOPIC_REQUIRED": "Обязательное поле",
+      "EMAIL_ACCOUNT_REQUIRED": "Обязательное поле"
     },
     "CM_FIELD": "Контактное поле Менеджер",
     "CHATPROACTIVEACTIONS": "Профилактические меры",
@@ -468,6 +469,21 @@
     "NOTE": "Примечание",
     "VIDAOOMETADATA": "Метаданные Vidaoo",
     "VIDAOONOTE": "Примечание Vidaoo",
-    "VIDAOOTOPIC": "Тема Vidaoo"
+    "VIDAOOTOPIC": "Тема Vidaoo",
+    "CHANNELID": "ID канала",
+    "EDIT_TVOX": "Редактировать TVox",
+    "MOTIONTITLE": "Заголовок движения",
+    "MOTIONURL": "URL-адрес движения",
+    "MOTIONURLONANSWER": "URL-адрес движения при ответе",
+    "MOTIONURLONRING": "URL-адрес движения при звонке",
+    "SERVICEID": "ID услуги",
+    "SERVICENAME": "Наименование услуги",
+    "TVOX": "TVox",
+    "TVOXIP": "IP-адрес TVox",
+    "TVOXLOGINURL": "URL-адрес REST для входа в TVox",
+    "TVOXPASSWD": "Пароль TVox",
+    "TVOXSESSIONURL": "URL-адрес REST для сеанса TVox",
+    "TVOXURL": "IP-адрес TVox",
+    "TVOXUSERNAME": "Имя пользователя TVox"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/sv.json b/public/app/main/apps/chat/i18n/sv.json
index 8d146c2..f592afb 100644
--- a/public/app/main/apps/chat/i18n/sv.json
+++ b/public/app/main/apps/chat/i18n/sv.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Obligatoriskt fält",
       "PRIVATEKEY_REQUIRED": "Obligatoriskt fält",
       "PROJECTID_REQUIRED": "Obligatoriskt fält",
-      "VIDAOOTOPIC_REQUIRED": "Obligatoriskt fält"
+      "VIDAOOTOPIC_REQUIRED": "Obligatoriskt fält",
+      "EMAIL_ACCOUNT_REQUIRED": "Obligatoriskt fält"
     },
     "CM_FIELD": "Kontakthanterarfältet",
     "CHATPROACTIVEACTIONS": "Proaktiva åtgärder",
@@ -468,6 +469,21 @@
     "NOTE": "Notera",
     "VIDAOOMETADATA": "Vidaoo Metadata",
     "VIDAOONOTE": "Vidaoo Obs",
-    "VIDAOOTOPIC": "Vidaoo Ämne"
+    "VIDAOOTOPIC": "Vidaoo Ämne",
+    "CHANNELID": "Kanal -ID",
+    "EDIT_TVOX": "Redigera TVox",
+    "MOTIONTITLE": "Motionstitel",
+    "MOTIONURL": "Rörelse -URL",
+    "MOTIONURLONANSWER": "Rörelse -URL på svar",
+    "MOTIONURLONRING": "Rörelse -URL på ring",
+    "SERVICEID": "Service -ID",
+    "SERVICENAME": "Service namn",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP -adress",
+    "TVOXLOGINURL": "TVox Login REST Url",
+    "TVOXPASSWD": "TVox -lösenord",
+    "TVOXSESSIONURL": "TVox Session REST Url",
+    "TVOXURL": "TVox IP -URL",
+    "TVOXUSERNAME": "TVox Användarnamn"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/tr.json b/public/app/main/apps/chat/i18n/tr.json
index 82a4f3d..c2ac125 100644
--- a/public/app/main/apps/chat/i18n/tr.json
+++ b/public/app/main/apps/chat/i18n/tr.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "Zorunlu alan",
       "PRIVATEKEY_REQUIRED": "Zorunlu alan",
       "PROJECTID_REQUIRED": "Zorunlu alan",
-      "VIDAOOTOPIC_REQUIRED": "Zorunlu alan"
+      "VIDAOOTOPIC_REQUIRED": "Zorunlu alan",
+      "EMAIL_ACCOUNT_REQUIRED": "Zorunlu alan"
     },
     "CM_FIELD": "Kişi Yöneticisi Alan",
     "CHATPROACTIVEACTIONS": "Proaktif Eylemler",
@@ -468,6 +469,21 @@
     "NOTE": "Not",
     "VIDAOOMETADATA": "Vidaoo Meta Verileri",
     "VIDAOONOTE": "Video Notu",
-    "VIDAOOTOPIC": "Video Konusu"
+    "VIDAOOTOPIC": "Video Konusu",
+    "CHANNELID": "Kanal Kimliği",
+    "EDIT_TVOX": "TVox'u düzenle",
+    "MOTIONTITLE": "Hareket Başlığı",
+    "MOTIONURL": "Hareket URL'si",
+    "MOTIONURLONANSWER": "Cevapta Hareket URL'si",
+    "MOTIONURLONRING": "Ringde Hareket URL'si",
+    "SERVICEID": "Hizmet Kimliği",
+    "SERVICENAME": "Hizmet adı",
+    "TVOX": "TVox",
+    "TVOXIP": "TVox IP Adresi",
+    "TVOXLOGINURL": "TVox Giriş REST URL'si",
+    "TVOXPASSWD": "TVox Şifresi",
+    "TVOXSESSIONURL": "TVox Oturumu DİNLENME URL'si",
+    "TVOXURL": "TVox IP URL'si",
+    "TVOXUSERNAME": "Kullanıcı Adı"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/zh-CN.json b/public/app/main/apps/chat/i18n/zh-CN.json
index e83d4f1..9ce9db0 100644
--- a/public/app/main/apps/chat/i18n/zh-CN.json
+++ b/public/app/main/apps/chat/i18n/zh-CN.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "必填项",
       "PRIVATEKEY_REQUIRED": "必填项",
       "PROJECTID_REQUIRED": "必填项",
-      "VIDAOOTOPIC_REQUIRED": "必填项"
+      "VIDAOOTOPIC_REQUIRED": "必填项",
+      "EMAIL_ACCOUNT_REQUIRED": "必填项"
     },
     "CM_FIELD": "联系人管理器字段",
     "CHATPROACTIVEACTIONS": "积极主动的行动。",
@@ -468,6 +469,21 @@
     "NOTE": "笔记",
     "VIDAOOMETADATA": "维达元数据",
     "VIDAOONOTE": "视频笔记",
-    "VIDAOOTOPIC": "视频主题"
+    "VIDAOOTOPIC": "视频主题",
+    "CHANNELID": "频道编号",
+    "EDIT_TVOX": "编辑TVox",
+    "MOTIONTITLE": "动作标题",
+    "MOTIONURL": "运动网址",
+    "MOTIONURLONANSWER": "回答时的运动 URL",
+    "MOTIONURLONRING": "环上的运动 URL",
+    "SERVICEID": "服务编号",
+    "SERVICENAME": "服务名称",
+    "TVOX": "视讯",
+    "TVOXIP": "TVox IP 地址",
+    "TVOXLOGINURL": "TVox 登录 REST 网址",
+    "TVOXPASSWD": "天猫密码",
+    "TVOXSESSIONURL": "TVox 会话 REST 网址",
+    "TVOXURL": "TVox IP 网址",
+    "TVOXUSERNAME": "TVox 用户名"
   }
 }
diff --git a/public/app/main/apps/chat/i18n/zh-TW.json b/public/app/main/apps/chat/i18n/zh-TW.json
index fbaeca4..4fbe7b5 100644
--- a/public/app/main/apps/chat/i18n/zh-TW.json
+++ b/public/app/main/apps/chat/i18n/zh-TW.json
@@ -143,7 +143,8 @@
       "CLIENTEMAIL_REQUIRED": "必填項",
       "PRIVATEKEY_REQUIRED": "必填項",
       "PROJECTID_REQUIRED": "必填項",
-      "VIDAOOTOPIC_REQUIRED": "必填項"
+      "VIDAOOTOPIC_REQUIRED": "必填項",
+      "EMAIL_ACCOUNT_REQUIRED": "必填項"
     },
     "CM_FIELD": "Contact Manager 欄位",
     "CHATPROACTIVEACTIONS": "預防措施",
@@ -468,6 +469,21 @@
     "NOTE": "筆記",
     "VIDAOOMETADATA": "維達元數據",
     "VIDAOONOTE": "視頻筆記",
-    "VIDAOOTOPIC": "視頻主題"
+    "VIDAOOTOPIC": "視頻主題",
+    "CHANNELID": "頻道編號",
+    "EDIT_TVOX": "編輯TVox",
+    "MOTIONTITLE": "動作標題",
+    "MOTIONURL": "運動網址",
+    "MOTIONURLONANSWER": "回答時的運動 URL",
+    "MOTIONURLONRING": "環上的運動 URL",
+    "SERVICEID": "服務編號",
+    "SERVICENAME": "服務名稱",
+    "TVOX": "視訊",
+    "TVOXIP": "TVox IP 地址",
+    "TVOXLOGINURL": "TVox 登錄 REST 網址",
+    "TVOXPASSWD": "天貓密碼",
+    "TVOXSESSIONURL": "TVox 會話 REST 網址",
+    "TVOXURL": "TVox IP 網址",
+    "TVOXUSERNAME": "TVox 用戶名"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/ar.json b/public/app/main/apps/contactmanager/i18n/ar.json
index 8612dec..861c8fd 100644
--- a/public/app/main/apps/contactmanager/i18n/ar.json
+++ b/public/app/main/apps/contactmanager/i18n/ar.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / VAT",
     "RECALLME": "عاود الاتصال بي",
     "ACTIONTYPE": "نوع الإجراء",
-    "CLICKTOACTION": "انقر للعمل",
-    "ADDITIONAL_PHONES": "هواتف إضافية",
-    "UPDATE_EXISTING_CONTACTS": "تحديث جهات الاتصال الموجودة"
+    "CLICKTOACTION": "انقر للعمل"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/cs.json b/public/app/main/apps/contactmanager/i18n/cs.json
index c28e475..087457f 100644
--- a/public/app/main/apps/contactmanager/i18n/cs.json
+++ b/public/app/main/apps/contactmanager/i18n/cs.json
@@ -183,8 +183,6 @@
     "SOCIAL_CAPITAL": "Základní kapitál",
     "VATNUMBER_CF": "Codice Fiscale / DPH",
     "ACTIONTYPE": "Typ akce",
-    "CLICKTOACTION": "Klikněte na akci",
-    "ADDITIONAL_PHONES": "Další telefony",
-    "UPDATE_EXISTING_CONTACTS": "Aktualizujte stávající kontakty"
+    "CLICKTOACTION": "Klikněte na akci"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/da.json b/public/app/main/apps/contactmanager/i18n/da.json
index bc77b42..ab8a820 100644
--- a/public/app/main/apps/contactmanager/i18n/da.json
+++ b/public/app/main/apps/contactmanager/i18n/da.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice fiskal / moms",
     "RECALLME": "Husk mig",
     "ACTIONTYPE": "Handlingstype",
-    "CLICKTOACTION": "Klik for at handle",
-    "ADDITIONAL_PHONES": "Yderligere telefoner",
-    "UPDATE_EXISTING_CONTACTS": "Opdater eksisterende kontakter"
+    "CLICKTOACTION": "Klik for at handle"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/de.json b/public/app/main/apps/contactmanager/i18n/de.json
index 043259b..3c27f23 100644
--- a/public/app/main/apps/contactmanager/i18n/de.json
+++ b/public/app/main/apps/contactmanager/i18n/de.json
@@ -1,8 +1,8 @@
 {
   "CONTACTMANAGER": {
-    "VOICEQUEUEID": "Sprachwarteschlange ID",
-    "CAMPAIGNID": "Kampagne ID",
-    "STATE": "Zustand",
+    "VOICEQUEUEID": "ID Warteschlange für Sprachanrufe",
+    "CAMPAIGNID": "Kampagnen-ID",
+    "STATE": "Status",
     "NAME": "Name",
     "LISTS": "Listen",
     "UNIQUEID": "Eindeutige ID",
@@ -11,8 +11,8 @@
     "ENDTIME": "Endzeit",
     "MOTION_BULL": "Motion Bull",
     "HOPPER": "Hopper",
-    "FINAL": "Hopper Final",
-    "HISTORY": "Hopper Geschichte",
+    "FINAL": "Hopper final",
+    "HISTORY": "Hopper historisch",
     "SCHEDULEDAT": "Geplant am",
     "SEARCH_FOR_ANYONE": "Suche",
     "EDIT_LIST": "Liste bearbeiten",
@@ -21,30 +21,30 @@
     "DELETE_HOPPER": "Hopper löschen",
     "RELOAD": "Neu laden",
     "NO_COMPANIES": "Kein Unternehmen",
-    "NO_AVAILABLE_ITEMS": "Keine verfügbaren Artikel",
+    "NO_AVAILABLE_ITEMS": "Keine Einträge verfügbar",
     "ADD": "Hinzufügen",
     "ERRORS": {
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "FIRSTNAME_REQUIRED": "Der Vorname ist erforderlich",
-      "PHONE_REQUIRED": "Die Telefonnummer ist erforderlich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "FIRSTNAME_REQUIRED": "Vorname ist erforderlich",
+      "PHONE_REQUIRED": "Telefonnummer ist erforderlich",
       "ALIAS_REQUIRED": "Alias ist erforderlich",
-      "VALUE_REQUIRED": "Der Wert ist erforderlich",
+      "VALUE_REQUIRED": "Wert ist erforderlich",
       "EMAIL_MUST_VALID": "Falsches Format",
-      "PHONEBAR_API": "Prüfen, ob die MotionBar ausgeführt wird und der Fernbedienungsschalter für den Agenten eingeschaltet ist",
+      "PHONEBAR_API": "Statusprüfung für die MotionBar und des Remote-Switches für den Agenten",
       "ACTIONTYPE_REQUIRED": "Pflichtfeld",
       "CLICKTOACTION_REQUIRED": "Pflichtfeld"
     },
     "DESCRIPTION": "Beschreibung",
-    "DISPOSITION": "Disposition",
-    "DISPOSITIONS": "Dispositionen",
-    "VOICEDISPOSITIONS": "Sprachdispositionen",
-    "NEW_VOICEDISPOSITION": "Neue Sprachdisposition",
+    "DISPOSITION": "Qualifizierung",
+    "DISPOSITIONS": "Qualifizierungen",
+    "VOICEDISPOSITIONS": "Anrufqualifizierungen",
+    "NEW_VOICEDISPOSITION": "Neue Anrufqualifizierung",
     "CUSTOM_FIELDS": "Benutzerdefinierte Felder",
     "ADD_LIST": "Liste hinzufügen",
     "BACK": "Zurück",
     "SELECTED": "Ausgewählt",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Keine auswählen",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
     "COMPANIES": "Unternehmen",
     "EDIT_COMPANY": "Unternehmen bearbeiten",
     "DELETE_COMPANY": "Unternehmen löschen",
@@ -76,7 +76,7 @@
     "STREET": "Straße",
     "POSTALCODE": "Postleitzahl",
     "DELETE": "Löschen",
-    "DELETE_ALL": "Alle Löschen",
+    "DELETE_ALL": "Alles Löschen",
     "CONTACTMANAGER": "Kontaktmanager",
     "ID": "ID",
     "SETTINGS": "Einstellungen",
@@ -95,17 +95,17 @@
     "NEW_CONTACT": "Neuer Kontakt",
     "NEW_TAG": "Neuer Tag",
     "UPLOAD_CONTACTS": "Kontakte hochladen",
-    "FINISH": "Fertig",
-    "SUCCESS": "Erfolgreich",
+    "FINISH": "Beenden",
+    "SUCCESS": "Erfolg",
     "FAILURE": "Fehler",
     "ALL_CONTACTS": "Alle Kontakte",
     "NEW_CUSTOMFIELD": "Neues benutzerdefiniertes Feld",
-    "NO_VOICEDISPOSITION_AVAILABLE": "Keine Sprachdispositionen verfügbar",
-    "ADD_VOICEDISPOSITION": "Sprachdisposition hinzufügen",
-    "EDIT_VOICEDISPOSITION": "Sprachdisposition bearbeiten",
-    "DELETE_VOICEDISPOSITION": "Sprachdisposition löschen",
-    "VAT": "Mwst.",
-    "COMPANYID": "Ihre Unternehmens-ID",
+    "NO_VOICEDISPOSITION_AVAILABLE": "Keine Anrufqualifizierung verfügbar",
+    "ADD_VOICEDISPOSITION": "Anrufqualifizierung hinzufügen",
+    "EDIT_VOICEDISPOSITION": "Anrufqualifizierung bearbeiten",
+    "DELETE_VOICEDISPOSITION": "Anrufqualifizierung löschen",
+    "VAT": "Ust-ID.",
+    "COMPANYID": "Unternehmens-ID",
     "WEBSITE": "Website",
     "EMAIL_DOMAIN": "E-Mail Domain",
     "ADDRESS": "Adresse",
@@ -116,12 +116,12 @@
     "GOTOCONTACTS_COMPANY": "Kontakte anzeigen",
     "ADD_AGENT_TO_LIST": "Agenten zur Liste hinzufügen",
     "AGENTADD_LIST": "Agenten zur Liste hinzufügen",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
-    "NONE": "Keine",
+    "NO_AVAILABLE_INFO": "Keine verfügbaren Informationen",
+    "NONE": "Nichts",
     "FULLNAME": "Vollständiger Name",
-    "CHECK_DUPLICATES": "Duplikate prüfen",
+    "CHECK_DUPLICATES": "auf Duplikate prüfen",
     "DUPLICATES": "Duplikate",
-    "UPLOAD_CSV": "Hochladen von CSV",
+    "UPLOAD_CSV": "Hochladen von CSV-Datei",
     "TAG": "Tag",
     "UPLOAD": "Hochladen",
     "ALL_AGENTS": "Alle Agenten",
@@ -129,7 +129,7 @@
     "DATE_OF_BIRTH": "Geburtsdatum",
     "DATEOFBIRTH": "Geburtsdatum",
     "NOTES": "Notizen",
-    "EXPORTCSVCONTACTS_LIST": "In CSV exportieren",
+    "EXPORTCSVCONTACTS_LIST": "In CSV-Datei exportieren",
     "GOTO_LIST": "Kontakte anzeigen",
     "GOTO_COMPANY": "Kontakte anzeigen",
     "REQUIRED": "Erforderlich",
@@ -142,35 +142,35 @@
     "SESSIONS": "Sitzungen",
     "AGENT": "Agent",
     "PROJECT": "Projekt",
-    "SELECT_LIST": "Wählen Sie eine Liste aus",
-    "SELECT_COMPANY": "Wählen Sie ein Unternehmen aus",
-    "SELECT_TAGS": "Wählen Sie ein oder mehrere Tags aus",
+    "SELECT_LIST": "Liste auswählen",
+    "SELECT_COMPANY": "Unternehmen auswählen",
+    "SELECT_TAGS": "Tags auswählen",
     "HELP": {
-      "PHONEBAR_API": "Um Click-to-Call zu aktivieren, geben Sie eine Telefonnummer ein und überprüfen Sie, ob der Fernbedienungsschalter für den Agenten eingeschaltet ist",
-      "PHONEBAR_API_MESSAGE": "Um Click-to-Call zu aktivieren, geben Sie eine Telefonnummer ein und überprüfen Sie, ob der Fernbedienungsschalter für den Agenten eingeschaltet ist"
+      "PHONEBAR_API": "Um Click-to-Call zu aktivieren, geben Sie eine Telefonnummer ein und überprüfen Sie, ob der Remote-Switch für den Agenten eingeschaltet ist",
+      "PHONEBAR_API_MESSAGE": "Um Click-to-Call zu aktivieren, geben Sie eine Telefonnummer ein und überprüfen Sie, ob der Remote-Switch für den Agenten eingeschaltet ist"
     },
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
+    "OF": "von",
     "SOCIAL": "Social",
     "ROW": "Reihe",
-    "EXPORT_ERRORS": "Fehler exportieren",
+    "EXPORT_ERRORS": "Fehler-Log exportieren",
     "UPLOAD_COMPLETED": "Hochladen abgeschlossen",
     "STOP": "Stopp",
-    "SELECT_FILE": "Datei aussuchen",
+    "SELECT_FILE": "Datei auswählen",
     "IMPORT_CONTACTS": "Kontakte importieren",
     "MOTIONDIALER": "Motion Bull",
     "PREFIX": "Vorwahl wählen",
     "PRIORITY": "Priorität",
     "USERID": "Agent-ID abrufen",
-    "CUSTOMER_JOURNEY": "Kundenreise",
-    "SELECT_TAG": "Wählen Sie Tags aus",
+    "CUSTOMER_JOURNEY": "Kundenhistorie",
+    "SELECT_TAG": "Tag auswählen",
     "ALL": "Alle",
     "BILLINGINFORMATION": "Abrechnungsdaten",
     "COMPANY_FISCAL_TYPE": "Unternehmenssteuerart",
     "CREATE": "Erstellen",
     "EUROPE": "Europa",
-    "EXPIREDAY": "Ablauftage",
+    "EXPIREDAY": "Ablauftag",
     "FLATDISCOUNT": "Firmenrabatt",
     "INVOICEARTICLE": "Gesetzliche Artikel",
     "ISOCODE": "Nationaler ISO-Code",
@@ -180,11 +180,9 @@
     "RELATIONSHIPCOMPANY": " ... mit",
     "SDICODE": "SDI-Code",
     "SOCIAL_CAPITAL": "Aktienkapital",
-    "VATNUMBER_CF": "Codice Fiscale / VAT",
-    "RECALLME": "Ruf mich zurück",
+    "VATNUMBER_CF": "Umsatzsteuer Identnummer / VAT",
+    "RECALLME": "Rückruf anfordern",
     "ACTIONTYPE": "Aktionstyp",
-    "CLICKTOACTION": "Zur Aktion klicken",
-    "ADDITIONAL_PHONES": "Zusätzliche Telefone",
-    "UPDATE_EXISTING_CONTACTS": "Bestehende Kontakte aktualisieren"
+    "CLICKTOACTION": "Klicken für Aktion"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/en.json b/public/app/main/apps/contactmanager/i18n/en.json
index 539d138..ae09490 100644
--- a/public/app/main/apps/contactmanager/i18n/en.json
+++ b/public/app/main/apps/contactmanager/i18n/en.json
@@ -27,11 +27,9 @@
     "DELETE_LIST": "Delete List",
     "DELETE_HOPPER": "Delete Hopper",
     "RELOAD": "Reload",
-    "ADDITIONAL_PHONES": "Additional phones",
     "NO_COMPANIES": "No Company",
     "NO_AVAILABLE_ITEMS": "No Available Items",
     "ADD": "Add",
-    "UPDATE_EXISTING_CONTACTS": "Update existing contacts",
     "ERRORS": {
       "NAME_REQUIRED": "Mandatory field",
       "FIRSTNAME_REQUIRED": "Mandatory field",
diff --git a/public/app/main/apps/contactmanager/i18n/es.json b/public/app/main/apps/contactmanager/i18n/es.json
index 29762cd..8b2a387 100644
--- a/public/app/main/apps/contactmanager/i18n/es.json
+++ b/public/app/main/apps/contactmanager/i18n/es.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / IVA",
     "RECALLME": "Recordarme",
     "ACTIONTYPE": "Tipo de acción",
-    "CLICKTOACTION": "Click para actuar",
-    "ADDITIONAL_PHONES": "Teléfonos adicionales",
-    "UPDATE_EXISTING_CONTACTS": "Actualizar contactos existentes"
+    "CLICKTOACTION": "Click para actuar"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/et.json b/public/app/main/apps/contactmanager/i18n/et.json
index 9e5f8f6..d162619 100644
--- a/public/app/main/apps/contactmanager/i18n/et.json
+++ b/public/app/main/apps/contactmanager/i18n/et.json
@@ -183,8 +183,6 @@
     "SOCIAL_CAPITAL": "Osakapital",
     "VATNUMBER_CF": "Codice Fiscale / käibemaks",
     "ACTIONTYPE": "Toimingu tüüp",
-    "CLICKTOACTION": "Klõpsake toimimiseks",
-    "ADDITIONAL_PHONES": "Täiendavad telefonid",
-    "UPDATE_EXISTING_CONTACTS": "Värskendage olemasolevaid kontakte"
+    "CLICKTOACTION": "Klõpsake toimimiseks"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/fa.json b/public/app/main/apps/contactmanager/i18n/fa.json
index 957e91c..6940f14 100644
--- a/public/app/main/apps/contactmanager/i18n/fa.json
+++ b/public/app/main/apps/contactmanager/i18n/fa.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "کد مالیات / مالیات بر ارزش افزوده",
     "RECALLME": "مرا بخاطر بسپار",
     "ACTIONTYPE": "نوع اقدام",
-    "CLICKTOACTION": "برای اقدام کلیک کنید",
-    "ADDITIONAL_PHONES": "تلفن های اضافی",
-    "UPDATE_EXISTING_CONTACTS": "مخاطبین موجود را به روز کنید"
+    "CLICKTOACTION": "برای اقدام کلیک کنید"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/fi.json b/public/app/main/apps/contactmanager/i18n/fi.json
index add2e93..9f41da5 100644
--- a/public/app/main/apps/contactmanager/i18n/fi.json
+++ b/public/app/main/apps/contactmanager/i18n/fi.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / ALV",
     "RECALLME": "Muista minut",
     "ACTIONTYPE": "Toiminnan tyyppi",
-    "CLICKTOACTION": "Napsauta toimintaan",
-    "ADDITIONAL_PHONES": "Muut puhelimet",
-    "UPDATE_EXISTING_CONTACTS": "Päivitä olemassa olevat yhteystiedot"
+    "CLICKTOACTION": "Napsauta toimintaan"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/fr.json b/public/app/main/apps/contactmanager/i18n/fr.json
index edb9517..d4d07aa 100644
--- a/public/app/main/apps/contactmanager/i18n/fr.json
+++ b/public/app/main/apps/contactmanager/i18n/fr.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / TVA",
     "RECALLME": "Rappelle-moi",
     "ACTIONTYPE": "Type d'action",
-    "CLICKTOACTION": "Cliquez pour agir",
-    "ADDITIONAL_PHONES": "Téléphones supplémentaires",
-    "UPDATE_EXISTING_CONTACTS": "Mettre à jour les contacts existants"
+    "CLICKTOACTION": "Cliquez pour agir"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/he.json b/public/app/main/apps/contactmanager/i18n/he.json
index fb0d890..85fed91 100644
--- a/public/app/main/apps/contactmanager/i18n/he.json
+++ b/public/app/main/apps/contactmanager/i18n/he.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "שובר קוד / מע\"מ",
     "RECALLME": "חייג אליי",
     "ACTIONTYPE": "סוג פעולה",
-    "CLICKTOACTION": "לחץ לפעולה",
-    "ADDITIONAL_PHONES": "טלפונים נוספים",
-    "UPDATE_EXISTING_CONTACTS": "עדכן אנשי קשר קיימים"
+    "CLICKTOACTION": "לחץ לפעולה"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/hi.json b/public/app/main/apps/contactmanager/i18n/hi.json
index 53cc506..0731e09 100644
--- a/public/app/main/apps/contactmanager/i18n/hi.json
+++ b/public/app/main/apps/contactmanager/i18n/hi.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "कोडिस फिशले / वैट",
     "RECALLME": "मुझे याद करो",
     "ACTIONTYPE": "प्रक्रिया का प्रकार",
-    "CLICKTOACTION": "कार्रवाई के लिए क्लिक करें",
-    "ADDITIONAL_PHONES": "अतिरिक्त फोन",
-    "UPDATE_EXISTING_CONTACTS": "मौजूदा संपर्कों को अपडेट करें"
+    "CLICKTOACTION": "कार्रवाई के लिए क्लिक करें"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/hu.json b/public/app/main/apps/contactmanager/i18n/hu.json
new file mode 100644
index 0000000..ae09490
--- /dev/null
+++ b/public/app/main/apps/contactmanager/i18n/hu.json
@@ -0,0 +1,194 @@
+{
+  "CONTACTMANAGER": {
+    "SELECT_TAG": "Select tags",
+    "CUSTOMER_JOURNEY": "Customer Journey",
+    "USERID": "Recall Agent ID",
+    "PRIORITY": "Priority",
+    "MOTIONDIALER": "Motion Bull",
+    "IMPORT_CONTACTS": "Import Contacts",
+    "PREFIX": "Dial Prefix",
+    "VOICEQUEUEID": "VoiceQueue ID",
+    "CAMPAIGNID": "Campaign ID",
+    "STATE": "State",
+    "NAME": "Name",
+    "LISTS": "Lists",
+    "UNIQUEID": "Unique Id",
+    "STATUS": "Status",
+    "STARTTIME": "Start Time",
+    "ENDTIME": "End Time",
+    "MOTION_BULL": "Motion Bull",
+    "HOPPER": "Hopper",
+    "FINAL": "Hopper Final",
+    "HISTORY": "Hopper History",
+    "SCHEDULEDAT": "Scheduled At",
+    "SEARCH_FOR_ANYONE": "Search",
+    "EDIT_LIST": "Edit List",
+    "EDIT_HOPPER": "Edit Hopper",
+    "DELETE_LIST": "Delete List",
+    "DELETE_HOPPER": "Delete Hopper",
+    "RELOAD": "Reload",
+    "NO_COMPANIES": "No Company",
+    "NO_AVAILABLE_ITEMS": "No Available Items",
+    "ADD": "Add",
+    "ERRORS": {
+      "NAME_REQUIRED": "Mandatory field",
+      "FIRSTNAME_REQUIRED": "Mandatory field",
+      "PHONE_REQUIRED": "Mandatory field",
+      "ALIAS_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "CLICKTOACTION_REQUIRED": "Mandatory field",
+      "ACTIONTYPE_REQUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "PHONEBAR_API": "Check the MotionBar is running and the remote control switch for the agent is turned on"
+    },
+    "DESCRIPTION": "Description",
+    "DISPOSITION": "Disposition",
+    "DISPOSITIONS": "Dispositions",
+    "VOICEDISPOSITIONS": "Voice Dispositions",
+    "NEW_VOICEDISPOSITION": "New Voice Disposition",
+    "CUSTOM_FIELDS": "Custom Fields",
+    "ADD_LIST": "Add List",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "COMPANIES": "Companies",
+    "EDIT_COMPANY": "Edit Company",
+    "DELETE_COMPANY": "Delete Company",
+    "PHONE": "Phone",
+    "EMAIL": "Email",
+    "ADD_COMPANY": "Add Company",
+    "CONTACTS": "Contacts",
+    "NEW_LIST": "New List",
+    "FIRSTNAME": "First Name",
+    "LASTNAME": "Last Name",
+    "LIST": "List",
+    "COMPANY": "Company",
+    "ADD_CONTACT": "Add Contact",
+    "EDIT_CONTACT": "Edit Contact",
+    "MERGE_CONTACT": "Merge Contact",
+    "DUPLICATE_CONTACT": "Duplicate Contact",
+    "DELETE_CONTACT": "Delete Contact",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "DETAIL": "Detail",
+    "PERSONAL_INFO": "Personal Info",
+    "MOBILE": "Mobile",
+    "FAX": "Fax",
+    "TAGS": "Tags",
+    "SHOW_ALL_FIELDS": "Show all fields",
+    "FEWER_FIELDS": "Show less fields",
+    "COUNTRY": "Country",
+    "CITY": "City",
+    "STREET": "Street",
+    "POSTALCODE": "Postal Code",
+    "DELETE": "Delete",
+    "DELETE_ALL": "Delete All",
+    "CONTACTMANAGER": "Contacts Manager",
+    "ID": "Id",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "CUSTOMFIELDS": "Custom Fields",
+    "NO_CUSTOMFIELD_AVAILABLE": "No Custom Fields available",
+    "ADD_TAG": "Add Tag",
+    "NO_TAG": "No Tags",
+    "ALIAS": "Alias",
+    "CLICKTOACTION": "Click to action",
+    "ACTIONTYPE": "Action type",
+    "TYPE": "Type",
+    "VALUE": "Value",
+    "ADD_CUSTOMFIELD": "Add Custom Field",
+    "EDIT_CUSTOMFIELD": "Edit Custom Field",
+    "DELETE_CUSTOMFIELD": "Delete Custom Field",
+    "NEW_COMPANY": "New Company",
+    "NEW_CONTACT": "New Contact",
+    "NEW_TAG": "New Tag",
+    "UPLOAD_CONTACTS": "Upload Contacts",
+    "FINISH": "Finish",
+    "SUCCESS": "Success",
+    "FAILURE": "Failure",
+    "ALL_CONTACTS": "All Contacts",
+    "NEW_CUSTOMFIELD": "New Custom Field",
+    "NO_VOICEDISPOSITION_AVAILABLE": "No Voice Dispositions available",
+    "ADD_VOICEDISPOSITION": "Add Voice Disposition",
+    "EDIT_VOICEDISPOSITION": "Edit Voice Disposition",
+    "DELETE_VOICEDISPOSITION": "Delete Voice Disposition",
+    "VAT": "VAT",
+    "COMPANYID": "Company ID",
+    "WEBSITE": "Website",
+    "EMAIL_DOMAIN": "Email Domain",
+    "ADDRESS": "Address",
+    "POSTAL_CODE": "Postal Code",
+    "SHIPMENTADDRESS": "Shipment Address",
+    "COPY_CONTACT": "Copy Contact",
+    "GOTOCONTACTS_LIST": "Show Contacts",
+    "GOTOCONTACTS_COMPANY": "Show Contacts",
+    "ADD_AGENT_TO_LIST": "Add Agent to List",
+    "AGENTADD_LIST": "Add Agents to List",
+    "NO_AVAILABLE_INFO": "No available info",
+    "NONE": "None",
+    "ALL": "All",
+    "FULLNAME": "Full Name",
+    "CHECK_DUPLICATES": "Check Duplicates",
+    "DUPLICATES": "Duplicates",
+    "UPLOAD_CSV": "Upload CSV",
+    "TAG": "Tag",
+    "UPLOAD": "Upload",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "DATE_OF_BIRTH": "Birthdate",
+    "DATEOFBIRTH": "Birthdate",
+    "NOTES": "Notes",
+    "EXPORTCSVCONTACTS_LIST": "Export to CSV",
+    "GOTO_LIST": "Show Contacts",
+    "GOTO_COMPANY": "Show Contacts",
+    "REQUIRED": "Required",
+    "GLOBALCUSTOMFIELDS": "Global Custom Fields",
+    "NEW_GLOBALCUSTOMFIELD": "New Custom Fields",
+    "ADD_GLOBALCUSTOMFIELD": "Add Custom Field",
+    "EDIT_GLOBALCUSTOMFIELD": "Edit Custom Field",
+    "DELETE_GLOBALCUSTOMFIELD": "Delete Custom Field",
+    "JSCRIPTY": "Jscripty",
+    "SESSIONS": "Sessions",
+    "AGENT": "Agent",
+    "PROJECT": "Project",
+    "SELECT_LIST": "Select a list",
+    "SELECT_COMPANY": "Select a company",
+    "SELECT_TAGS": "Select one or more tags",
+    "HELP": {
+      "PHONEBAR_API_MESSAGE": "To enable click-to-call, insert a phone number and check the remote control switch for the Agent is turned on",
+      "PHONEBAR_API": "To enable click-to-call, insert a phone number and check the remote control switch for the Agent is turned on"
+    },
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "SOCIAL": "Social",
+    "ROW": "Row",
+    "EXPORT_ERRORS": "Export Errors",
+    "UPLOAD_COMPLETED": "Upload Completed",
+    "STOP": "Stop",
+    "SELECT_FILE": "Select File",
+    "BILLINGINFORMATION": "Billing Information",
+    "FLATDISCOUNT": "Company Discount",
+    "EUROPE": "Europe",
+    "ISOCODE": "ISO National Code",
+    "VATNUMBER_CF": "Codice Fiscale/VAT",
+    "PIVA": "VAT Number",
+    "SDICODE": "SDI Code",
+    "EXPIREDAY": "Expiration Days",
+    "INVOICEARTICLE": "Law Articles",
+    "PAYMENTMETHOD": "Payment Method",
+    "SOCIAL_CAPITAL": "Share Capital",
+    "COMPANY_FISCAL_TYPE": "Company Fiscal Type",
+    "RELATIONSHIP": "Relationship ...",
+    "RELATIONSHIPCOMPANY": " ... with",
+    "CREATE": "Create",
+    "RECALLME": "Recall Me",
+    "NOTIFICATIONS": {
+      "NO_DATA_ERROR": "Unable to retrieve any data",
+      "INTERACTION_OPEN_ERROR": "Unable to open the interaction",
+      "ACCOUNTS_GET_ERROR": "Unable to retrieve any {{channel}} account",
+      "JSCRIPTY_GET_ERROR": "Unable to retrieve any Jscripty project"
+    }
+  }
+}
diff --git a/public/app/main/apps/contactmanager/i18n/id.json b/public/app/main/apps/contactmanager/i18n/id.json
index 1d2b4af..d35e0ad 100644
--- a/public/app/main/apps/contactmanager/i18n/id.json
+++ b/public/app/main/apps/contactmanager/i18n/id.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / PPN",
     "RECALLME": "Ingat Saya",
     "ACTIONTYPE": "Tipe aksi",
-    "CLICKTOACTION": "Klik untuk bertindak",
-    "ADDITIONAL_PHONES": "Telepon tambahan",
-    "UPDATE_EXISTING_CONTACTS": "Perbarui kontak yang ada"
+    "CLICKTOACTION": "Klik untuk bertindak"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/it.json b/public/app/main/apps/contactmanager/i18n/it.json
index b0b7866..b442989 100644
--- a/public/app/main/apps/contactmanager/i18n/it.json
+++ b/public/app/main/apps/contactmanager/i18n/it.json
@@ -189,8 +189,6 @@
       "INTERACTION_OPEN_ERROR": "Impossibile aprire l'interazione",
       "ACCOUNTS_GET_ERROR": "Impossibile recuperare gli account {{channel}}",
       "JSCRIPTY_GET_ERROR": "Impossibile recuperare i progetti Jscripty"
-    },
-    "ADDITIONAL_PHONES": "Telefoni aggiuntivi",
-    "UPDATE_EXISTING_CONTACTS": "Aggiorna i contatti esistenti"
+    }
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/ja.json b/public/app/main/apps/contactmanager/i18n/ja.json
index ddd1ccd..c30555d 100644
--- a/public/app/main/apps/contactmanager/i18n/ja.json
+++ b/public/app/main/apps/contactmanager/i18n/ja.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / VAT",
     "RECALLME": "私を思い出して",
     "ACTIONTYPE": "アクションタイプ",
-    "CLICKTOACTION": "クリックしてアクション",
-    "ADDITIONAL_PHONES": "追加の電話",
-    "UPDATE_EXISTING_CONTACTS": "既存の連絡先を更新する"
+    "CLICKTOACTION": "クリックしてアクション"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/ko.json b/public/app/main/apps/contactmanager/i18n/ko.json
index 253584f..9b72f64 100644
--- a/public/app/main/apps/contactmanager/i18n/ko.json
+++ b/public/app/main/apps/contactmanager/i18n/ko.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / VAT",
     "RECALLME": "저를 기억하십시오",
     "ACTIONTYPE": "액션 유형",
-    "CLICKTOACTION": "클릭하여 실행",
-    "ADDITIONAL_PHONES": "추가 전화",
-    "UPDATE_EXISTING_CONTACTS": "기존 연락처 업데이트"
+    "CLICKTOACTION": "클릭하여 실행"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/lt.json b/public/app/main/apps/contactmanager/i18n/lt.json
index f437632..a060847 100644
--- a/public/app/main/apps/contactmanager/i18n/lt.json
+++ b/public/app/main/apps/contactmanager/i18n/lt.json
@@ -183,8 +183,6 @@
     "CREATE": "Sukurti",
     "RECALLME": "Prisimink mane",
     "ACTIONTYPE": "Veiksmo tipas",
-    "CLICKTOACTION": "Spustelėkite, kad veiktumėte",
-    "ADDITIONAL_PHONES": "Papildomi telefonai",
-    "UPDATE_EXISTING_CONTACTS": "Atnaujinkite esamus kontaktus"
+    "CLICKTOACTION": "Spustelėkite, kad veiktumėte"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/lv.json b/public/app/main/apps/contactmanager/i18n/lv.json
index e0fb700..b2c99a9 100644
--- a/public/app/main/apps/contactmanager/i18n/lv.json
+++ b/public/app/main/apps/contactmanager/i18n/lv.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / PVN",
     "RECALLME": "Atsaukt mani",
     "ACTIONTYPE": "Darbības veids",
-    "CLICKTOACTION": "Noklikšķiniet uz darbības",
-    "ADDITIONAL_PHONES": "Papildu tālruņi",
-    "UPDATE_EXISTING_CONTACTS": "Atjauniniet esošās kontaktpersonas"
+    "CLICKTOACTION": "Noklikšķiniet uz darbības"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/nl.json b/public/app/main/apps/contactmanager/i18n/nl.json
index ddc5fd1..9e54508 100644
--- a/public/app/main/apps/contactmanager/i18n/nl.json
+++ b/public/app/main/apps/contactmanager/i18n/nl.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / BTW",
     "RECALLME": "Herinner me",
     "ACTIONTYPE": "Actie type",
-    "CLICKTOACTION": "Klik voor actie",
-    "ADDITIONAL_PHONES": "Extra telefoons",
-    "UPDATE_EXISTING_CONTACTS": "Bestaande contacten bijwerken"
+    "CLICKTOACTION": "Klik voor actie"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/no.json b/public/app/main/apps/contactmanager/i18n/no.json
index f9f3053..f874119 100644
--- a/public/app/main/apps/contactmanager/i18n/no.json
+++ b/public/app/main/apps/contactmanager/i18n/no.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice fiskal / mva",
     "RECALLME": "Husk meg",
     "ACTIONTYPE": "Handlingstype",
-    "CLICKTOACTION": "Klikk for å handle",
-    "ADDITIONAL_PHONES": "Ekstra telefoner",
-    "UPDATE_EXISTING_CONTACTS": "Oppdater eksisterende kontakter"
+    "CLICKTOACTION": "Klikk for å handle"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/pl.json b/public/app/main/apps/contactmanager/i18n/pl.json
index c5060d5..9255631 100644
--- a/public/app/main/apps/contactmanager/i18n/pl.json
+++ b/public/app/main/apps/contactmanager/i18n/pl.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Kodek Fiscale / VAT",
     "RECALLME": "Przypomnij mi",
     "ACTIONTYPE": "Rodzaj działania",
-    "CLICKTOACTION": "Kliknij, aby wykonać czynność",
-    "ADDITIONAL_PHONES": "Dodatkowe telefony",
-    "UPDATE_EXISTING_CONTACTS": "Zaktualizuj istniejące kontakty"
+    "CLICKTOACTION": "Kliknij, aby wykonać czynność"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/pt-BR.json b/public/app/main/apps/contactmanager/i18n/pt-BR.json
index 8206079..8aa2d26 100644
--- a/public/app/main/apps/contactmanager/i18n/pt-BR.json
+++ b/public/app/main/apps/contactmanager/i18n/pt-BR.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / IVA",
     "RECALLME": "Lembre-me",
     "ACTIONTYPE": "Tipo de acão",
-    "CLICKTOACTION": "Clique para ação",
-    "ADDITIONAL_PHONES": "Telefones adicionais",
-    "UPDATE_EXISTING_CONTACTS": "Atualizar contatos existentes"
+    "CLICKTOACTION": "Clique para ação"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/pt-PT.json b/public/app/main/apps/contactmanager/i18n/pt-PT.json
index 042dae1..ca0c173 100644
--- a/public/app/main/apps/contactmanager/i18n/pt-PT.json
+++ b/public/app/main/apps/contactmanager/i18n/pt-PT.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / IVA",
     "RECALLME": "Lembre-me",
     "ACTIONTYPE": "Tipo de acão",
-    "CLICKTOACTION": "Clique para ação",
-    "ADDITIONAL_PHONES": "Telefones adicionais",
-    "UPDATE_EXISTING_CONTACTS": "Atualizar contatos existentes"
+    "CLICKTOACTION": "Clique para ação"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/ru.json b/public/app/main/apps/contactmanager/i18n/ru.json
index d0485dc..2fed7ee 100644
--- a/public/app/main/apps/contactmanager/i18n/ru.json
+++ b/public/app/main/apps/contactmanager/i18n/ru.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / НДС",
     "RECALLME": "Вспомни меня",
     "ACTIONTYPE": "Тип действия",
-    "CLICKTOACTION": "Нажмите, чтобы действовать",
-    "ADDITIONAL_PHONES": "Дополнительные телефоны",
-    "UPDATE_EXISTING_CONTACTS": "Обновить существующие контакты"
+    "CLICKTOACTION": "Нажмите, чтобы действовать"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/sv.json b/public/app/main/apps/contactmanager/i18n/sv.json
index aa8ff45..face0d9 100644
--- a/public/app/main/apps/contactmanager/i18n/sv.json
+++ b/public/app/main/apps/contactmanager/i18n/sv.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / VAT",
     "RECALLME": "Kom ihåg mig",
     "ACTIONTYPE": "Åtgärdstyp",
-    "CLICKTOACTION": "Klicka för att åtgärda",
-    "ADDITIONAL_PHONES": "Ytterligare telefoner",
-    "UPDATE_EXISTING_CONTACTS": "Uppdatera befintliga kontakter"
+    "CLICKTOACTION": "Klicka för att åtgärda"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/tr.json b/public/app/main/apps/contactmanager/i18n/tr.json
index 3c4f844..df04c8d 100644
--- a/public/app/main/apps/contactmanager/i18n/tr.json
+++ b/public/app/main/apps/contactmanager/i18n/tr.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale / KDV",
     "RECALLME": "Beni hatırla",
     "ACTIONTYPE": "Eylem Türü",
-    "CLICKTOACTION": "İşlem yapmak için tıklayın",
-    "ADDITIONAL_PHONES": "Ek telefonlar",
-    "UPDATE_EXISTING_CONTACTS": "Mevcut kişileri güncelle"
+    "CLICKTOACTION": "İşlem yapmak için tıklayın"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/zh-CN.json b/public/app/main/apps/contactmanager/i18n/zh-CN.json
index e069ff2..a9645c8 100644
--- a/public/app/main/apps/contactmanager/i18n/zh-CN.json
+++ b/public/app/main/apps/contactmanager/i18n/zh-CN.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale /增值税",
     "RECALLME": "召回我",
     "ACTIONTYPE": "动作类型",
-    "CLICKTOACTION": "点击操作",
-    "ADDITIONAL_PHONES": "附加电话",
-    "UPDATE_EXISTING_CONTACTS": "更新现有联系人"
+    "CLICKTOACTION": "点击操作"
   }
 }
diff --git a/public/app/main/apps/contactmanager/i18n/zh-TW.json b/public/app/main/apps/contactmanager/i18n/zh-TW.json
index 17c0e8d..fe0823a 100644
--- a/public/app/main/apps/contactmanager/i18n/zh-TW.json
+++ b/public/app/main/apps/contactmanager/i18n/zh-TW.json
@@ -183,8 +183,6 @@
     "VATNUMBER_CF": "Codice Fiscale /增值稅",
     "RECALLME": "召回我",
     "ACTIONTYPE": "動作類型",
-    "CLICKTOACTION": "點擊操作",
-    "ADDITIONAL_PHONES": "附加電話",
-    "UPDATE_EXISTING_CONTACTS": "更新現有聯繫人"
+    "CLICKTOACTION": "點擊操作"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/ar.json b/public/app/main/apps/dashboards/i18n/ar.json
index cdfe883..954aad6 100644
--- a/public/app/main/apps/dashboards/i18n/ar.json
+++ b/public/app/main/apps/dashboards/i18n/ar.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "إغلاق علامة تبويب الاتصال تلقائيًا بعد التخلص منها",
     "AGENT_PRESENCE": "حضور الوكيل",
     "SELECT_TEAM": "اختر فريق",
-    "AVAILABLE": "متوفرة"
+    "AVAILABLE": "متوفرة",
+    "CONFIRM": "يتأكد",
+    "FILTERS": "المرشحات",
+    "FILTER_CHAT_WEBSITES": "تصفية مواقع الدردشة",
+    "FILTER_FAX_ACCOUNTS": "تصفية حسابات الفاكس",
+    "FILTER_MAIL_ACCOUNTS": "تصفية حسابات البريد",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "تصفية الحسابات المفتوحة",
+    "FILTER_SMS_ACCOUNTS": "تصفية حسابات الرسائل القصيرة",
+    "FILTER_WHATSAPP_ACCOUNTS": "تصفية حسابات Whatsapp",
+    "SETFILTERS": "تعيين عوامل التصفية"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/cs.json b/public/app/main/apps/dashboards/i18n/cs.json
index b0683a9..a6ed12d 100644
--- a/public/app/main/apps/dashboards/i18n/cs.json
+++ b/public/app/main/apps/dashboards/i18n/cs.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Po likvidaci automaticky zavřete kartu kontaktů",
     "AGENT_PRESENCE": "Přítomnost agenta",
     "SELECT_TEAM": "Vybrat tým",
-    "AVAILABLE": "Dostupný"
+    "AVAILABLE": "Dostupný",
+    "CONFIRM": "Potvrdit",
+    "FILTERS": "Filtry",
+    "FILTER_CHAT_WEBSITES": "Filtrujte webové stránky chatu",
+    "FILTER_FAX_ACCOUNTS": "Filtrovat faxové účty",
+    "FILTER_MAIL_ACCOUNTS": "Filtrovat poštovní účty",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrovat účty Openchannel",
+    "FILTER_SMS_ACCOUNTS": "Filtrovat sms účty",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrujte účty Whatsapp",
+    "SETFILTERS": "Nastavit filtry"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/da.json b/public/app/main/apps/dashboards/i18n/da.json
index 7e1efa1..71ce7df 100644
--- a/public/app/main/apps/dashboards/i18n/da.json
+++ b/public/app/main/apps/dashboards/i18n/da.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Luk kontaktfanen automatisk efter bortskaffelse",
     "AGENT_PRESENCE": "Agent tilstedeværelse",
     "SELECT_TEAM": "Vælg Team",
-    "AVAILABLE": "Ledig"
+    "AVAILABLE": "Ledig",
+    "CONFIRM": "Bekræfte",
+    "FILTERS": "Filtre",
+    "FILTER_CHAT_WEBSITES": "Filtrer chatwebsteder",
+    "FILTER_FAX_ACCOUNTS": "Filtrer faxkonti",
+    "FILTER_MAIL_ACCOUNTS": "Filtrer postkonti",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrer Openchannel -konti",
+    "FILTER_SMS_ACCOUNTS": "Filtrer sms -konti",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrer Whatsapp -konti",
+    "SETFILTERS": "Indstil filtre"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/de.json b/public/app/main/apps/dashboards/i18n/de.json
index df9fabe..75de46d 100644
--- a/public/app/main/apps/dashboards/i18n/de.json
+++ b/public/app/main/apps/dashboards/i18n/de.json
@@ -1,10 +1,10 @@
 {
   "DASHBOARDS": {
-    "HOME": "Home",
+    "HOME": "Startseite",
     "CHAT": "Chat",
-    "MAIL": "Email",
-    "SMS": "Sms",
-    "OPENCHANNEL": "Open Channel",
+    "MAIL": "E-Mail",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Offener Kanal",
     "FAX": "Fax",
     "RATING": "Bewertung",
     "FEEDBACK": "Feedback",
@@ -15,54 +15,54 @@
     "AGENT": "Agent",
     "CREATED_AT": "Erstellt am",
     "CLOSED_AT": "Geschlossen am",
-    "DISPOSITION": "Disposition",
+    "DISPOSITION": "Qualifizierung",
     "CONTACT": "Kontakt",
     "INTERACTION": "Interaktion",
     "BROWSER_NAME": "Browser Name",
     "BROWSER_VERSION": "Browser Version",
-    "OS_NAME": "Name des Betriebssystems",
-    "OS_VERSION": "Version des Betriebssystems",
+    "OS_NAME": "Betriebssystem Name",
+    "OS_VERSION": "Betriebssystem Version",
     "DEVICE_MODEL": "Gerätemodell",
     "DEVICE_VENDOR": "Gerätehersteller",
     "DEVICE_TYPE": "Gerätetyp",
-    "RECALLME": "Ruf mich zurück",
-    "DROP_RATE": "Abgebrochene Anrufrate",
+    "RECALLME": "Rückruf anfordern",
+    "DROP_RATE": "Abbruchrate Anrufe",
     "DROPPED": "Abgebrochen",
-    "DROPPED_TEXT": "Abgebrochene Anrufe aus der Warteschlange",
+    "DROPPED_TEXT": "Abgebrochene Anrufe innerhalb der Warteschlange",
     "DETAIL": "Detail",
     "MOTION_BULL": "Motion Bull",
     "LIMITED": "Limitiert",
     "LIMITED_TEXT": "IVR-Kampagnen Anrufe getätigt/limitiert",
     "DASHBOARDS": "Dashboards",
-    "RECORDINGS": "Aufnahmen",
-    "TODAY_MOTION_BULL_STATS": "Warteschlangen-Kampagnen Tagesstatistiken",
+    "RECORDINGS": "Aufzeichnungen",
+    "TODAY_MOTION_BULL_STATS": "Tagesstatistiken Warteschlangen",
     "ORIGINATED": "Gewählt",
     "ORIGINATED_TEXT": "Anrufe aus der Warteschlange gewählt",
     "UPDATE": "Aktualisieren",
     "MORE": "Mehr",
     "MOTIONDIALER": "Motion Dialer",
-    "DISPOSE": "Entsorgen",
+    "DISPOSE": "Qualifizieren",
     "QUEUES": "Warteschlangen",
-    "DIALER_CALL": "Dialer Anruf",
+    "DIALER_CALL": "Dialer-Anruf",
     "ELAPSED_TIME": "Abgelaufene Zeit",
     "EDIT": "Bearbeiten",
     "MERGE": "Zusammenführen",
     "DUPLICATE": "Duplizieren",
     "UNIQUEID": "Eindeutige ID",
     "CAMPAIGN": "Kampagne",
-    "NONE": "Keine",
+    "NONE": "Nichts",
     "NAME": "Name",
     "ANSWER_MACHINE": "Anrufbeantworter",
     "INTERESTED": "Interessiert",
     "NOT_INTERESTED": "Kein Interesse",
     "PERSONAL_INFO": "Persönliche Infos",
     "SOLD": "Verkauft",
-    "SPECIAL": "Spezielle",
+    "SPECIAL": "Speziell",
     "BLACKLIST": "Blacklist",
-    "RESCHEDULE": "Verschieben",
+    "RESCHEDULE": "erneut Planen",
     "FIRSTNAME": "Vorname",
     "LASTNAME": "Nachname",
-    "MOBILE": "Mobile",
+    "MOBILE": "Mobilnummer",
     "DATE_OF_BIRTH": "Geburtsdatum",
     "COMPANY": "Unternehmen",
     "TAG": "Tag",
@@ -72,58 +72,58 @@
     "POSTALCODE": "Postleitzahl",
     "CUSTOM_FIELDS": "Benutzerdefinierte Felder",
     "GENERAL": "Allgemein",
-    "VOICE": "Sprache",
+    "VOICE": "Sprachanrufe",
     "TODAY_IVR_CAMPAIGNS_STATS": "IVR-Tagesstatistiken",
-    "TODAY_INBOUND_STATS": "Inbound Warteschlangen Tagesstatistiken",
-    "TODAY_OUTBOUND_STATS": "Outbound Warteschlangen Tagesstatistiken",
-    "WAITING": "Anrufe in der Warteschlange",
+    "TODAY_INBOUND_STATS": "Tagesstatistiken - eingehende Warteschlangen",
+    "TODAY_OUTBOUND_STATS": "Tagesstatistiken - ausgehende Warteschlangen",
+    "WAITING": "Anrufe in Warteschlange",
     "TALKING": "Im Gespräch",
-    "INBOUND_ANSWERED": "Angenommen",
-    "OUTBOUND_ANSWERED": "Angenommen",
-    "ABANDONED": "Verlassen",
-    "TOTAL_OFFERED": "Insgesamt",
+    "INBOUND_ANSWERED": "Angenommen eingehend",
+    "OUTBOUND_ANSWERED": "Angenommen ausgehend",
+    "ABANDONED": "Abgebrochen",
+    "TOTAL_OFFERED": "Gesamt angeboten",
     "AVG_HOLD_TIME": "Durchschnittliche Wartezeit",
-    "INBOUND_ANSWER_RATE": "Angenommene Anrufrate",
-    "OUTBOUND_ANSWER_RATE": "Angenommene Anrufrate",
-    "ABANDON_RATE": "Verlassene Anrufrate",
-    "UNMANAGED": "Nicht verwaltete",
-    "TOTAL": "Insgesamt",
+    "INBOUND_ANSWER_RATE": "Antwortrate eingehend",
+    "OUTBOUND_ANSWER_RATE": "Antwortrate ausgehend",
+    "ABANDON_RATE": "Abbruchrate",
+    "UNMANAGED": "Nicht bearbeitet",
+    "TOTAL": "Gesamt",
     "TOT_DURATION": "Gesamtdauer",
     "AVG_DURATION": "Durchschnittliche Dauer",
     "HELP": {
-      "ORIGINATEDLIMITED": "IVR Kampagnen gewählt/Limitiert",
-      "DROPPED": "Die Gesamtzahl abgebrochener Anrufe aus der Warteschlange",
-      "DROP_RATE": "Die Rate aller abgebrochener Anrufe aus der Warteschlange",
-      "WAITING": "Die Gesamtzahl der wartenden Anrufe aus der Warteschlange",
-      "OUTBOUND_ANSWERED": "Die Gesamtzahl der angenommenen ausgehenden Anrufe",
-      "ABANDONED": "Die Gesamtzahl der abgebrochenen Anrufe aus der Warteschlange",
-      "TOTAL_OFFERED": "Die Gesamtzahl der Warteschlangenanrufe (angenommen + verlassen + nicht verwaltet in der letzten Warteschlange des Datenflusses). Beachten Sie, dass Anrufe, die in ein IVR und nicht in eine Warteschlange eingehen, nicht berücksichtigt werden.",
-      "AVG_HOLD_TIME": "Die durchschnittliche Interaktionswartezeit, d.h. die durchschnittliche Wartezeit auf die Antwort eines Agenten für alle vorhandenen Interaktionen.",
-      "OUTBOUND_ANSWER_RATE": "Die Rate aller angenommenen ausgehenden Anrufe",
-      "ABANDON_RATE": "Die Rate aller verlassenen Anrufe aus der Warteschlange",
-      "UNMANAGED": "Die Gesamtzahl der nicht verwalteten Warteschlangenanfrufe für alle vorhandenen Warteschlangen. Es enthält die Anrufe, die durch Timeout, Joinempty, Leavewhenempty und Exitwithkey abgebrochen werden (siehe Asterisk-Dokumentation für weitere Informationen).",
-      "TOTAL": "Die Gesamtzahl der ausgehenden Anrufe",
-      "TOT_DURATION": "Die Gesamtdauer aller ausgehenden Anrufe",
-      "AVG_DURATION": "Die durchschnittliche Dauer aller angenommenen ausgehenden Anrufe",
-      "ORIGINATED": "Die Gesamtzahl der in den Warteschlangenkampagnen gewählten Anrufe",
-      "ABANDONED_RATE": "Die Rate aller abgebrochenen Interaktionen",
-      "AVG_MANAGED_TIME": "Die durchschnittliche verwaltete Interaktionszeit, nämlich die durchschnittliche Zeit, die während des Gesprächs verbracht wird",
-      "MANAGED": "Die Gesamtzahl der abgeschlossenen Interaktionen",
-      "MANAGED_RATE": "Die verwaltete Rate aller Interaktionen",
-      "OPENED": "Die Gesamtzahl der aktiven Interaktionen",
-      "UNMANAGED_RATE": "Die nicht verwaltete Rate aller Interaktionen",
-      "VOICE_ABANDONED": "Die Gesamtzahl der aufgegebenen Warteschlangenanrufe unter Berücksichtigung aller vorhandenen Warteschlangen. Beachten Sie, dass Anrufe, die wegen Timeout und joinempty abgebrochen werden, nicht berücksichtigt werden",
-      "VOICE_ANSWERED": "Die Gesamtzahl der abgeschlossenen Warteschlangenanrufe für alle vorhandenen Warteschlangen",
-      "VOICE_ANSWER_RATE": "Die Antwortrate aller Warteschlangenanrufe",
-      "VOICE_AVG_HOLD_TIME": "Die durchschnittliche Wartezeit für Warteschlangen, nämlich die durchschnittliche Wartezeit auf die Antwort eines Agenten für alle vorhandenen Warteschlangen",
-      "VOICE_AVG_TALK_TIME": "Die durchschnittliche Gesprächszeit in der Warteschlange, nämlich die durchschnittliche Gesprächszeit für alle vorhandenen Warteschlangen",
-      "VOICE_TALKING": "Die Gesamtzahl der aktiven Warteschlangenanrufe für alle vorhandenen Warteschlangen",
-      "VOICE_TOTAL_OFFERED": "Die Gesamtzahl der Warteschlangenanrufe (angenommen + verlassen + nicht verwaltet in der letzten Warteschlange des Datenflusses). Beachten Sie, dass Anrufe, die in ein IVR und nicht in eine Warteschlange eingehen, nicht berücksichtigt werden.",
-      "VOICE_UNMANAGED": "Die Gesamtzahl der nicht verwalteten Warteschlangenanfrufe für alle vorhandenen Warteschlangen. Es enthält die Anrufe, die durch Timeout, Joinempty, Leavewhenempty und Exitwithkey abgebrochen werden (siehe Asterisk-Dokumentation für weitere Informationen).",
-      "VOICE_WAITING": "Die Gesamtanzahl der wartenden Warteschlangenanrufe für alle vorhandenen Warteschlangen",
-      "MANDATORY_DISPOSITION_ENABLED": "Obligatorische Disposition für dieses Konto aktiviert",
-      "EXACT_MATCH_FILTER": "Suche nach einer genauen Übereinstimmung",
-      "LIKE_FILTER": "Suchen Sie nach dem angegebenen Muster"
+      "ORIGINATEDLIMITED": "IVR Kampagnen gewählt/limitiert",
+      "DROPPED": "Gesamtzahl abgebrochener Anrufe innerhalb der Warteschlange",
+      "DROP_RATE": "Abbruchrate aller Anrufe in der Warteschlange",
+      "WAITING": "Gesamtzahl der wartenden Anrufe aus der Warteschlange",
+      "OUTBOUND_ANSWERED": "Gesamtzahl der angenommenen ausgehenden Anrufe",
+      "ABANDONED": "Gesamtzahl der abgebrochenen Anrufe innerhalb der Warteschlange",
+      "TOTAL_OFFERED": "Gesamtzahl der angebotenen Anrufe in der Warteschlange (angenommen + abgebrochen + nicht bearbeitet in der letzten Warteschlange des Callflows). Hinweis: Anrufe innerhalb der IVR werden nicht berücksichtigt.",
+      "AVG_HOLD_TIME": "Durchschnittliche Wartezeit einer Interaktion bis zur Beantwortung durch einen Agenten.",
+      "OUTBOUND_ANSWER_RATE": "Rate aller angenommenen ausgehenden Anrufe",
+      "ABANDON_RATE": "Rate aller abgebrochener Anrufe innerhalb der Warteschlange",
+      "UNMANAGED": "Gesamtzahl der nicht bearbeiteten Anrufe für alle Warteschlangen. Enthält die Anrufe, die durch Timeout, Joinempty, Leavewhenempty und Exitwithkey abgebrochen wurden (siehe Asterisk-Dokumentation für weitere Informationen).",
+      "TOTAL": "Gesamtzahl der ausgehenden Anrufe",
+      "TOT_DURATION": "Gesamtdauer aller ausgehenden Anrufe",
+      "AVG_DURATION": "Durchschnittliche Dauer aller angenommenen ausgehenden Anrufe",
+      "ORIGINATED": "Gesamtzahl der in den Warteschlangen-Kampagnen gewählten Anrufe",
+      "ABANDONED_RATE": "Rate aller abgebrochenen Interaktionen",
+      "AVG_MANAGED_TIME": "Durchschnittliche Bearbeitungszeit einer Interaktion",
+      "MANAGED": "Gesamtzahl der abgeschlossenen Interaktionen",
+      "MANAGED_RATE": "Rate aller bearbeiteten Anrufe",
+      "OPENED": "Gesamtzahl der aktiven Interaktionen",
+      "UNMANAGED_RATE": "Rate aller unbearbeiteten Interaktionen",
+      "VOICE_ABANDONED": "Gesamtzahl der abgebrochenen Anrufe in der Warteschlange unter Berücksichtigung aller vorhandenen Warteschlangen. Hinweis: Anrufe, die wegen Timeout und joinempty abgebrochen wurden, werden nicht berücksichtigt.",
+      "VOICE_ANSWERED": "Gesamtzahl der abgeschlossenen Anrufe für alle vorhandenen Warteschlangen",
+      "VOICE_ANSWER_RATE": "Antwortrate aller Anrufe in der Warteschlange",
+      "VOICE_AVG_HOLD_TIME": "Durchschnittliche Wartezeit bis zur Beantwortung durch einen Agenten für alle vorhandenen Warteschlangen",
+      "VOICE_AVG_TALK_TIME": "Durchschnittliche Gesprächszeit für alle Anrufe aus der Warteschlange ",
+      "VOICE_TALKING": "Gesamtzahl der aktiven Anrufe für alle vorhandenen Warteschlangen",
+      "VOICE_TOTAL_OFFERED": "Gesamtzahl der Anrufe der Warteschlangen (angenommen + abgebrochen + nicht bearbeitet in der letzten Warteschlange des Callflows). Hinweis: Anrufe innerhalb der IVR werden nicht berücksichtigt.",
+      "VOICE_UNMANAGED": "Gesamtzahl der nicht bearbeiteten Anrufe für alle vorhandenen Warteschlangen. Enthält die Anrufe, die durch Timeout, Joinempty, Leavewhenempty und Exitwithkey abgebrochen wurden (siehe Asterisk-Dokumentation für weitere Informationen).",
+      "VOICE_WAITING": "Gesamtanzahl der aktuell wartenden Anrufe für alle vorhandenen Warteschlangen",
+      "MANDATORY_DISPOSITION_ENABLED": "Kontaktqualifizierung erforderlich",
+      "EXACT_MATCH_FILTER": "Suche nach einer genauen Übereinstimmung der Suchbegriffe",
+      "LIKE_FILTER": "Suche nach variablen Übereinstimmungen der Suchbegriffe"
     },
     "ERRORS": {
       "FIRSTNAME_REQUIRED": "Der erste Name ist erforderlich",
@@ -134,11 +134,11 @@
       "CAMPAIGN_REQUIRED": "Pflichtfeld",
       "FAILED_INITIALIZATION": "Fehler während der Initialisierung"
     },
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
-    "WELCOME_TO_MOTION": "Willkommen bei Motion",
+    "NO_AVAILABLE_INFO": "Keine Information vorhanden",
+    "WELCOME_TO_MOTION": "Willkommen zu Motion",
     "WELCOME_MESSAGE": "Verwenden Sie die linke Seitenleiste, um durch die verfügbaren Abschnitte zu navigieren",
     "ADD": "Hinzufügen",
-    "CONTACTMANAGER": "Contact Manager",
+    "CONTACTMANAGER": "Kontaktmanager",
     "DASHBOARD": "Dashboard",
     "EDIT_CONTACT": "Kontakt bearbeiten",
     "EMAIL": "E-Mail",
@@ -147,40 +147,40 @@
     "NEW_CONTACT": "Neuer Kontakt",
     "PHONE": "Telefon",
     "SAVE": "Speichern",
-    "INBOUND_WAITING_CALLS": "Eingehende Anrufe in der Warteschlange",
+    "INBOUND_WAITING_CALLS": "Wartende Anrufe (Eingehend)",
     "CONTACTS": "Kontakte",
     "MYCONTACTS": "Meine Kontakte",
     "ADD_CONTACT": "Kontakt hinzufügen",
-    "RELOAD": "Neu laden",
+    "RELOAD": "Neu Laden",
     "WAITING_TEXT": "Wartende Interaktionen",
-    "TALKING_TEXT": "Aktive Anrufe in der Warteschlange",
-    "INBOUND_ANSWERED_TEXT": "Angenommene Anrufe in der Warteschlange",
-    "ABANDONED_TEXT": "Verlassene Anrufe in der Warteschlange",
-    "DROP_RATE_TEXT": "Rate abgebrochener Anrufe in der Warteschlange",
-    "TOTAL_OFFERED_TEXT": "Gesamtzahl der Interaktionen",
-    "AVG_HOLD_TIME_TEXT": "Durchschnittliche Wartezeit der Interaktionen",
-    "AVG_TALK_TIME_TEXT": "Gesprächszeit der Warteschlangenanrufe",
-    "INBOUND_ANSWER_RATE_TEXT": "Rate angenommener Anrufe in der Warteschlange ",
-    "UNMANAGED_TEXT": "Nicht verwaltete Interaktionen",
-    "TOTAL_TEXT": "Gesamtzahl ausgehender Anrufe",
-    "OUTBOUND_ANSWERED_TEXT": "Ausgehende angenommene Anrufe ",
+    "TALKING_TEXT": "Aktive Anrufe",
+    "INBOUND_ANSWERED_TEXT": "Angenommene Anrufe",
+    "ABANDONED_TEXT": "Abgebrochene Anrufe",
+    "DROP_RATE_TEXT": "Abbruchrate",
+    "TOTAL_OFFERED_TEXT": "Gesamt angebotene Interaktionen",
+    "AVG_HOLD_TIME_TEXT": "Durchschnittliche Wartezeit",
+    "AVG_TALK_TIME_TEXT": "Durchschnittliche Gesprächszeit",
+    "INBOUND_ANSWER_RATE_TEXT": "Antwortrate ",
+    "UNMANAGED_TEXT": "Nicht bearbeitete Interaktionen",
+    "TOTAL_TEXT": "Gesamt ausgehende Anrufe",
+    "OUTBOUND_ANSWERED_TEXT": "Beantwortete Anrufe (Ausgehend) ",
     "TOT_DURATION_TEXT": "Gesamtdauer ausgehender Anrufe ",
     "AVG_DURATION_TEXT": "Durchschnittliche Dauer ausgehender Anrufe",
     "OUTBOUND_ANSWER_RATE_TEXT": "Rate angenommener ausgehender Anrufe",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
-    "REPLY_PLACEHOLDER": "Geben Sie ein und drücken Sie die Eingabetaste, um eine Nachricht zu senden",
+    "OF": "von",
+    "REPLY_PLACEHOLDER": "Text eingeben und ENTER drücken zum Senden",
     "CONTACT_INFO": "Kontaktinformationen",
-    "CLOSE_AND_DISPOSE": "Schließen und Entsorgen",
-    "DISPOSITIONS": "Dispositionen",
-    "CLOSE_WITHOUT_DISPOSE": "Schließen ohne Entsorgen",
-    "ACCEPT": "Akzeptieren",
+    "CLOSE_AND_DISPOSE": "Schließen und Qualifizieren",
+    "DISPOSITIONS": "Qualifizierungen",
+    "CLOSE_WITHOUT_DISPOSE": "Schließen ohne Qualifizierung",
+    "ACCEPT": "Annehmen",
     "REJECT": "Ablehnen",
     "CLOSED": "Geschlossen",
-    "INFO": "Info",
+    "INFO": "Information",
     "NOTE": "Hinweis",
-    "ACCEPT_ELSEWHERE": "Anderswo akzeptiert",
+    "ACCEPT_ELSEWHERE": "Von anderem Teilnehmer angenommen",
     "ATTENTION": "Achtung",
     "SOCIAL": "Sozial",
     "NO_JSCRIPTY_PROJECTS_AVAILABLE": "Keine Jscripty-Projekte verfügbar",
@@ -188,17 +188,17 @@
     "FILTER": "Filter",
     "SELECT_STATUS": "Status auswählen",
     "SELECT_ACCOUNT": "Konto auswählen",
-    "SELECT_WEBSITE": "Wählen Sie die Webseite",
-    "ALL": "Alle",
+    "SELECT_WEBSITE": "Webseite auswählen",
+    "ALL": "Alles",
     "INTERACTIONS": "Interaktionen",
-    "STARTEDAT": "Gestartet am",
+    "STARTEDAT": "Begonnen am",
     "STATUS": "Status",
     "OPEN": "Öffnen",
-    "SHOW": "Zeigen",
+    "SHOW": "Anzeigen",
     "ME": "ICH",
     "NOT_ASSIGNED": "Nicht zugewiesen",
     "UNKNOWN": "Unbekannt",
-    "SELECT_USER": "Wählen Sie einen Benutzer",
+    "SELECT_USER": "Benutzer auswählen",
     "LAST_MESSAGE": "Letzte Nachricht",
     "USER": "Benutzer",
     "TAGS": "Tags",
@@ -207,20 +207,20 @@
     "SOURCE": "Quelle",
     "DESTINATION": "Ziel",
     "CALLERID": "Anrufer-ID",
-    "END_AT": "Ende am",
+    "END_AT": "Beendet am",
     "DURATION": "Dauer",
     "SHOW_DETAILS": "Details anzeigen",
     "HIDE_DETAILS": "Details ausblenden",
     "EXTERNAL_URL": "Externer Link",
     "SET_AS": "Festlegen als",
     "PENDING": "Ausstehend",
-    "CANNED_ANSWER_NOT_FOUND": "Es wurden keine vordefinierten Antworten gefunden",
-    "CANNED_ANSWER_SEARCH": "Geben Sie einen Text ein, um eine vordefinierte Antwort zu suchen",
+    "CANNED_ANSWER_NOT_FOUND": "Keine Textbausteine gefunden",
+    "CANNED_ANSWER_SEARCH": "Hier nach einem Textbaustein suchen",
     "NO_MAIL_ACCOUNTS_AVAILABLE": "Keine E-Mail-Konten verfügbar",
     "NO_FAX_ACCOUNTS_AVAILABLE": "Keine Fax-Konten verfügbar",
     "NO_SMS_ACCOUNTS_AVAILABLE": "Keine SMS-Konten verfügbar",
-    "FILTER_VOICE_QUEUES": "Sprachwarteschlangen filtern",
-    "LOADING_INTERACTION": "Wir laden die Interaktion ...",
+    "FILTER_VOICE_QUEUES": "Anrufwarteschlangen filtern",
+    "LOADING_INTERACTION": "Interaktion wird geladen",
     "JANUARY": "Januar",
     "FEBRUARY": "Februar",
     "MARCH": "März",
@@ -253,109 +253,109 @@
     "SELECT_DATE": "Datum auswählen",
     "SELECT_DATE_RANGE": "Wählen Sie einen Datumsbereich",
     "CLEAR": "Löschen",
-    "CALL_NUMBER": "Anruf",
+    "CALL_NUMBER": "Anrufen",
     "TRANSFER_NUMBER": "Transfer",
-    "CALL_SAVED": "Anruf richtig gespeichert",
-    "CALL_DISPOSED": "Anruf richtig entsorgt",
-    "CHANNEL_WAITING_TEXT": "Wartende Warteschlangen-Interaktionen",
+    "CALL_SAVED": "Anruf erfolgreich gespeichert",
+    "CALL_DISPOSED": "Anruf erfolgreich qualifiziert",
+    "CHANNEL_WAITING_TEXT": "Wartende Interaktionen",
     "CHANNEL_QUEUE": "Warteschlange",
-    "CHANNEL_FROM": "Von",
+    "CHANNEL_FROM": "von",
     "MARK_AS_UNREAD": "Als ungelesen markieren",
-    "SELECT_AGENT": "Wählen Sie den Agenten aus",
+    "SELECT_AGENT": "Agenten auswählen",
     "READ": "Gelesen",
-    "SELECT_READ_UNREAD": "Wählen Sie Lesen/Ungelesen",
-    "SELECT_SUBSTATUS": "Wählen Sie Substatus",
+    "SELECT_READ_UNREAD": "Wählen ob Lesen/Ungelesen",
+    "SELECT_SUBSTATUS": "Zwischenstatus auswählen",
     "UNREAD": "Ungelesen",
-    "ABANDONAT": "Verlassen",
-    "ABANDONEDQUEUECALLS": "Verlassene Warteschlangenanrufe",
+    "ABANDONAT": "Abgebrochen",
+    "ABANDONEDQUEUECALLS": "Abgebrochene Anrufe",
     "FREE": "Frei",
     "LASTASSIGNEDTO": "Zuletzt zugewiesen an",
     "QUEUE": "Warteschlange",
     "QUEUECALLEREXITAT": "Abgebrochen",
     "QUEUECALLEREXITREASON": "Grund",
     "RESERVED": "Reserviert",
-    "SELECT_CAMPAIGN": "Wählen Sie eine Warteschlange",
+    "SELECT_CAMPAIGN": "Warteschlange auswählen",
     "ASSIGNTO": "Zuweisen",
-    "CLICKRELOAD": "Neue verlassene Anrufe! Bitte neu laden",
+    "CLICKRELOAD": "Verpasste Anrufe! Bitte Seite erneut laden",
     "NOTAVAILABLE": "Nicht verfügbar",
-    "CURRENTLY_IN_USE_BY": "Derzeit im Einsatz von",
-    "CUSTOMER_JOURNEY": "Kundenreise",
+    "CURRENTLY_IN_USE_BY": "Derzeit verwendet von",
+    "CUSTOMER_JOURNEY": "Kundenhistorie",
     "NO_DATA_AVAILABLE": "Keine Daten verfügbar",
     "AGENTS": "Agenten",
     "TRANSFER": "Transfer",
-    "NO_DISPOSITION_SET": "Keine Disposition festgelegt",
-    "ABANDONED_RATE": "Verlassene Rate",
-    "ABANDONED_RATE_TEXT": "Rate verlassener Interaktionen",
-    "AVG_MANAGED_TIME": " Durchschnittliche Verwaltungszeit",
-    "AVG_MANAGED_TIME_TEXT": "Durchschnittliche Verwaltungszeit der Interkationen",
-    "MANAGED": "Verwaltet",
-    "MANAGED_RATE": "Verwaltete Rate",
-    "MANAGED_RATE_TEXT": "Verwaltete Interaktionsrate",
-    "MANAGED_TEXT": "Verwaltete Interaktionen",
-    "OPENED_TEXT": "Geöffnete Interaktionen",
+    "NO_DISPOSITION_SET": "Keine Qualifizierungen definiert",
+    "ABANDONED_RATE": "Abbruchrate",
+    "ABANDONED_RATE_TEXT": "Rate der abgebrochenen Anrufe innerhalb der Warteschlange",
+    "AVG_MANAGED_TIME": "Durchschnittliche Bearbeitungszeit",
+    "AVG_MANAGED_TIME_TEXT": "Durchschnittliche Bearbeitungszeit aller Interkationen",
+    "MANAGED": "Bearbeitet",
+    "MANAGED_RATE": "Bearbeitungsrate",
+    "MANAGED_RATE_TEXT": "Rate der bearbeiteten Interaktionen",
+    "MANAGED_TEXT": "Interaktionen bearbeitet",
+    "OPENED_TEXT": "Interaktionen geöffnet",
     "TODAY_INTERACTIONS_STATS": "Interaktionen Tagesstatistiken",
-    "UNMANAGED_RATE": "Nicht verwaltete Rate",
-    "UNMANAGED_RATE_TEXT": "Nicht verwaltete Interaktionsate",
-    "VOICE_ABANDONED": "Verlassen",
-    "VOICE_ABANDONED_TEXT": "Verlassene Warteschlangenanrufe",
-    "VOICE_ABANDON_RATE": "Verlassene Rate",
-    "VOICE_ABANDON_RATE_TEXT": "Rate verlassener Warteschlangenanrufe",
+    "UNMANAGED_RATE": "Rate nicht Bearbeitet",
+    "UNMANAGED_RATE_TEXT": "Rate der nicht bearbeiteten Interaktionen in der Warteschlange",
+    "VOICE_ABANDONED": "Abgebrochen",
+    "VOICE_ABANDONED_TEXT": "Abgebrochene Anrufe innerhalb der Warteschlange",
+    "VOICE_ABANDON_RATE": "Abbruchrate",
+    "VOICE_ABANDON_RATE_TEXT": "Rate der abgebrochenen Anrufe innerhalb der Warteschlange",
     "VOICE_ANSWERED": "Angenommen",
     "VOICE_ANSWERED_TEXT": "Angenommene Anrufe in der Warteschlange",
-    "VOICE_ANSWER_RATE": "Angenommene Rate",
+    "VOICE_ANSWER_RATE": "Antwortrate",
     "VOICE_ANSWER_RATE_TEXT": "Rate angenommener Anrufe in der Warteschlange",
     "VOICE_AVG_HOLD_TIME": "Durchschnittliche Wartezeit",
-    "VOICE_AVG_HOLD_TIME_TEXT": "Queue ruft AVG HOLD TIME an",
+    "VOICE_AVG_HOLD_TIME_TEXT": "Durchschnittliche Wartezeit aller Sprachanrufe",
     "VOICE_AVG_TALK_TIME": "Durchschnittliche Gesprächszeit",
-    "VOICE_AVG_TALK_TIME_TEXT": "Gesprächszeit der Anrufe in der Warteschlage",
+    "VOICE_AVG_TALK_TIME_TEXT": "Durchschnittliche Gesprächszeit aller Anrufe nach der Warteschleife",
     "VOICE_TALKING": "IM GESPRÄCH",
     "VOICE_TALKING_TEXT": "Aktive Anrufe in der Warteschlange",
-    "VOICE_TOTAL_OFFERED": "Insgesamt",
-    "VOICE_TOTAL_OFFERED_TEXT": "Gesamtzahl der Anrufe in der Warteschlange",
-    "VOICE_UNMANAGED": "Nicht verwaltet",
-    "VOICE_UNMANAGED_TEXT": "Nicht verwaltete Anrufe in der Warteschlange",
+    "VOICE_TOTAL_OFFERED": "Gesamt angeboten",
+    "VOICE_TOTAL_OFFERED_TEXT": "Gesamtzahl der angebotenen Anrufe in der Warteschlange",
+    "VOICE_UNMANAGED": "Nicht bearbeitet",
+    "VOICE_UNMANAGED_TEXT": "Nicht bearbeitete Anrufe in der Warteschlange",
     "VOICE_WAITING": "Wartende Anrufe",
     "VOICE_WAITING_TEXT": "Wartende Anrufe in der Warteschlange",
     "DOWNLOAD": "Herunterladen",
     "SCHEDULED_CALLS": "Geplante Anrufe",
-    "PRIVATE": "Privat",
+    "PRIVATE": "Persönlich",
     "PUBLIC": "Öffentlich",
-    "PUBLIC_INTERACTION": "Die Interaktion ist öffentlich",
+    "PUBLIC_INTERACTION": "Öffentliche Interaktion",
     "VISIBILITY": "Sichtbarkeit",
-    "INTERACTION_CLOSED": "Interaktion korrekt geschlossen",
-    "INTERACTION_CLOSED_DISPOSED": "Interaktion korrekt geschlossen und entsorgt",
-    "INTERACTION_DISPOSED": "Interaktion korrekt entsorgt",
-    "ASSIGNED_TO_OTHERS": "An andere zugewiesen",
-    "SELECT_ALL": "Alle auswählen",
+    "INTERACTION_CLOSED": "Interaktion erfolgreich geschlossen",
+    "INTERACTION_CLOSED_DISPOSED": "Interaktion erfolgreich geschlossen und qualifiziert",
+    "INTERACTION_DISPOSED": "Interaktion erfolgreich qualifiziert",
+    "ASSIGNED_TO_OTHERS": "An Andere zugewiesen",
+    "SELECT_ALL": "Alles auswählen",
     "CHAT_INTERACTIONS": "Chat-Interaktionen",
     "FAX_INTERACTIONS": "Fax-Interaktionen",
-    "ID": "Id",
+    "ID": "ID",
     "MAIL_INTERACTIONS": "E-Mail-Interaktionen",
-    "OPENCHANNEL_INTERACTIONS": "Open Channel-Interaktionen",
+    "OPENCHANNEL_INTERACTIONS": "Offener-Kanal-Interaktionen",
     "SMS_INTERACTIONS": "SMS-Interaktionen",
-    "CANCEL": "Stornieren",
-    "DRAFT": "Entwurf",
-    "DRAFT_SAVE_WARNING_MESSAGE": "Für diese Interaktion ist bereits ein Entwurf gespeichert. Sind Sie sicher, dass Sie ihn überschreiben möchten?",
+    "CANCEL": "Abbrechen",
+    "DRAFT": "Entwurf speichern",
+    "DRAFT_SAVE_WARNING_MESSAGE": "Für diese Interaktion ist bereits ein Entwurf gespeichert. Möchten Sie diesen überschreiben?",
     "DRAFT_SAVE_WARNING_TITLE": "Vorhandenen Entwurf überschreiben?",
     "OVERWRITE": "Überschreiben",
     "SAVE_AS_DRAFT": "Als Entwurf speichern",
     "UNTITLED": "Ohne Titel",
     "UPDATE_DRAFT": "Entwurf aktualisieren",
     "NO_AVAILABLE_INTERACTION": "Keine Interaktionen verfügbar",
-    "ACCOUNTINGDOC": "Buchhaltung",
+    "ACCOUNTINGDOC": "Abrechnungsdokumente",
     "ADD_PRODUCTPRICELIST": "PRODUKT HINZUFÜGEN",
     "AGENTFULLNAME": "Agent",
     "ALL_COMPANIES": "Alle Unternehmen",
-    "ALL_PRODUCTS": "Alle",
-    "ALL_STATUS": "Alle",
-    "ALL_STEP": "Alle",
+    "ALL_PRODUCTS": "Alles",
+    "ALL_STATUS": "Alles",
+    "ALL_STEP": "Alles",
     "ALL_WORKFLOW": "Alle Arbeitsabläufe",
     "ATTENDACELASTINVOICE": "Letzte Rechnung",
     "ATTENDACENEXTINVOICE": "Nächste Rechnung",
     "AUTHORIZED": "AUTORISIERT",
     "AUTOINVOICE": "SELBSTABRECHNUNG",
     "AUTOPROFORMA": "SELBST-PROFORMA",
-    "BALANCE": "BALANCE",
+    "BALANCE": "SALDO",
     "BY": "Durch",
     "CLONEPROFORMA": "Klon",
     "COMPANIES": "Unternehmen",
@@ -386,7 +386,7 @@
     "DOSSIERS": "Dossiers",
     "DOSSIER_INFO": "Information",
     "ENDDATE": "Ablaufdatum",
-    "FROM": "Von",
+    "FROM": "von",
     "GRAPHINVOICES": "Diagramm der Rechnungsemission",
     "INASSET": "Kapital",
     "INVOICE": "RECHNUNG",
@@ -404,7 +404,7 @@
     "INVOICEPAYED": "Bezahlt",
     "INVOICES": "RECHNUNGEN",
     "INVOICESTATUS": "Status",
-    "INVOICETOTAL": "Insgesamt",
+    "INVOICETOTAL": "Gesamt",
     "INVOICE_INFO": "Rechnung",
     "MANAGESALES": "Abonnements",
     "MOVEASSET": "Kapital",
@@ -477,9 +477,9 @@
     "QUOTATIONSTATUS": "Status",
     "QUOTATIONSUBSCRIPTION": "Dauer",
     "QUOTATIONTAX": "MwSt",
-    "QUOTATIONTOTAL": "Insgesamt",
+    "QUOTATIONTOTAL": "Gesamt",
     "QUOTATIONTOTALPRICE": "Gesamt netto",
-    "QUOTATIONTOTALS": "Insgesamt",
+    "QUOTATIONTOTALS": "Gesamt",
     "QUOTATIONTOTALTAX": "Gesamtsteuer",
     "QUOTATIONUNIT": "Einheit",
     "QUOTATIONVAT": "VAT",
@@ -509,28 +509,28 @@
     "TOTALPAYMENTS": "Gesamtzahlungen",
     "UPDATED_AT": "Geändert am",
     "UPDATE_PRODUCT": "Produkt aktualisieren",
-    "WORKFLOW": "Wählen Sie einen Arbeitsablauf",
+    "WORKFLOW": "Arbeitsablauf wählen",
     "YEARS": "Jahre",
     "CUSTOMER_IP": "Ursprüngliche IP-Adresse",
     "CUSTOMER_PORT": "Ursprünglicher TCP-Port",
     "ADVANCED_SEARCH": "Erweiterte Suche",
-    "AND": "Und",
+    "AND": "und",
     "APPLY": "Anwenden",
-    "CONTAINS": "Enthält",
+    "CONTAINS": "enthält",
     "DISABLED": "Deaktiviert",
     "ENABLED": "Aktiviert",
     "ENDING_DATE": "Enddatum",
     "ENDING_VALUE": "Endwert",
-    "ENDS_WITH": "Endet mit",
-    "EQUALS": "Gleich",
-    "IS_AMONG": "Ist unter",
-    "IS_BETWEEN": "Ist zwischen",
-    "IS_GREATER_THAN": "Ist größer als",
-    "IS_GREATER_THAN_OR_EQUAL_TO": "Ist größer oder gleich",
-    "IS_LESS_THAN": "Ist kleiner als",
-    "IS_LESS_THAN_OR_EQUAL_TO": "Ist kleiner oder gleich",
-    "IS_NOT_AMONG": "Ist nicht unter",
-    "IS_NOT_EQUAL": "Ist nicht gleich",
+    "ENDS_WITH": "endet mit",
+    "EQUALS": "gleich",
+    "IS_AMONG": "ist unter",
+    "IS_BETWEEN": "ist zwischen",
+    "IS_GREATER_THAN": "ist größer als",
+    "IS_GREATER_THAN_OR_EQUAL_TO": "ist größer oder gleich",
+    "IS_LESS_THAN": "ist kleiner als",
+    "IS_LESS_THAN_OR_EQUAL_TO": "ist kleiner oder gleich",
+    "IS_NOT_AMONG": "ist nicht innerhalb",
+    "IS_NOT_EQUAL": "ist nicht gleich",
     "MEET_ALL_CONDITIONS": "Alle Bedingungen erfüllen",
     "MEET_ANY_CONDITIONS": "Mindestens eine Bedingung erfüllen",
     "NEW_CONDITION": "Neue Bedingung",
@@ -538,34 +538,44 @@
     "SELECT_OPERATOR": "Operator auswählen",
     "STARTING_DATE": "Startdatum",
     "STARTING_VALUE": "Startwert",
-    "STARTS_WITH": "Beginnt mit",
+    "STARTS_WITH": "beginnt mit",
     "VALUE": "Wert",
     "VALUES": "Werte",
     "VALUE_RANGE_CHECK": "Wert muss größer sein als",
-    "CHOOSE": "Wählen",
+    "CHOOSE": "Auswählen",
     "DOWNLOAD_WITHOUT_ATTACHMENTS": "Herunterladen ohne Anhänge",
     "DOWNLOAD_WITH_ATTACHMENTS": "Mit Anhängen herunterladen",
-    "SELECT_QUEUE": "Wählen Sie eine Warteschlange aus",
+    "SELECT_QUEUE": "Warteschlange auswählen",
     "VIDAOOSESSION": "Videoanruf starten",
     "WHATSAPP": "WhatsApp Connector",
-    "WHATSAPP_INTERACTIONS": "WhatsApp Connector-Interaktionen",
+    "WHATSAPP_INTERACTIONS": "WhatsApp-Interaktionen",
     "LAST_UPDATED": "Zuletzt aktualisiert",
     "MATCHING_FIELD": "Übereinstimmendes Feld",
     "MULTIPLE_CONTACTS_FOUND": "Mehrere Kontakte für Nummer gefunden",
-    "SELECT": "Wählen",
+    "SELECT": "Auswählen",
     "SELECT_CONTACT": "Kontakt auswählen",
-    "WHICH_ONE_TO_USE": "Welches möchten Sie verwenden?",
+    "WHICH_ONE_TO_USE": "Welcher Eintrag soll verwendet werden?",
     "NO_WHATSAPP_ACCOUNTS_AVAILABLE": "Kein WhatsApp-Konto verfügbar",
-    "SECOND_LEVEL_DISPOSITION": "Disposition der zweiten Ebene",
-    "THIRD_LEVEL_DISPOSITION": "Disposition der dritten Ebene",
+    "SECOND_LEVEL_DISPOSITION": "Qualifizierung der zweiten Ebene",
+    "THIRD_LEVEL_DISPOSITION": "Qualifizierung der dritten Ebene",
     "LICENSE_EXPIRE_REMAINING_DAYS": "Ihre Lizenz läuft bald ab! Bitte wenden Sie sich an Ihren Administrator",
     "CREATEDAT": "Hergestellt in",
     "ELAPSED_ANSWERED": "Verstrichene Zeit seit dem Start des Anrufs",
     "ELAPSED_DISPOSED": "Verstrichene Zeit seit Beendigung des Anrufs",
-    "LOST_CONNECTION": "Probleme mit der Netzwerkkonnektivität. Bitte überprüfe deine Internetverbindung.",
+    "LOST_CONNECTION": "Probleme mit der Netzwerkkonnektivität. Bitte Internetverbindung prüfen.",
     "NO_RESULTS_AVAILABLE": "Keine Ergebnisse verfügbar",
-    "AUTOCLOSE": "Schließen Sie die Kontaktlasche nach der Entsorgung automatisch",
-    "AGENT_PRESENCE": "Agentenpräsenz",
+    "AVAILABLE": "Erhältlich",
+    "CONFIRM": "Bestätigen Sie",
+    "FILTERS": "Filter",
+    "FILTER_CHAT_WEBSITES": "Chat-Websites filtern",
+    "FILTER_FAX_ACCOUNTS": "Faxkonten filtern",
+    "FILTER_MAIL_ACCOUNTS": "E-Mail-Konten filtern",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Openchannel-Konten filtern",
+    "FILTER_SMS_ACCOUNTS": "SMS-Konten filtern",
+    "FILTER_WHATSAPP_ACCOUNTS": "WhatsApp-Konten filtern",
+    "SETFILTERS": "Filter einstellen",
+    "AUTOCLOSE": "Tab nach Qualifizierung automatisch schließen",
+    "AGENT_PRESENCE": "Bereitschaftsstatus",
     "SELECT_TEAM": "Team auswählen",
     "AVAILABLE": "Erhältlich"
   }
diff --git a/public/app/main/apps/dashboards/i18n/en.json b/public/app/main/apps/dashboards/i18n/en.json
index 1851427..8e30a31 100644
--- a/public/app/main/apps/dashboards/i18n/en.json
+++ b/public/app/main/apps/dashboards/i18n/en.json
@@ -10,6 +10,10 @@
     "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
     "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments",
     "UNMANAGED_RATE": "Unmanaged Rate",
+    "PREVIEW_CALL_FOR": "Upcoming preview call for ",
+    "PREVIEW_CALL": "Preview call ",
+    "SCHEDULED_AT": "scheduled at ",
+    "LIST_NAME": "List name",
     "UNMANAGED_RATE_TEXT": "Interactions Unmanaged Rate",
     "VOICE_WAITING": "WAITING",
     "VOICE_WAITING_TEXT": "WAITING QUEUE CALLS",
@@ -73,6 +77,15 @@
     "SELECT_AGENT": "Select Agent",
     "MARK_AS_UNREAD": "Mark as unread",
     "FILTER_VOICE_QUEUES": "Filter Voice Queues",
+    "FILTER_CHAT_WEBSITES": "Filter Chat Websites",
+    "FILTER_SMS_ACCOUNTS": "Filter Sms Accounts",
+    "FILTER_FAX_ACCOUNTS": "Filter Fax Accounts",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filter Openchannel Accounts",
+    "FILTER_MAIL_ACCOUNTS": "Filter Mail Accounts",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filter Whatsapp Accounts",
+    "SETFILTERS": "Set Filters",
+    "FILTERS": "Filters",
+    "CONFIRM": "Confirm",
     "CHANNEL_WAITING_TEXT": "Waiting Queue Interactions",
     "CHANNEL_QUEUE": "Queue",
     "CHANNEL_FROM": "From",
diff --git a/public/app/main/apps/dashboards/i18n/es.json b/public/app/main/apps/dashboards/i18n/es.json
index 24e2fde..3314ce2 100644
--- a/public/app/main/apps/dashboards/i18n/es.json
+++ b/public/app/main/apps/dashboards/i18n/es.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Cerrar automáticamente la pestaña de contacto después de su eliminación",
     "AGENT_PRESENCE": "Presencia del agente",
     "SELECT_TEAM": "Selecciona un equipo",
-    "AVAILABLE": "Disponible"
+    "AVAILABLE": "Disponible",
+    "CONFIRM": "Confirmar",
+    "FILTERS": "Filtros",
+    "FILTER_CHAT_WEBSITES": "Filtrar sitios web de chat",
+    "FILTER_FAX_ACCOUNTS": "Filtrar cuentas de fax",
+    "FILTER_MAIL_ACCOUNTS": "Filtrar cuentas de correo",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrar cuentas de Openchannel",
+    "FILTER_SMS_ACCOUNTS": "Filtrar cuentas de SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrar cuentas de Whatsapp",
+    "SETFILTERS": "Establecer filtros"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/et.json b/public/app/main/apps/dashboards/i18n/et.json
index e584f60..ca0d646 100644
--- a/public/app/main/apps/dashboards/i18n/et.json
+++ b/public/app/main/apps/dashboards/i18n/et.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Pärast utiliseerimist sulgege kontaktikaart automaatselt",
     "AGENT_PRESENCE": "Agendi kohalolek",
     "SELECT_TEAM": "Valige Meeskond",
-    "AVAILABLE": "Saadaval"
+    "AVAILABLE": "Saadaval",
+    "CONFIRM": "Kinnitage",
+    "FILTERS": "Filtrid",
+    "FILTER_CHAT_WEBSITES": "Filtreeri vestluse veebisaite",
+    "FILTER_FAX_ACCOUNTS": "Faksikontode filtreerimine",
+    "FILTER_MAIL_ACCOUNTS": "Filtreerige meilikontosid",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtreerige avatud kanalite kontod",
+    "FILTER_SMS_ACCOUNTS": "Sms -kontode filtreerimine",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtreerige Whatsappi kontosid",
+    "SETFILTERS": "Määrake filtrid"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/fa.json b/public/app/main/apps/dashboards/i18n/fa.json
index 3f4c065..b490de0 100644
--- a/public/app/main/apps/dashboards/i18n/fa.json
+++ b/public/app/main/apps/dashboards/i18n/fa.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "پس از دفع ، به طور خودکار برگه تماس را ببندید",
     "AGENT_PRESENCE": "حضور نماینده",
     "SELECT_TEAM": "تیم را انتخاب کنید",
-    "AVAILABLE": "در دسترس"
+    "AVAILABLE": "در دسترس",
+    "CONFIRM": "تایید",
+    "FILTERS": "فیلترها",
+    "FILTER_CHAT_WEBSITES": "وب سایت های چت را فیلتر کنید",
+    "FILTER_FAX_ACCOUNTS": "فیلتر کردن حسابهای فکس",
+    "FILTER_MAIL_ACCOUNTS": "فیلتر کردن حساب های ایمیل",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "فیلتر کردن حساب های بازکن",
+    "FILTER_SMS_ACCOUNTS": "فیلتر کردن حساب های اس ام اس",
+    "FILTER_WHATSAPP_ACCOUNTS": "حساب های Whatsapp را فیلتر کنید",
+    "SETFILTERS": "تنظیم فیلترها"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/fi.json b/public/app/main/apps/dashboards/i18n/fi.json
index aa90057..618a712 100644
--- a/public/app/main/apps/dashboards/i18n/fi.json
+++ b/public/app/main/apps/dashboards/i18n/fi.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Sulje kosketusvälilehti automaattisesti hävittämisen jälkeen",
     "AGENT_PRESENCE": "Agentin läsnäolo",
     "SELECT_TEAM": "Valitse Tiimi",
-    "AVAILABLE": "Saatavilla"
+    "AVAILABLE": "Saatavilla",
+    "CONFIRM": "Vahvistaa",
+    "FILTERS": "Suodattimet",
+    "FILTER_CHAT_WEBSITES": "Suodata chat -verkkosivustot",
+    "FILTER_FAX_ACCOUNTS": "Suodata faksitilit",
+    "FILTER_MAIL_ACCOUNTS": "Suodata sähköpostitilit",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Suodata Openchannel -tilit",
+    "FILTER_SMS_ACCOUNTS": "Suodata tekstiviestit",
+    "FILTER_WHATSAPP_ACCOUNTS": "Suodata Whatsapp -tilit",
+    "SETFILTERS": "Aseta suodattimet"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/fr.json b/public/app/main/apps/dashboards/i18n/fr.json
index 6eb6d0a..c7cef89 100644
--- a/public/app/main/apps/dashboards/i18n/fr.json
+++ b/public/app/main/apps/dashboards/i18n/fr.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Fermer automatiquement l'onglet de contact après l'élimination",
     "AGENT_PRESENCE": "Présence d'agent",
     "SELECT_TEAM": "Choisis une équipe",
-    "AVAILABLE": "Disponible"
+    "AVAILABLE": "Disponible",
+    "CONFIRM": "Confirmer",
+    "FILTERS": "Filtres",
+    "FILTER_CHAT_WEBSITES": "Filtrer les sites de chat",
+    "FILTER_FAX_ACCOUNTS": "Filtrer les comptes de télécopie",
+    "FILTER_MAIL_ACCOUNTS": "Filtrer les comptes de messagerie",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrer les comptes Openchannel",
+    "FILTER_SMS_ACCOUNTS": "Filtrer les comptes SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrer les comptes Whatsapp",
+    "SETFILTERS": "Définir des filtres"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/he.json b/public/app/main/apps/dashboards/i18n/he.json
index 9544ca1..cb42c8c 100644
--- a/public/app/main/apps/dashboards/i18n/he.json
+++ b/public/app/main/apps/dashboards/i18n/he.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "סגור אוטומטית את לשונית אנשי הקשר לאחר סילוק",
     "AGENT_PRESENCE": "נוכחות סוכנים",
     "SELECT_TEAM": "תבחר קבוצה",
-    "AVAILABLE": "זמין"
+    "AVAILABLE": "זמין",
+    "CONFIRM": "לְאַשֵׁר",
+    "FILTERS": "מסננים",
+    "FILTER_CHAT_WEBSITES": "סנן אתרי צ'אט",
+    "FILTER_FAX_ACCOUNTS": "סנן חשבונות פקס",
+    "FILTER_MAIL_ACCOUNTS": "סנן חשבונות דואר",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "סנן חשבונות ערוצים",
+    "FILTER_SMS_ACCOUNTS": "סנן חשבונות SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "סנן חשבונות וואטסאפ",
+    "SETFILTERS": "הגדר מסננים"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/hi.json b/public/app/main/apps/dashboards/i18n/hi.json
index 9e0ed86..bfab87d 100644
--- a/public/app/main/apps/dashboards/i18n/hi.json
+++ b/public/app/main/apps/dashboards/i18n/hi.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "निपटान के बाद संपर्क टैब को स्वचालित रूप से बंद करें",
     "AGENT_PRESENCE": "एजेंट उपस्थिति",
     "SELECT_TEAM": "टीम का चयन",
-    "AVAILABLE": "उपलब्ध"
+    "AVAILABLE": "उपलब्ध",
+    "CONFIRM": "पुष्टि करें",
+    "FILTERS": "फिल्टर",
+    "FILTER_CHAT_WEBSITES": "चैट वेबसाइटों को फ़िल्टर करें",
+    "FILTER_FAX_ACCOUNTS": "फ़ैक्स खाते फ़िल्टर करें",
+    "FILTER_MAIL_ACCOUNTS": "मेल खातों को फ़िल्टर करें",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "ओपनचैनल खातों को फ़िल्टर करें",
+    "FILTER_SMS_ACCOUNTS": "एसएमएस खातों को फ़िल्टर करें",
+    "FILTER_WHATSAPP_ACCOUNTS": "व्हाट्सएप खातों को फ़िल्टर करें",
+    "SETFILTERS": "फ़िल्टर सेट करें"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/hu.json b/public/app/main/apps/dashboards/i18n/hu.json
new file mode 100644
index 0000000..f0ce997
--- /dev/null
+++ b/public/app/main/apps/dashboards/i18n/hu.json
@@ -0,0 +1,576 @@
+{
+  "DASHBOARDS": {
+    "VISIBILITY": "Visibility",
+    "PUBLIC": "Public",
+    "PRIVATE": "Private",
+    "PUBLIC_INTERACTION": "The interaction is public",
+    "LOST_CONNECTION": "Experiencing network connectivity issues. Please check your internet connection.",
+    "SCHEDULED_CALLS": "Scheduled Calls",
+    "DOWNLOAD": "Download",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments",
+    "UNMANAGED_RATE": "Unmanaged Rate",
+    "UNMANAGED_RATE_TEXT": "Interactions Unmanaged Rate",
+    "VOICE_WAITING": "WAITING",
+    "VOICE_WAITING_TEXT": "WAITING QUEUE CALLS",
+    "VOICE_TALKING": "TALKING",
+    "VOICE_TALKING_TEXT": "ACTIVE QUEUE CALLS",
+    "VOICE_ANSWERED": "ANSWERED",
+    "VOICE_ANSWERED_TEXT": "ANSWERED QUEUE CALLS",
+    "VOICE_ABANDONED": "ABANDONED",
+    "VOICE_ABANDONED_TEXT": "ABANDONED QUEUE CALLS",
+    "VOICE_TOTAL_OFFERED": "TOTAL OFFERED",
+    "VOICE_TOTAL_OFFERED_TEXT": "TOTAL QUEUE CALLS",
+    "TODAY_INTERACTIONS_STATS": "Interactions Daily Stats",
+    "VOICE_AVG_HOLD_TIME": "AVERAGE HOLD TIME",
+    "VOICE_AVG_HOLD_TIME_TEXT": "QUEUE CALLS AVG HOLD TIME",
+    "VOICE_AVG_TALK_TIME": "AVERAGE TALK TIME",
+    "VOICE_AVG_TALK_TIME_TEXT": "QUEUE CALLS TALK TIME",
+    "VOICE_ANSWER_RATE": "ANSWER RATE",
+    "VOICE_ANSWER_RATE_TEXT": "QUEUE CALLS ANSWER RATE",
+    "VOICE_ABANDON_RATE": "ABANDON RATE",
+    "VOICE_ABANDON_RATE_TEXT": "QUEUE CALLS ABANDON RATE",
+    "VOICE_UNMANAGED": "UNMANAGED",
+    "VOICE_UNMANAGED_TEXT": "UNMANAGED QUEUE CALLS",
+    "OPENED_TEXT": "Opened Interactions",
+    "MANAGED": "Managed",
+    "MANAGED_TEXT": "Managed Interactions",
+    "ABANDONED": "Abandoned",
+    "ABANDONED_TEXT": "Abandoned Interactions",
+    "ABANDONED_RATE": "Abandoned Rate",
+    "ABANDONED_RATE_TEXT": "Interactions Abandon Rate",
+    "TOTAL_OFFERED": "Total Offered",
+    "TOTAL_OFFERED_TEXT": "Offered Interactions",
+    "AVG_HOLD_TIME_TEXT": "Interactions AVG Hold Time",
+    "MANAGED_RATE": "Managed Rate",
+    "MANAGED_RATE_TEXT": "Interactions Managed Rate ",
+    "AVG_MANAGED_TIME": "AVG Management Time",
+    "AVG_MANAGED_TIME_TEXT": "Interactions AVG Management Time",
+    "NO_DISPOSITION_SET": "No disposition set",
+    "AGENTS": "Agents",
+    "TRANSFER": "Transfer",
+    "NO_DATA_AVAILABLE": "No data available",
+    "CUSTOMER_JOURNEY": "Customer Journey",
+    "ME": "Me",
+    "CURRENTLY_IN_USE_BY": "Currently in use by",
+    "NOTAVAILABLE": "Not available",
+    "CLICKRELOAD": "New abandoned calls! Reload please",
+    "ASSIGNTO": "Assign to",
+    "SELECT_QUEUE": "Select Queue",
+    "SELECT_CAMPAIGN": "Select Queue",
+    "FREE": "Free",
+    "RESERVED": "Reserved",
+    "QUEUECALLEREXITREASON": "Reason",
+    "QUEUECALLEREXITAT": "Dropped",
+    "LASTASSIGNEDTO": "Last Assigned To",
+    "ABANDONEDQUEUECALLS": "Abandoned Queue Calls",
+    "ABANDONAT": "Abandoned",
+    "QUEUE": "Queue",
+    "SELECT_SUBSTATUS": "Select Substatus",
+    "READ": "Read",
+    "UNREAD": "Unread",
+    "SELECT_READ_UNREAD": "Select Read/Unread",
+    "SELECT_AGENT": "Select Agent",
+    "MARK_AS_UNREAD": "Mark as unread",
+    "FILTER_VOICE_QUEUES": "Filter Voice Queues",
+    "CHANNEL_WAITING_TEXT": "Waiting Queue Interactions",
+    "CHANNEL_QUEUE": "Queue",
+    "CHANNEL_FROM": "From",
+    "LOADING_INTERACTION": "We are loading the interaction...",
+    "JANUARY": "January",
+    "FEBRUARY": "February",
+    "MARCH": "March",
+    "APRIL": "April",
+    "MAY": "May",
+    "JUNE": "June",
+    "JULY": "July",
+    "AUGUST": "August",
+    "SEPTEMBER": "September",
+    "OCTOBER": "October",
+    "NOVEMBER": "November",
+    "DECEMBER": "December",
+    "MON": "Mon",
+    "TUE": "Tue",
+    "WED": "Wed",
+    "THU": "Thu",
+    "FRI": "Fri",
+    "SAT": "Sat",
+    "SUN": "Sun",
+    "DELETE": "Delete",
+    "LAST_3_DAYS": "Last 3 Day",
+    "LAST_YEAR": "Last Year",
+    "THIS_YEAR": "This Year",
+    "LAST_MONTH": "Last Month",
+    "THIS_MONTH": "This Month",
+    "LAST_WEEK": "Last Week",
+    "THIS_WEEK": "This Week",
+    "YESTERDAY": "Yesterday",
+    "TODAY": "Today",
+    "SELECT_DATE": "Select Start Date",
+    "HOME": "Home",
+    "SET_AS": "Set As",
+    "PENDING": "Pending",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
+    "CANNED_ANSWER_SEARCH": "Enter a text to search a Canned Answer",
+    "TAGS": "Tags",
+    "SELECT_TAG": "Select Tag",
+    "TYPE": "Type",
+    "SOURCE": "Source",
+    "DESTINATION": "Destination",
+    "CALLERID": "Caller ID",
+    "END_AT": "End At",
+    "DURATION": "Duration",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "Sms",
+    "OPENCHANNEL": "Open Channel",
+    "FAX": "Fax",
+    "NOT_ASSIGNED": "Not Assigned",
+    "UNKNOWN": "Unknown",
+    "SELECT_USER": "Select User",
+    "LAST_MESSAGE": "Last message",
+    "USER": "User",
+    "RATING": "Rating",
+    "FEEDBACK": "Feedback",
+    "SUBJECT": "Subject",
+    "CUSTOMER_IP": "Originating IP Address",
+    "REFERER": "Referer",
+    "ACCOUNT": "Account",
+    "WEBSITE": "Website",
+    "AGENT": "Agent",
+    "CREATED_AT": "Created At",
+    "CLOSED_AT": "Closed At",
+    "DISPOSITION": "Disposition",
+    "CONTACT": "Contact",
+    "INTERACTION": "Interaction",
+    "BROWSER_NAME": "Browser Name",
+    "BROWSER_VERSION": "Browser Version",
+    "OS_NAME": "Operating System Name",
+    "OS_VERSION": "Operating System Version",
+    "DEVICE_MODEL": "Device Model",
+    "DEVICE_VENDOR": "Device Vendor",
+    "DEVICE_TYPE": "Device Type",
+    "RECALLME": "Recall Me",
+    "DROP_RATE": "Drop Rate",
+    "DROPPED": "Dropped",
+    "DROPPED_TEXT": "Dropped Queue Calls",
+    "DETAIL": "Detail",
+    "MOTION_BULL": "Motion Bull",
+    "LIMITED": "Limited",
+    "LIMITED_TEXT": "IVR Campaigns Calls Originated/Limit",
+    "DASHBOARDS": "Dashboards",
+    "RECORDINGS": "Recordings",
+    "TODAY_MOTION_BULL_STATS": "Queue Campaigns Daily Stats",
+    "ORIGINATED": "Originated",
+    "ORIGINATED_TEXT": "Queue Calls Originated",
+    "UPDATE": "Update",
+    "MORE": "More",
+    "MOTIONDIALER": "Motion Bull",
+    "DISPOSE": "Dispose",
+    "QUEUES": "Queues",
+    "DIALER_CALL": "Dialer Call",
+    "ELAPSED_TIME": "Elapsed Time",
+    "EDIT": "Edit",
+    "MERGE": "Merge",
+    "DUPLICATE": "Duplicate",
+    "UNIQUEID": "Uniqueid",
+    "AUTOCLOSE": "Automatically close contact tab after disposal",
+    "CAMPAIGN": "Campaign",
+    "NONE": "None",
+    "NAME": "Name",
+    "ANSWER_MACHINE": "Answer Machine",
+    "INTERESTED": "Interested",
+    "NOT_INTERESTED": "Not Interested",
+    "PERSONAL_INFO": "Personal Info",
+    "SOLD": "Sold",
+    "SPECIAL": "Special",
+    "BLACKLIST": "Blacklist",
+    "RESCHEDULE": "Reschedule",
+    "FIRSTNAME": "Firstname",
+    "LASTNAME": "Lastname",
+    "MOBILE": "Mobile",
+    "DATE_OF_BIRTH": "Birthdate",
+    "COMPANY": "Company",
+    "TAG": "Tag",
+    "COUNTRY": "Country",
+    "CITY": "City",
+    "STREET": "Address",
+    "POSTALCODE": "Postal Code",
+    "CUSTOM_FIELDS": "Custom Fields",
+    "GENERAL": "General",
+    "VOICE": "Voice",
+    "TODAY_IVR_CAMPAIGNS_STATS": "Daily Ivr Campaigns Stats",
+    "TODAY_INBOUND_STATS": "Inbound Queue Daily Stats",
+    "TODAY_OUTBOUND_STATS": "Outbound Daily Stats",
+    "WAITING": "Waiting",
+    "TALKING": "Talking",
+    "INBOUND_ANSWERED": "Answered",
+    "OUTBOUND_ANSWERED": "Answered",
+    "AVG_HOLD_TIME": "Average Hold Time",
+    "INBOUND_ANSWER_RATE": "Answer Rate",
+    "OUTBOUND_ANSWER_RATE": "Answer Rate",
+    "ABANDON_RATE": "Abandon Rate",
+    "UNMANAGED": "Unmanaged",
+    "TOTAL": "Total",
+    "TOT_DURATION": "Total Duration",
+    "AVG_DURATION": "Average Duration",
+    "HELP": {
+      "MANDATORY_DISPOSITION_ENABLED": "Mandatory disposition enabled for this account",
+      "UNMANAGED_RATE": "The Unmanaged Rate of all the Interactions",
+      "WAITING": "The total number of Waiting Interactions",
+      "OPENED": "The total number of Active Interactions",
+      "MANAGED": "The total number of Completed Interactions",
+      "ABANDONED": "The total number of Abandoned Interactions",
+      "TOTAL_OFFERED": "The total number of Interactions (completed + abandoned)",
+      "AVG_HOLD_TIME": "The Average Interaction Hold Time, namely the average time spent waiting for an agent to answer, for all the existing Interactions",
+      "AVG_MANAGED_TIME": "The Average Interaction Managed Time, namely the average time spent during conversation",
+      "MANAGED_RATE": "The Managed Rate of all the Interactions",
+      "ABANDONED_RATE": "The Abandon Rate of all the Interactions",
+      "UNMANAGED": "The total number of Unmanaged Interactions",
+      "VOICE_WAITING": "The total number of Waiting Queue Calls, for all the existing Queues",
+      "VOICE_TALKING": "The total number of Active Queue Calls, for all the existing Queues",
+      "VOICE_ANSWERED": "The total number of Completed Queue Calls, for all the existing Queues",
+      "VOICE_ABANDONED": "The total number of Abandoned Queue Calls, considering all the existing Queues. Note that the calls which are abandoned for timeout and joinempty will not be considered",
+      "VOICE_TOTAL_OFFERED": "The total number of Queue Calls (completed + abandoned + unmanaged in the last queue of the flow). Note that the calls which enter in an IVR and not in a queue, will not be considered",
+      "VOICE_AVG_TALK_TIME": "The Average Queue Talk Time, namely the average time spent during conversation, for all the existing Queues",
+      "VOICE_AVG_HOLD_TIME": "The Average Queue Hold Time, namely the average time spent waiting for an agent to answer, for all the existing Queues",
+      "VOICE_ANSWER_RATE": "The Answer Rate of all the Queue Calls",
+      "VOICE_UNMANAGED": "The total number of Unmanaged Queue Calls, for all the existing Queues. It includes the calls which are abandoned for timeout, joinempty, leavewhenempty and exitwithkey (cfr. asterisk doc for more information)",
+      "ORIGINATED": "Total number of calls dialed in the queue campaigns",
+      "ORIGINATEDLIMITED": "IVR Campaigns Calls Originated/Limit",
+      "DROPPED": "The total number of Dropped Queue Calls, for all the existing Queues",
+      "DROP_RATE": "The Drop Rate of all the Queue Calls",
+      "OUTBOUND_ANSWERED": "The total number of Completed Outbound Calls",
+      "OUTBOUND_ANSWER_RATE": "The Answer Rate of all the Outbound Calls",
+      "ABANDON_RATE": "The Abandon Rate of all the Queue Calls",
+      "TOTAL": "The total number of Outbound Calls",
+      "TOT_DURATION": "The total duration of all the Outbound Calls",
+      "AVG_DURATION": "The average duration of all the Completed Outbound Calls",
+      "EXACT_MATCH_FILTER": "Search for an exact match",
+      "LIKE_FILTER": "Search for the specified pattern"
+    },
+    "ERRORS": {
+      "CAMPAIGN_REQUIRED": "Mandatory field",
+      "FIRSTNAME_REQUIRED": "Mandatory field",
+      "PHONE_REQUIRED": "Mandatory field",
+      "DISPOSITION_REQUIRED": "Mandatory field",
+      "AGENT_REQUIRED": "Mandatory field",
+      "QUEUE_REQUIRED": "Mandatory field",
+      "FAILED_INITIALIZATION": "Error during initialization"
+    },
+    "NO_AVAILABLE_INFO": "No available info",
+    "WELCOME_TO_MOTION": "Welcome to Motion",
+    "WELCOME_MESSAGE": "Use the left sidebar to navigate through available sections",
+    "ADD": "Add",
+    "CONTACTMANAGER": "Contact Manager",
+    "DASHBOARD": "Dashboard",
+    "EDIT_CONTACT": "Edit contact",
+    "EMAIL": "Email",
+    "FULLNAME": "Fullname",
+    "CREATEDAT": "Created At",
+    "LIST": "List",
+    "NEW_CONTACT": "New Contact",
+    "PHONE": "Phone",
+    "SAVE": "Save",
+    "INBOUND_WAITING_CALLS": "Inbound Waiting Calls",
+    "CONTACTS": "Contacts",
+    "MYCONTACTS": "My Contacts",
+    "ADD_CONTACT": "Add Contact",
+    "RELOAD": "Reload",
+    "WAITING_TEXT": "Waiting Interactions",
+    "TALKING_TEXT": "Active Queue Calls",
+    "INBOUND_ANSWERED_TEXT": "Answered Queue Calls",
+    "DROP_RATE_TEXT": "Queue Calls Drop Rate",
+    "AVG_TALK_TIME_TEXT": "Queue Calls Talk Time",
+    "INBOUND_ANSWER_RATE_TEXT": "Queue Calls Answer Rate",
+    "UNMANAGED_TEXT": "Unmanaged Interactions",
+    "TOTAL_TEXT": "Total Outbound Calls",
+    "OUTBOUND_ANSWERED_TEXT": "Outbound Answered Calls",
+    "TOT_DURATION_TEXT": "Outbound Calls Total Duration",
+    "AVG_DURATION_TEXT": "Outbound Calls Average Duration",
+    "OUTBOUND_ANSWER_RATE_TEXT": "Outbound calls Answer Rate",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "REPLY_PLACEHOLDER": "Type and hit enter to send a message",
+    "CONTACT_INFO": "Contact Info",
+    "CLOSE_AND_DISPOSE": "Close and dispose",
+    "DISPOSITIONS": "Dispositions",
+    "CLOSE_WITHOUT_DISPOSE": "Close without dispose",
+    "ACCEPT": "Accept",
+    "REJECT": "Reject",
+    "CLOSED": "Closed",
+    "INFO": "Info",
+    "NOTE": "Note",
+    "ACCEPT_ELSEWHERE": "Accepted elsewhere",
+    "ATTENTION": "Attention",
+    "SOCIAL": "Social",
+    "NO_JSCRIPTY_PROJECTS_AVAILABLE": "No Jscripty Projects available",
+    "OPENED": "Open",
+    "FILTER": "Filter",
+    "SELECT_STATUS": "Select Status",
+    "SELECT_ACCOUNT": "Select Account",
+    "SELECT_WEBSITE": "Select Website",
+    "ALL": "All",
+    "INTERACTIONS": "Interactions",
+    "STARTEDAT": "Started At",
+    "STATUS": "Status",
+    "OPEN": "Open",
+    "SHOW": "Show",
+    "SHOW_DETAILS": "Show Details",
+    "HIDE_DETAILS": "Hide Details",
+    "EXTERNAL_URL": "External Link",
+    "NO_MAIL_ACCOUNTS_AVAILABLE": "No Email Accounts available",
+    "NO_FAX_ACCOUNTS_AVAILABLE": "No Fax Accounts available",
+    "NO_SMS_ACCOUNTS_AVAILABLE": "No SMS Accounts available",
+    "NO_WHATSAPP_ACCOUNTS_AVAILABLE": "No Whatsapp Account available",
+    "SELECT_DATE_RANGE": "Select Date Range",
+    "CLEAR": "Clear",
+    "CALL_NUMBER": "Call",
+    "TRANSFER_NUMBER": "Transfer",
+    "CALL_SAVED": "Call properly saved",
+    "CALL_DISPOSED": "Call properly disposed",
+    "CUSTOMER_PORT": "Originating TCP Port",
+    "INTERACTION_CLOSED": "Interaction properly closed",
+    "INTERACTION_DISPOSED": "Interaction properly disposed",
+    "INTERACTION_CLOSED_DISPOSED": "Interaction properly closed and disposed",
+    "SELECT_ALL": "Select all",
+    "ASSIGNED_TO_OTHERS": "Assigned to others",
+    "ID": "Id",
+    "CHAT_INTERACTIONS": "Chat Interactions",
+    "MAIL_INTERACTIONS": "Email Interactions",
+    "SMS_INTERACTIONS": "SMS Interactions",
+    "OPENCHANNEL_INTERACTIONS": "Open Channel Interactions",
+    "FAX_INTERACTIONS": "Fax Interactions",
+    "DRAFT": "Draft",
+    "DRAFT_SAVE_WARNING_TITLE": "Overwrite existing draft?",
+    "DRAFT_SAVE_WARNING_MESSAGE": "There is already a draft saved for this interaction. Are you sure you want to overwrite it?",
+    "OVERWRITE": "Overwrite",
+    "CANCEL": "Cancel",
+    "UNTITLED": "Untitled",
+    "SAVE_AS_DRAFT": "Save as draft",
+    "UPDATE_DRAFT": "Update draft",
+    "NO_AVAILABLE_INTERACTION": "No available interaction",
+    "DOSSIERS": "Dossiers",
+    "DOSSIER": "Dossier",
+    "DOSSIER_INFO": "Information",
+    "SELECT_COMPANY": "Select Company",
+    "DOSSIERNAME": "Dossier Name",
+    "OPENDATE": "Open Date",
+    "ALL_COMPANIES": "All Companies",
+    "SELECT_WORKFLOW": "Select Workflow",
+    "WORKFLOW": "Select Workflow",
+    "SELECT_WORKFLOWSTEPS": "Select Workflow State",
+    "ALL_WORKFLOW": "All Workflow",
+    "STATE": "State",
+    "STEP": "Step",
+    "NEW_DOSSIER": "New Dossier",
+    "PRICELIST": "Price List",
+    "PRODUCTFILTERNAME": "Filter Name",
+    "PRODUCTNAME": "Product",
+    "PRODUCTINQUOTATION": "PRODUCT DETAILS",
+    "REQUEST": "REQUEST",
+    "QUOTATION": "QUOTATION",
+    "DOSSIERID": "Dossier ID",
+    "QUOTATIONNAME": "Quotation Name",
+    "QUOTATIONNOTES": "Quotation Notes",
+    "QUOTATIONSTATUS": "State",
+    "REQUESTNAME": "Request Name",
+    "REQUESTNOTES": "Request Notes",
+    "ALL_STEP": "All",
+    "UPDATED_AT": "Modified on",
+    "BY": "By",
+    "ORDER": "Order",
+    "PROFORMA": "PROFORMA",
+    "INVOICE": "INVOICE",
+    "REQUESTID": "Request",
+    "QUOTATIONID": "Offer",
+    "ORDERID": "Order",
+    "PRICELISTNAME": "Price List",
+    "PRODUCTCODE": "Product Code",
+    "PRICELISTNETPRICE": "Net Price",
+    "PRICELISTDISCOUNT": "Price list discount",
+    "QUOTATIONQTY": "Quantity",
+    "QUOTATIONTAX": "Tax",
+    "QUOTATIONPROFORMAID": "Proforma ID",
+    "QUOTATIONINVOICEID": "Invoice ID",
+    "QUOTATIONDISCOUNT": "Quotation Discount",
+    "ORDER_INFO": "Order",
+    "REQUEST_INFO": "Request",
+    "QUOTATION_INFO": "Quotation",
+    "ORDERCLIENTCODE": "Customer Code",
+    "ORDERNOTES": "Note",
+    "PROFORMANAME": "Proforma name",
+    "AGENTFULLNAME": "Agent",
+    "PROFORMANOTES": "Note",
+    "PRODUCTINPROFORMA": "Products in proforma",
+    "INVOICENAME": "Invoice Name",
+    "INVOICENOTES": "Note",
+    "DOSSIERNOTES": "Note",
+    "QUOTATIONTOTALPRICE": "Total net",
+    "QUOTATIONTOTALTAX": "Total tax",
+    "PROFORMA_INFO": "Proforma",
+    "PROFORMAID": "Id Proforma",
+    "PRICESALELISTNETPRICE": "Prezzo listino",
+    "PROFORMASTATUS": "State",
+    "INVOICESTATUS": "State",
+    "NO_PRODUCTINVOICE_AVAILABLE": "No product",
+    "INVOICEID": "Invoice",
+    "PRODUCTNOTE": "Note",
+    "INVOICE_INFO": "Invoice",
+    "COMPANYSTREET": "Address",
+    "COMPANYCITY": "City",
+    "COMPANYPOSTALCODE": "Postal Code",
+    "COMPANYCOUNTRY": "Country",
+    "COMPANYFAX": "Fax",
+    "COMPANYVAT": "Fiscal Code/VAT",
+    "COMPANYPHONE": "Telephone",
+    "COMPANYEMAIL": "Email",
+    "NOTES": "Note",
+    "QUOTATIONPRODUCTNOTE": "Product Note",
+    "QUOTATIONVAT": "VAT",
+    "AUTOPROFORMA": "SELF-PROFORMA",
+    "AUTOINVOICE": "SELF-INVOICE",
+    "MOVEASSET": "ASSET",
+    "ORDERSTATUS": "State",
+    "QUOTATIONTOTALS": "Total",
+    "QUOTATIONTOTAL": "TOTAL",
+    "PRODUCTTYPE": "Type",
+    "PRODUCTSUBSCRIPTION": "Duration",
+    "PRODUCTATUNIT": "Unit",
+    "INASSET": "Asset",
+    "PRODUCTININVOICE": "Products on the invoice",
+    "SUBSCRIPTIONS": "CUSTOMER SCHEDULE",
+    "SUBSCRIPTIONNAME": "Subscription",
+    "COMPANYNAME": "Company",
+    "NEXTINVOICE": "Next Invoice",
+    "SUBSCRIPTIONDETAIL": "Detail",
+    "PRODUCTDESCRIPTION": "Description",
+    "NETPRICE": "Price",
+    "DISCOUNT": "Discount",
+    "TAX": "Tax",
+    "ATTENDACELASTINVOICE": "Last invoice",
+    "ATTENDACENEXTINVOICE": "Next invoice",
+    "SELECT_PRODUCT": "Select product",
+    "SELECT_PRODUCTTYPE": "Select type",
+    "ALL_PRODUCTS": "All",
+    "ALL_STATUS": "All",
+    "PAYMENT_INFO": "Payment information",
+    "PAYMENTMETHOD": "Payment methods",
+    "PAYMENT": "Payment",
+    "DETAILS": "Details",
+    "INVOICEDETAILS": "INVOICE DETAILS",
+    "QUANTITY": "Quantity",
+    "MANAGESALES": "Subscriptions",
+    "ACCOUNTINGDOC": "Accounting",
+    "INVOICES": "INVOICES",
+    "PROFORMAS": "PROFORMA",
+    "PAYMENTS": "PAYMENTS",
+    "SELECT_PERIOD": "Select range",
+    "NO_PRODUCTPROFORMA_AVAILABLE": "No data available",
+    "NO_PRODUCTPRICELIST_AVAILABLE": "No data available",
+    "PROFORMAAUTHORIZED": "Authorized proforma",
+    "ADD_PRODUCTPRICELIST": "ADD PRODUCT",
+    "DELETE_PRODUCT": "Delete Product",
+    "AUTHORIZED": "AUTHORIZED",
+    "INVOICEDISCOUNT": "Discount",
+    "DEPOSIT": "DEPOSIT",
+    "BALANCE": "BALANCE",
+    "PRODUCTS": "PRODUCTS",
+    "INVOICENOPRODUCTDESCRIPTION": "Description on the invoice",
+    "INVOICENOPRODUCTAMOUNT": "Amount",
+    "INVOICENOTAXAMOUNT": "TAX",
+    "INVOICENOPRODUCTSAVE": "Save",
+    "INVOICENOPRODUCTUPDATE": "Update",
+    "PDFPROFORMA": "PDF",
+    "PDFINVOICE": "PDF",
+    "PAIDANDEXPIRED": "Payment",
+    "CREDITNOTE": "CREDIT NOTE",
+    "CREDITNOTE_INFO": "Credit Note",
+    "MOVECREDITNOTE": "SELF-CREDIT NOTE",
+    "CREDITNOTEDETAILS": "Credit Note Detail",
+    "PDFCREDITNOTE": "PDF",
+    "CREDITINOTENAME": "Name",
+    "TOTALPAYMENTS": "Total payments",
+    "PROFORMADETAILS": "Details",
+    "CREATIONDATE": "Created at",
+    "STARTDATE": "Invoice Date",
+    "ENDDATE": "Expiry Date",
+    "NUMBER": "Number",
+    "PRODUCTPRICE": "Price",
+    "PRODUCTTAX": "Tax percentage",
+    "PRODUCTQTY": "Quantity",
+    "UPDATE_PRODUCT": "Update Product",
+    "QUOTATIONPRODUCTTYPE": "Type",
+    "QUOTATIONUNIT": "Unit",
+    "QUOTATIONSUBSCRIPTION": "Duration",
+    "SELECT_PERIOD_CREATION": "Select Creation Date",
+    "SELECT_PERIOD_START": "Select Date",
+    "SELECT_PERIOD_EXPIRE": "Select Expiry Date",
+    "NEW_COMPANY": "New",
+    "COMPANIES": "Companies",
+    "PAYED_AY": "Payed on",
+    "CLONEPROFORMA": "Clone",
+    "COMPANYDESC": "Description",
+    "COMPANYNATION": "Nation",
+    "GRAPHINVOICES": "Invoice emission chart",
+    "YEARS": "Years",
+    "FROM": "From",
+    "TO": "To",
+    "INVOICEEMITED": "Issued",
+    "INVOICEPAYED": "Payed",
+    "INVOICETOTAL": "Total",
+    "CHOOSE": "Choose",
+    "ADVANCED_SEARCH": "Advanced Search",
+    "NEW_CONDITION": "New Condition",
+    "SELECT_FIELD": "Select field",
+    "SELECT_OPERATOR": "Select operator",
+    "VALUE": "Value",
+    "VALUES": "Values",
+    "APPLY": "Apply",
+    "MEET_ALL_CONDITIONS": "Meet all conditions",
+    "MEET_ANY_CONDITIONS": "Meet at least one condition",
+    "EQUALS": "Equals",
+    "IS_NOT_EQUAL": "Does not equal",
+    "IS_AMONG": "Is among",
+    "IS_NOT_AMONG": "Is not among",
+    "IS_GREATER_THAN": "Is greater than",
+    "IS_GREATER_THAN_OR_EQUAL_TO": "Is greater than or equal to",
+    "IS_LESS_THAN": "Is less than",
+    "IS_LESS_THAN_OR_EQUAL_TO": "Is less than or equal to",
+    "IS_BETWEEN": "Is between",
+    "CONTAINS": "Contains",
+    "STARTS_WITH": "Starts with",
+    "ENDS_WITH": "Ends with",
+    "STARTING_DATE": "Starting date",
+    "ENDING_DATE": "Ending date",
+    "STARTING_VALUE": "Starting value",
+    "ENDING_VALUE": "Ending value",
+    "VALUE_RANGE_CHECK": "Value must be greater than",
+    "AND": "And",
+    "ENABLED": "Enabled",
+    "DISABLED": "Disabled",
+    "ELAPSED_ANSWERED": "Elapsed time since call started",
+    "ELAPSED_DISPOSED": "Elapsed time since call ended",
+    "WHATSAPP": "WhatsApp Connector",
+    "WHATSAPP_INTERACTIONS": "WhatsApp Connector Interactions",
+    "SECOND_LEVEL_DISPOSITION": "Second Level Disposition",
+    "THIRD_LEVEL_DISPOSITION": "Third Level Disposition",
+    "VIDAOOSESSION": "Start Video Call",
+    "SELECT_CONTACT": "Select contact",
+    "SELECT": "Select",
+    "LAST_UPDATED": "Last updated",
+    "MATCHING_FIELD": "Matching field",
+    "MULTIPLE_CONTACTS_FOUND": "Multiple contacts found for number",
+    "WHICH_ONE_TO_USE": "Which one do you want to use?",
+    "LICENSE_EXPIRE_REMAINING_DAYS": "Your license is about to expire! Please contact your Administrator",
+    "NO_RESULTS_AVAILABLE": "No results available",
+    "AVAILABLE": "Available",
+    "AGENT_PRESENCE": "Agent Presence",
+    "SELECT_TEAM": "Select Team",
+    "NOTIFICATIONS": {
+      "TRANSFER_AGENT_EXECUTED": "Transfer to agent successfully executed",
+      "TRANSFER_QUEUE_EXECUTED": "Transfer to queue successfully executed"
+    }
+  }
+}
diff --git a/public/app/main/apps/dashboards/i18n/id.json b/public/app/main/apps/dashboards/i18n/id.json
index 8922377..1739268 100644
--- a/public/app/main/apps/dashboards/i18n/id.json
+++ b/public/app/main/apps/dashboards/i18n/id.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Tutup tab kontak secara otomatis setelah dibuang",
     "AGENT_PRESENCE": "Kehadiran Agen",
     "SELECT_TEAM": "Pilih Tim",
-    "AVAILABLE": "Tersedia"
+    "AVAILABLE": "Tersedia",
+    "CONFIRM": "Mengonfirmasi",
+    "FILTERS": "Filter",
+    "FILTER_CHAT_WEBSITES": "Filter Situs Web Obrolan",
+    "FILTER_FAX_ACCOUNTS": "Filter Akun Faks",
+    "FILTER_MAIL_ACCOUNTS": "Filter Akun Email",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filter Akun Saluran Terbuka",
+    "FILTER_SMS_ACCOUNTS": "Filter Akun Sms",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filter Akun Whatsapp",
+    "SETFILTERS": "Setel Filter"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/it.json b/public/app/main/apps/dashboards/i18n/it.json
index 18bc3b7..237bcd8 100644
--- a/public/app/main/apps/dashboards/i18n/it.json
+++ b/public/app/main/apps/dashboards/i18n/it.json
@@ -66,6 +66,15 @@
     "SELECT_AGENT": "Seleziona Agente",
     "MARK_AS_UNREAD": "Segna come non letta",
     "FILTER_VOICE_QUEUES": "Filtra Code Voce",
+    "FILTER_CHAT_WEBSITES": "Filtra Chat Website",
+    "FILTER_SMS_ACCOUNTS": "Filtra Sms Account",
+    "FILTER_FAX_ACCOUNTS": "Filtra Fax Account",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtra Openchannel Account",
+    "FILTER_MAIL_ACCOUNTS": "Filtra Mail Account",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtra Whatsapp Account",
+    "SETFILTERS": "Seleziona i filtri",
+    "FILTERS": "Filtri",
+    "CONFIRM": "Conferma",
     "CHANNEL_WAITING_TEXT": "Interazioni in attesa in coda",
     "CHANNEL_QUEUE": "Coda",
     "CHANNEL_FROM": "Da",
diff --git a/public/app/main/apps/dashboards/i18n/ja.json b/public/app/main/apps/dashboards/i18n/ja.json
index 2838ef3..c0d206f 100644
--- a/public/app/main/apps/dashboards/i18n/ja.json
+++ b/public/app/main/apps/dashboards/i18n/ja.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "廃棄後、コンタクトタブを自動的に閉じる",
     "AGENT_PRESENCE": "エージェントの存在",
     "SELECT_TEAM": "チームを選ぶ",
-    "AVAILABLE": "利用可能"
+    "AVAILABLE": "利用可能",
+    "CONFIRM": "確認",
+    "FILTERS": "フィルタ",
+    "FILTER_CHAT_WEBSITES": "チャットWebサイトのフィルター",
+    "FILTER_FAX_ACCOUNTS": "ファックスアカウントのフィルタリング",
+    "FILTER_MAIL_ACCOUNTS": "メールアカウントのフィルタリング",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Openchannelアカウントをフィルタリングする",
+    "FILTER_SMS_ACCOUNTS": "Smsアカウントをフィルタリングする",
+    "FILTER_WHATSAPP_ACCOUNTS": "Whatsappアカウントをフィルタリングする",
+    "SETFILTERS": "フィルタを設定する"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/ko.json b/public/app/main/apps/dashboards/i18n/ko.json
index a7495eb..01decd8 100644
--- a/public/app/main/apps/dashboards/i18n/ko.json
+++ b/public/app/main/apps/dashboards/i18n/ko.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "폐기 후 자동으로 접촉 탭 닫기",
     "AGENT_PRESENCE": "에이전트 존재",
     "SELECT_TEAM": "팀 선택",
-    "AVAILABLE": "사용 가능"
+    "AVAILABLE": "사용 가능",
+    "CONFIRM": "확인하다",
+    "FILTERS": "필터",
+    "FILTER_CHAT_WEBSITES": "채팅 웹사이트 필터링",
+    "FILTER_FAX_ACCOUNTS": "팩스 계정 필터링",
+    "FILTER_MAIL_ACCOUNTS": "메일 계정 필터링",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Openchannel 계정 필터링",
+    "FILTER_SMS_ACCOUNTS": "SMS 계정 필터링",
+    "FILTER_WHATSAPP_ACCOUNTS": "Whatsapp 계정 필터링",
+    "SETFILTERS": "필터 설정"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/lt.json b/public/app/main/apps/dashboards/i18n/lt.json
index 36ed40a..dc8e5f4 100644
--- a/public/app/main/apps/dashboards/i18n/lt.json
+++ b/public/app/main/apps/dashboards/i18n/lt.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Po šalinimo automatiškai uždarykite kontaktų skirtuką",
     "AGENT_PRESENCE": "Agento buvimas",
     "SELECT_TEAM": "Pasirinkite Komanda",
-    "AVAILABLE": "Galima"
+    "AVAILABLE": "Galima",
+    "CONFIRM": "Patvirtinti",
+    "FILTERS": "Filtrai",
+    "FILTER_CHAT_WEBSITES": "Filtruokite pokalbių svetaines",
+    "FILTER_FAX_ACCOUNTS": "Filtruoti fakso paskyras",
+    "FILTER_MAIL_ACCOUNTS": "Filtruokite pašto paskyras",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtruokite „Openchannel“ paskyras",
+    "FILTER_SMS_ACCOUNTS": "Filtruoti SMS paskyras",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtruokite „Whatsapp“ paskyras",
+    "SETFILTERS": "Nustatykite filtrus"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/lv.json b/public/app/main/apps/dashboards/i18n/lv.json
index ac0b19a..530afae 100644
--- a/public/app/main/apps/dashboards/i18n/lv.json
+++ b/public/app/main/apps/dashboards/i18n/lv.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Pēc iznīcināšanas automātiski aizveriet kontaktu cilni",
     "AGENT_PRESENCE": "Aģentu klātbūtne",
     "SELECT_TEAM": "Atlasiet Komanda",
-    "AVAILABLE": "Pieejams"
+    "AVAILABLE": "Pieejams",
+    "CONFIRM": "Apstiprināt",
+    "FILTERS": "Filtri",
+    "FILTER_CHAT_WEBSITES": "Filtrējiet tērzēšanas vietnes",
+    "FILTER_FAX_ACCOUNTS": "Filtrēt faksa kontus",
+    "FILTER_MAIL_ACCOUNTS": "Filtrējiet pasta kontus",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrējiet Openchannel kontus",
+    "FILTER_SMS_ACCOUNTS": "Filtrējiet īsziņu kontus",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrējiet Whatsapp kontus",
+    "SETFILTERS": "Iestatiet filtrus"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/nl.json b/public/app/main/apps/dashboards/i18n/nl.json
index 9a5dea3..5a4d642 100644
--- a/public/app/main/apps/dashboards/i18n/nl.json
+++ b/public/app/main/apps/dashboards/i18n/nl.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Sluit het contacttabblad automatisch na verwijdering",
     "AGENT_PRESENCE": "Aanwezigheid van agent",
     "SELECT_TEAM": "Selecteer team",
-    "AVAILABLE": "Beschikbaar"
+    "AVAILABLE": "Beschikbaar",
+    "CONFIRM": "Bevestigen",
+    "FILTERS": "Filters",
+    "FILTER_CHAT_WEBSITES": "Chat-websites filteren",
+    "FILTER_FAX_ACCOUNTS": "Faxaccounts filteren",
+    "FILTER_MAIL_ACCOUNTS": "E-mailaccounts filteren",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Openchannel-accounts filteren",
+    "FILTER_SMS_ACCOUNTS": "Sms-accounts filteren",
+    "FILTER_WHATSAPP_ACCOUNTS": "Whatsapp-accounts filteren",
+    "SETFILTERS": "Filters instellen"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/no.json b/public/app/main/apps/dashboards/i18n/no.json
index ffaf471..844e68d 100644
--- a/public/app/main/apps/dashboards/i18n/no.json
+++ b/public/app/main/apps/dashboards/i18n/no.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Lukk kontaktfanen automatisk etter avhending",
     "AGENT_PRESENCE": "Agent Tilstedeværelse",
     "SELECT_TEAM": "Velg team",
-    "AVAILABLE": "Tilgjengelig"
+    "AVAILABLE": "Tilgjengelig",
+    "CONFIRM": "Bekrefte",
+    "FILTERS": "Filtre",
+    "FILTER_CHAT_WEBSITES": "Filtrer nettsteder for chat",
+    "FILTER_FAX_ACCOUNTS": "Filtrer fakskontoer",
+    "FILTER_MAIL_ACCOUNTS": "Filtrer postkontoer",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrer Openchannel -kontoer",
+    "FILTER_SMS_ACCOUNTS": "Filtrer sms -kontoer",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrer Whatsapp -kontoer",
+    "SETFILTERS": "Sett filtre"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/pl.json b/public/app/main/apps/dashboards/i18n/pl.json
index a9d671e..869b28f 100644
--- a/public/app/main/apps/dashboards/i18n/pl.json
+++ b/public/app/main/apps/dashboards/i18n/pl.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Automatycznie zamykaj zakładkę kontaktową po utylizacji",
     "AGENT_PRESENCE": "Obecność agenta",
     "SELECT_TEAM": "Wybierz drużynę",
-    "AVAILABLE": "Do dyspozycji"
+    "AVAILABLE": "Do dyspozycji",
+    "CONFIRM": "Potwierdzać",
+    "FILTERS": "Filtry",
+    "FILTER_CHAT_WEBSITES": "Filtruj strony internetowe czatu",
+    "FILTER_FAX_ACCOUNTS": "Filtruj konta faksów",
+    "FILTER_MAIL_ACCOUNTS": "Filtruj konta pocztowe",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtruj konta Openchannel",
+    "FILTER_SMS_ACCOUNTS": "Filtruj konta SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtruj konta Whatsapp",
+    "SETFILTERS": "Ustaw filtry"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/pt-BR.json b/public/app/main/apps/dashboards/i18n/pt-BR.json
index e3a1740..72d2366 100644
--- a/public/app/main/apps/dashboards/i18n/pt-BR.json
+++ b/public/app/main/apps/dashboards/i18n/pt-BR.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Fechar automaticamente a guia de contato após o descarte",
     "AGENT_PRESENCE": "Presença do Agente",
     "SELECT_TEAM": "Selecionar time",
-    "AVAILABLE": "Disponível"
+    "AVAILABLE": "Disponível",
+    "CONFIRM": "confirme",
+    "FILTERS": "Filtros",
+    "FILTER_CHAT_WEBSITES": "Filtrar sites de bate-papo",
+    "FILTER_FAX_ACCOUNTS": "Filtrar contas de fax",
+    "FILTER_MAIL_ACCOUNTS": "Filtrar contas de correio",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrar contas de canal aberto",
+    "FILTER_SMS_ACCOUNTS": "Filtrar contas de SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrar contas do Whatsapp",
+    "SETFILTERS": "Definir Filtros"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/pt-PT.json b/public/app/main/apps/dashboards/i18n/pt-PT.json
index 1789543..9598d6e 100644
--- a/public/app/main/apps/dashboards/i18n/pt-PT.json
+++ b/public/app/main/apps/dashboards/i18n/pt-PT.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Fechar automaticamente a guia de contato após o descarte",
     "AGENT_PRESENCE": "Presença do Agente",
     "SELECT_TEAM": "Selecionar time",
-    "AVAILABLE": "Disponível"
+    "AVAILABLE": "Disponível",
+    "CONFIRM": "confirme",
+    "FILTERS": "Filtros",
+    "FILTER_CHAT_WEBSITES": "Filtrar sites de bate-papo",
+    "FILTER_FAX_ACCOUNTS": "Filtrar contas de fax",
+    "FILTER_MAIL_ACCOUNTS": "Filtrar contas de correio",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrar contas de canal aberto",
+    "FILTER_SMS_ACCOUNTS": "Filtrar contas de SMS",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrar contas do Whatsapp",
+    "SETFILTERS": "Definir Filtros"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/ru.json b/public/app/main/apps/dashboards/i18n/ru.json
index 0de9ff7..93dda02 100644
--- a/public/app/main/apps/dashboards/i18n/ru.json
+++ b/public/app/main/apps/dashboards/i18n/ru.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Автоматически закрывать вкладку контактов после удаления",
     "AGENT_PRESENCE": "Присутствие агента",
     "SELECT_TEAM": "Выбрать команду",
-    "AVAILABLE": "Имеется в наличии"
+    "AVAILABLE": "Имеется в наличии",
+    "CONFIRM": "Подтверждать",
+    "FILTERS": "Фильтры",
+    "FILTER_CHAT_WEBSITES": "Фильтр веб-сайтов чата",
+    "FILTER_FAX_ACCOUNTS": "Фильтр учетных записей факсов",
+    "FILTER_MAIL_ACCOUNTS": "Фильтр почтовых аккаунтов",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Фильтр учетных записей Openchannel",
+    "FILTER_SMS_ACCOUNTS": "Фильтр смс аккаунтов",
+    "FILTER_WHATSAPP_ACCOUNTS": "Фильтр учетных записей WhatsApp",
+    "SETFILTERS": "Установить фильтры"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/sv.json b/public/app/main/apps/dashboards/i18n/sv.json
index a80e2a3..1f8ac1c 100644
--- a/public/app/main/apps/dashboards/i18n/sv.json
+++ b/public/app/main/apps/dashboards/i18n/sv.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Stäng kontaktfliken automatiskt efter bortskaffande",
     "AGENT_PRESENCE": "Agent närvaro",
     "SELECT_TEAM": "Välj lag",
-    "AVAILABLE": "Tillgängligt"
+    "AVAILABLE": "Tillgängligt",
+    "CONFIRM": "Bekräfta",
+    "FILTERS": "Filter",
+    "FILTER_CHAT_WEBSITES": "Filtrera chattwebbplatser",
+    "FILTER_FAX_ACCOUNTS": "Filtrera faxkonton",
+    "FILTER_MAIL_ACCOUNTS": "Filtrera e -postkonton",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Filtrera Openchannel -konton",
+    "FILTER_SMS_ACCOUNTS": "Filtrera sms -konton",
+    "FILTER_WHATSAPP_ACCOUNTS": "Filtrera Whatsapp -konton",
+    "SETFILTERS": "Ställ in filter"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/tr.json b/public/app/main/apps/dashboards/i18n/tr.json
index d15fe72..3cb787d 100644
--- a/public/app/main/apps/dashboards/i18n/tr.json
+++ b/public/app/main/apps/dashboards/i18n/tr.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "Atıldıktan sonra temas sekmesini otomatik olarak kapatın",
     "AGENT_PRESENCE": "Temsilci Varlığı",
     "SELECT_TEAM": "Takım Seçin",
-    "AVAILABLE": "Mevcut"
+    "AVAILABLE": "Mevcut",
+    "CONFIRM": "Onaylamak",
+    "FILTERS": "Filtreler",
+    "FILTER_CHAT_WEBSITES": "Sohbet Web Sitelerini Filtrele",
+    "FILTER_FAX_ACCOUNTS": "Faks Hesaplarını Filtrele",
+    "FILTER_MAIL_ACCOUNTS": "Posta Hesaplarını Filtrele",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "Açık Kanal Hesaplarını Filtrele",
+    "FILTER_SMS_ACCOUNTS": "Sms Hesaplarını Filtrele",
+    "FILTER_WHATSAPP_ACCOUNTS": "Whatsapp Hesaplarını Filtrele",
+    "SETFILTERS": "Filtreleri Ayarla"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/zh-CN.json b/public/app/main/apps/dashboards/i18n/zh-CN.json
index f45d697..0e25ca9 100644
--- a/public/app/main/apps/dashboards/i18n/zh-CN.json
+++ b/public/app/main/apps/dashboards/i18n/zh-CN.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "处置后自动关闭接触片",
     "AGENT_PRESENCE": "代理人在场",
     "SELECT_TEAM": "选择团队",
-    "AVAILABLE": "可用的"
+    "AVAILABLE": "可用的",
+    "CONFIRM": "确认",
+    "FILTERS": "过滤器",
+    "FILTER_CHAT_WEBSITES": "过滤聊天网站",
+    "FILTER_FAX_ACCOUNTS": "过滤传真帐户",
+    "FILTER_MAIL_ACCOUNTS": "过滤邮件帐户",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "过滤开放渠道账户",
+    "FILTER_SMS_ACCOUNTS": "过滤短信账户",
+    "FILTER_WHATSAPP_ACCOUNTS": "筛选 Whatsapp 帐户",
+    "SETFILTERS": "设置过滤器"
   }
 }
diff --git a/public/app/main/apps/dashboards/i18n/zh-TW.json b/public/app/main/apps/dashboards/i18n/zh-TW.json
index c2cc3eb..aff2a86 100644
--- a/public/app/main/apps/dashboards/i18n/zh-TW.json
+++ b/public/app/main/apps/dashboards/i18n/zh-TW.json
@@ -567,6 +567,15 @@
     "AUTOCLOSE": "處置後自動關閉接觸片",
     "AGENT_PRESENCE": "代理人在場",
     "SELECT_TEAM": "選擇團隊",
-    "AVAILABLE": "可用的"
+    "AVAILABLE": "可用的",
+    "CONFIRM": "確認",
+    "FILTERS": "過濾器",
+    "FILTER_CHAT_WEBSITES": "過濾聊天網站",
+    "FILTER_FAX_ACCOUNTS": "過濾傳真帳戶",
+    "FILTER_MAIL_ACCOUNTS": "過濾郵件帳戶",
+    "FILTER_OPENCHANNEL_ACCOUNTS": "過濾開放渠道賬戶",
+    "FILTER_SMS_ACCOUNTS": "過濾短信賬戶",
+    "FILTER_WHATSAPP_ACCOUNTS": "篩選 Whatsapp 帳戶",
+    "SETFILTERS": "設置過濾器"
   }
 }
diff --git a/public/app/main/apps/fax/i18n/hu.json b/public/app/main/apps/fax/i18n/hu.json
new file mode 100644
index 0000000..bfa0d7e
--- /dev/null
+++ b/public/app/main/apps/fax/i18n/hu.json
@@ -0,0 +1,261 @@
+{
+  "FAX": {
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "DOWNLOAD_INTERACTION": "Download",
+    "TRANSFER": "Transfer",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "TAG": "Tag",
+    "EDIT_TAG": "Edit Tag",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "SYSTEM": "System",
+    "EDIT_SYSTEM": "Edit System",
+    "COMMAND": "Command",
+    "VARIABLE": "Variable",
+    "CANNEDANSWERS": "Canned Answers",
+    "FAXCANNEDANSWERS": "Canned Answers",
+    "NO_FAXCANNEDANSWER_AVAILABLE": "No Canned Answers Available",
+    "NEW_FAXCANNEDANSWER": "New Canned Answer",
+    "ADD_FAXCANNEDANSWER": "Add Canned Answer",
+    "EDIT_CHATCANNEDANSWER": "Edit Canned Answer",
+    "DELETE_CHATCANNEDANSWER": "Delete Canned Answer",
+    "SPYINTERACTION": "Spy",
+    "TAGS": "Tags",
+    "REPLY": "Reply",
+    "SEND": "Send",
+    "TO": "To",
+    "FROM": "From",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "GOTOREALTIME_FAXQUEUE": "Go To Realtime Fax Queue",
+    "EDIT_TRUNK": "Edit Trunk",
+    "REGISTERED": "Registered",
+    "UNREGISTERED": "Unregistered",
+    "EDIT_ACCOUNT": "Edit Fax Account",
+    "PARTIALPAUSE": "Partial Pause",
+    "BUSY": "Busy",
+    "TIMER": "Timer",
+    "IDLE": "Idle",
+    "CAPACITY": "Capacity",
+    "GOTO_FAXACCOUNT": "Go To Realtime Fax",
+    "ACCOUNTS": "Accounts",
+    "GOTOREALTIME_FAXACCOUNT": "Go To Realtime Fax",
+    "TRUNK_STATUS": "Trunk Status",
+    "TRUNKS": "Trunks",
+    "REGISTRY": "Registry",
+    "NO_REGISTRY": "No Registry",
+    "PAUSE": "Pause",
+    "INFO": "Info",
+    "FULLNAME": "Fullname",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "LOGOUT": "Logout",
+    "DEFAULT_PAUSE": "Default pause",
+    "AGENTADD_QUEUE": "Add Agent to Fax queue",
+    "AGENTSADD_QUEUE": "Add Agents to Fax queue",
+    "UNPAUSE": "End Pause",
+    "AGENTS": "Agents",
+    "QUEUES": "Queues",
+    "LOGGED_IN": "Logged in",
+    "PAUSED": "Paused",
+    "READY": "Ready",
+    "WAITING": "Waiting",
+    "PRIORITY": "Priority",
+    "CONDITION": "Condition",
+    "TRUEPRIORITY": "True Priority",
+    "FALSEPRIORITY": "False Priority",
+    "VALUE": "Value",
+    "EDIT_FAXQUEUE": "Edit Fax Queue",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_GOTO": "Edit Goto",
+    "EDIT_NOOP": "Edit Noop",
+    "EDIT_GOTOP": "Edit GotoP",
+    "EDIT_GOTOIF": "Edit GotoIf",
+    "EDIT_QUEUE": "Edit Fax Queue",
+    "EDIT_CLOSE": "Edit Close",
+    "QUEUE": "Queue",
+    "GOTOIF": "GotoIf",
+    "GOTOP": "GotoP",
+    "NOOP": "Noop",
+    "AGENT": "Agent",
+    "NOTES": "Notes",
+    "CLOSEDAT": "Closed At",
+    "DISPOSITION": "Disposition",
+    "REALTIME": "Realtime",
+    "TEAMADD_FAXQUEUE": "Add Team to Fax Queue",
+    "AGENTADD_FAXQUEUE": "Add Agent to Fax Queue",
+    "NAME": "Name",
+    "FAXQUEUES": "Fax Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause status when in mandatory disposition",
+    "ERRORS": {
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "TEXT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "TEXT_REQUIRED": "Mandatory Field",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENT_REQUIRED": "Mandatory Field",
+      "QUEUE_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_REQUIRED": "Mandatory Field",
+      "FALSEPRIORITY_REQUIRED": "Mandatory Field",
+      "CONDITION_REQUIRED": "Mandatory Field",
+      "PRIORITY_REQUIRED": "Mandatory Field",
+      "DISPOSITION_REQUIRED": "Mandatory Field",
+      "NAME_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_MUST_VALID_URL": "Wrong format",
+      "LOCALSTATIONID_REQUIRED": "Mandatory Field",
+      "MODEM_REQUIRED": "Mandatory Field",
+      "GATEWAY_REQUIRED": "Mandatory Field",
+      "FAXDETECT_REQUIRED": "Mandatory Field",
+      "T38TIMEOUT_REQUIRED": "Mandatory Field",
+      "TIMEOUT_REQUIRED": "Mandatory Field",
+      "HEADERINFO_REQUIRED": "Mandatory Field",
+      "TRUNK_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "KEY_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "KEY_REQUIRED": "Mandatory Field",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "You should specify a pause status when in mandatory disposition"
+    },
+    "STRATEGY": "Strategy",
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "DESCRIPTION": "Description",
+    "ADD_FAXQUEUE": "Add Fax Queue",
+    "DELETE_FAXQUEUE": "Delete Fax Queue",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "FAXACCOUNTS": "Fax Accounts",
+    "MOTIONADDRESS": "Motion Address",
+    "ADD_FAXACCOUNT": "Add Fax Account",
+    "EDIT_FAXACCOUNT": "Edit Fax Account",
+    "DELETE_FAXACCOUNT": "Delete Fax Account",
+    "DISPOSITIONS": "Dispositions",
+    "WEBHOOKS": "WebHooks",
+    "ACTIONS": "Actions",
+    "LIST": "List",
+    "FIDELITY": "Fidelity",
+    "ACCEPT": "Accept",
+    "ACCEPTMETHOD": "Accept Method",
+    "ACCEPTURL": "Accept URL",
+    "REJECT": "Reject",
+    "REJECTMETHOD": "Reject Method",
+    "REJECTURL": "Reject URL",
+    "CLOSE": "Close",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "TRUNK": "Trunk",
+    "LOCALSTATIONID": "Local Station Identifier",
+    "HELP": {
+      "LOCALSTATIONID": "Local Station Identifier (telephone number)",
+      "HEADERINFO": "Outbound Fax Header information",
+      "MODEM": "Modem Type (v17/v27/v29)",
+      "GATEWAY": "T.38 Fax Gateway, with optional fax activity timeout in seconds (yes/no/[timeout])",
+      "FAXDETECT": "Enable Fax Detect with optional timeout in seconds (yes/t38/cng/[timeout]/no)",
+      "T38TIMEOUT": "The timeout used for T.38 negotiation (minimum value=1000)",
+      "ECM": "Error Connection Mode (ECM)",
+      "MINRATE": "Minimum transfer rate set before transmission",
+      "MAXRATE": "Maximum transfer rate set before transmission",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause status for mandatory disposition",
+      "NAME": "Only numbers, letters and specific characters (._) are supported"
+    },
+    "ADVANCED": "Advanced",
+    "ECM": "ECM",
+    "MINRATE": "Min Rate",
+    "MAXRATE": "Max Rate",
+    "MODEM": "Modem",
+    "GATEWAY": "Gateway",
+    "FAXDETECT": "Fax Detect",
+    "T38TIMEOUT": "T.38 Timeout",
+    "SIP": "Technology",
+    "HEADERINFO": "Header Info",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "BACK": "Back",
+    "FAX": "Fax",
+    "ID": "Id",
+    "TIMEOUT": "Timeout",
+    "FAXDISPOSITIONS": "Fax Dispositions",
+    "NO_FAXDISPOSITION_AVAILABLE": "No Fax Dispositions available",
+    "NEW_FAXDISPOSITION": "New Fax Disposition",
+    "ADD_FAXDISPOSITION": "Add Fax Disposition",
+    "EDIT_FAXDISPOSITION": "Edit Fax Disposition",
+    "DELETE_FAXDISPOSITION": "Delete Fax Disposition",
+    "NEW_FAXQUEUE": "New Fax Queue",
+    "NEW_FAXACCOUNT": "New Fax Account",
+    "NO_AVAILABLE_INFO": "No available info",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "DELETE": "Delete",
+    "KEY": "Key",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "FILTER": "Filter",
+    "SELECT_STATUS": "Select Status",
+    "ALL": "All",
+    "CLOSED": "Closed",
+    "OPENED": "Open",
+    "SELECT_ACCOUNT": "Select Account",
+    "INTERACTIONS": "Interactions",
+    "CONTACT": "Contact",
+    "STARTEDAT": "Started At",
+    "LASTMESSAGE": "Last message",
+    "STATUS": "Status",
+    "ACCOUNT": "Account",
+    "UNKNOWN": "Unknown",
+    "UNAVAILABLE": "Unavailable",
+    "NOT_INUSE": "Not in use",
+    "REACHABLE": "Reachable",
+    "IN_USE": "In use",
+    "VOICE": "Voice",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Open Channel",
+    "TOTAL": "Total",
+    "IN": "In",
+    "OUT": "Out",
+    "NO_INTERACTION_AVAILABLE": "No interactions available",
+    "INTERACTIONS_FAXACCOUNT": "Go to Interactions",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "AGENTADD_FAXACCOUNT": "Add Agent to Fax Account",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments"
+  }
+}
diff --git a/public/app/main/apps/help/i18n/cs.json b/public/app/main/apps/help/i18n/cs.json
index 0acdb95..4c1be43 100644
--- a/public/app/main/apps/help/i18n/cs.json
+++ b/public/app/main/apps/help/i18n/cs.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Help",
     "ABOUT": "About",
-    "USEFUL_LINKS": "Useful links",
-    "CONTACT_US": "Contact us"
+    "CONTACT_US": "Contact us",
+    "HELP": "Help",
+    "USEFUL_LINKS": "Useful links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/da.json b/public/app/main/apps/help/i18n/da.json
index 173a4b0..3e3f0ff 100644
--- a/public/app/main/apps/help/i18n/da.json
+++ b/public/app/main/apps/help/i18n/da.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Hjælp",
     "ABOUT": "Om",
-    "USEFUL_LINKS": "Nyttige links",
-    "CONTACT_US": "Kontakt os"
+    "CONTACT_US": "Kontakt os",
+    "HELP": "Hjælp",
+    "USEFUL_LINKS": "Nyttige links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/de.json b/public/app/main/apps/help/i18n/de.json
index 2ebd41c..2fb51f7 100644
--- a/public/app/main/apps/help/i18n/de.json
+++ b/public/app/main/apps/help/i18n/de.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Hilfe",
     "ABOUT": "Über",
-    "USEFUL_LINKS": "Nützliche Links",
-    "CONTACT_US": "Kontaktieren Sie uns"
+    "CONTACT_US": "Kontaktieren Sie uns",
+    "HELP": "Hilfe",
+    "USEFUL_LINKS": "Nützliche Links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/en.json b/public/app/main/apps/help/i18n/en.json
index 0acdb95..4c1be43 100644
--- a/public/app/main/apps/help/i18n/en.json
+++ b/public/app/main/apps/help/i18n/en.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Help",
     "ABOUT": "About",
-    "USEFUL_LINKS": "Useful links",
-    "CONTACT_US": "Contact us"
+    "CONTACT_US": "Contact us",
+    "HELP": "Help",
+    "USEFUL_LINKS": "Useful links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/et.json b/public/app/main/apps/help/i18n/et.json
index 0acdb95..4c1be43 100644
--- a/public/app/main/apps/help/i18n/et.json
+++ b/public/app/main/apps/help/i18n/et.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Help",
     "ABOUT": "About",
-    "USEFUL_LINKS": "Useful links",
-    "CONTACT_US": "Contact us"
+    "CONTACT_US": "Contact us",
+    "HELP": "Help",
+    "USEFUL_LINKS": "Useful links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/fa.json b/public/app/main/apps/help/i18n/fa.json
index c7eed5e..59f05c8 100644
--- a/public/app/main/apps/help/i18n/fa.json
+++ b/public/app/main/apps/help/i18n/fa.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "کمک کند",
     "ABOUT": "در حدود",
-    "USEFUL_LINKS": "لینک های مفید",
-    "CONTACT_US": "تماس با ما"
+    "CONTACT_US": "تماس با ما",
+    "HELP": "کمک کند",
+    "USEFUL_LINKS": "لینک های مفید"
   }
 }
diff --git a/public/app/main/apps/help/i18n/fi.json b/public/app/main/apps/help/i18n/fi.json
index 00d8cb8..c5b03de 100644
--- a/public/app/main/apps/help/i18n/fi.json
+++ b/public/app/main/apps/help/i18n/fi.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Ohje",
     "ABOUT": "Lisätietoja",
-    "USEFUL_LINKS": "Hyödyllisiä linkkejä",
-    "CONTACT_US": "Ota yhteyttä"
+    "CONTACT_US": "Ota yhteyttä",
+    "HELP": "Ohje",
+    "USEFUL_LINKS": "Hyödyllisiä linkkejä"
   }
 }
diff --git a/public/app/main/apps/help/i18n/fr.json b/public/app/main/apps/help/i18n/fr.json
index 85ac632..7288aef 100644
--- a/public/app/main/apps/help/i18n/fr.json
+++ b/public/app/main/apps/help/i18n/fr.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Aide",
     "ABOUT": "À propos de",
-    "USEFUL_LINKS": "Liens utiles",
-    "CONTACT_US": "Contactez-nous"
+    "CONTACT_US": "Contactez-nous",
+    "HELP": "Aide",
+    "USEFUL_LINKS": "Liens utiles"
   }
 }
diff --git a/public/app/main/apps/help/i18n/he.json b/public/app/main/apps/help/i18n/he.json
index a0165e8..4ce9a3f 100644
--- a/public/app/main/apps/help/i18n/he.json
+++ b/public/app/main/apps/help/i18n/he.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "עזרה",
     "ABOUT": "אודות",
-    "USEFUL_LINKS": "קישורים שימושיים",
-    "CONTACT_US": "צור קשר"
+    "CONTACT_US": "צור קשר",
+    "HELP": "עזרה",
+    "USEFUL_LINKS": "קישורים שימושיים"
   }
 }
diff --git a/public/app/main/apps/help/i18n/hi.json b/public/app/main/apps/help/i18n/hi.json
index 1de7eb3..d5c9048 100644
--- a/public/app/main/apps/help/i18n/hi.json
+++ b/public/app/main/apps/help/i18n/hi.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "मदद",
     "ABOUT": "के बारे में",
-    "USEFUL_LINKS": "उपयोगी संपर्क",
-    "CONTACT_US": "संपर्क"
+    "CONTACT_US": "संपर्क",
+    "HELP": "मदद",
+    "USEFUL_LINKS": "उपयोगी संपर्क"
   }
 }
diff --git a/public/app/main/apps/help/i18n/hu.json b/public/app/main/apps/help/i18n/hu.json
new file mode 100644
index 0000000..4c1be43
--- /dev/null
+++ b/public/app/main/apps/help/i18n/hu.json
@@ -0,0 +1,8 @@
+{
+  "HELP": {
+    "ABOUT": "About",
+    "CONTACT_US": "Contact us",
+    "HELP": "Help",
+    "USEFUL_LINKS": "Useful links"
+  }
+}
diff --git a/public/app/main/apps/help/i18n/it.json b/public/app/main/apps/help/i18n/it.json
index 06519e2..64779bd 100644
--- a/public/app/main/apps/help/i18n/it.json
+++ b/public/app/main/apps/help/i18n/it.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Aiuto",
     "ABOUT": "About",
-    "USEFUL_LINKS": "Link utili",
-    "CONTACT_US": "Contattaci"
+    "CONTACT_US": "Contattaci",
+    "HELP": "Aiuto",
+    "USEFUL_LINKS": "Link utili"
   }
 }
diff --git a/public/app/main/apps/help/i18n/ko.json b/public/app/main/apps/help/i18n/ko.json
index 4863155..302c79f 100644
--- a/public/app/main/apps/help/i18n/ko.json
+++ b/public/app/main/apps/help/i18n/ko.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "도움말",
     "ABOUT": "상세정보",
-    "USEFUL_LINKS": "유용한 링크",
-    "CONTACT_US": "연락처"
+    "CONTACT_US": "연락처",
+    "HELP": "도움말",
+    "USEFUL_LINKS": "유용한 링크"
   }
 }
diff --git a/public/app/main/apps/help/i18n/lt.json b/public/app/main/apps/help/i18n/lt.json
index 2ff5714..fa77f97 100644
--- a/public/app/main/apps/help/i18n/lt.json
+++ b/public/app/main/apps/help/i18n/lt.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Pagalba",
     "ABOUT": "Apie",
-    "USEFUL_LINKS": "Naudingos nuorodos",
-    "CONTACT_US": "Susisiekite su mumis"
+    "CONTACT_US": "Susisiekite su mumis",
+    "HELP": "Pagalba",
+    "USEFUL_LINKS": "Naudingos nuorodos"
   }
 }
diff --git a/public/app/main/apps/help/i18n/lv.json b/public/app/main/apps/help/i18n/lv.json
index 4ccb23e..925f1e4 100644
--- a/public/app/main/apps/help/i18n/lv.json
+++ b/public/app/main/apps/help/i18n/lv.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Palīdzība",
     "ABOUT": "Par",
-    "USEFUL_LINKS": "Noderīgas saites",
-    "CONTACT_US": "Sazināties ar mums"
+    "CONTACT_US": "Sazināties ar mums",
+    "HELP": "Palīdzība",
+    "USEFUL_LINKS": "Noderīgas saites"
   }
 }
diff --git a/public/app/main/apps/help/i18n/nl.json b/public/app/main/apps/help/i18n/nl.json
index 37c1393..c2a09ec 100644
--- a/public/app/main/apps/help/i18n/nl.json
+++ b/public/app/main/apps/help/i18n/nl.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Help",
     "ABOUT": "Over",
-    "USEFUL_LINKS": "Nuttige links",
-    "CONTACT_US": "Neem contact met ons op"
+    "CONTACT_US": "Neem contact met ons op",
+    "HELP": "Help",
+    "USEFUL_LINKS": "Nuttige links"
   }
 }
diff --git a/public/app/main/apps/help/i18n/no.json b/public/app/main/apps/help/i18n/no.json
index 628eab7..58c4c33 100644
--- a/public/app/main/apps/help/i18n/no.json
+++ b/public/app/main/apps/help/i18n/no.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Hjelp",
     "ABOUT": "Om",
-    "USEFUL_LINKS": "Nyttige koblinger",
-    "CONTACT_US": "Kontakt oss"
+    "CONTACT_US": "Kontakt oss",
+    "HELP": "Hjelp",
+    "USEFUL_LINKS": "Nyttige koblinger"
   }
 }
diff --git a/public/app/main/apps/help/i18n/pl.json b/public/app/main/apps/help/i18n/pl.json
index 422d57a..52d2fee 100644
--- a/public/app/main/apps/help/i18n/pl.json
+++ b/public/app/main/apps/help/i18n/pl.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Pomoc",
     "ABOUT": "Na temat",
-    "USEFUL_LINKS": "Przydatne linki",
-    "CONTACT_US": "Skontaktuj się z nami"
+    "CONTACT_US": "Skontaktuj się z nami",
+    "HELP": "Pomoc",
+    "USEFUL_LINKS": "Przydatne linki"
   }
 }
diff --git a/public/app/main/apps/help/i18n/pt-BR.json b/public/app/main/apps/help/i18n/pt-BR.json
index f6a6be9..3f58330 100644
--- a/public/app/main/apps/help/i18n/pt-BR.json
+++ b/public/app/main/apps/help/i18n/pt-BR.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Ajuda",
     "ABOUT": "Sobre",
-    "USEFUL_LINKS": "Links Úteis",
-    "CONTACT_US": "Contate-Nos"
+    "CONTACT_US": "Contate-Nos",
+    "HELP": "Ajuda",
+    "USEFUL_LINKS": "Links Úteis"
   }
 }
diff --git a/public/app/main/apps/help/i18n/pt-PT.json b/public/app/main/apps/help/i18n/pt-PT.json
index f631947..f6d8474 100644
--- a/public/app/main/apps/help/i18n/pt-PT.json
+++ b/public/app/main/apps/help/i18n/pt-PT.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Ajudar",
     "ABOUT": "Sobre",
-    "USEFUL_LINKS": "Links úteis",
-    "CONTACT_US": "Entre em contato conosco"
+    "CONTACT_US": "Entre em contato conosco",
+    "HELP": "Ajudar",
+    "USEFUL_LINKS": "Links úteis"
   }
 }
diff --git a/public/app/main/apps/help/i18n/ru.json b/public/app/main/apps/help/i18n/ru.json
index bd2271b..ddd2c68 100644
--- a/public/app/main/apps/help/i18n/ru.json
+++ b/public/app/main/apps/help/i18n/ru.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Справка",
     "ABOUT": "О",
-    "USEFUL_LINKS": "Полезные ссылки",
-    "CONTACT_US": "Свяжитесь с нами"
+    "CONTACT_US": "Свяжитесь с нами",
+    "HELP": "Справка",
+    "USEFUL_LINKS": "Полезные ссылки"
   }
 }
diff --git a/public/app/main/apps/help/i18n/sv.json b/public/app/main/apps/help/i18n/sv.json
index 03f33ad..5d1f33a 100644
--- a/public/app/main/apps/help/i18n/sv.json
+++ b/public/app/main/apps/help/i18n/sv.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Hjälp",
     "ABOUT": "Om",
-    "USEFUL_LINKS": "Användbara länkar",
-    "CONTACT_US": "Kontakta oss"
+    "CONTACT_US": "Kontakta oss",
+    "HELP": "Hjälp",
+    "USEFUL_LINKS": "Användbara länkar"
   }
 }
diff --git a/public/app/main/apps/help/i18n/tr.json b/public/app/main/apps/help/i18n/tr.json
index ba43663..fb4dc3a 100644
--- a/public/app/main/apps/help/i18n/tr.json
+++ b/public/app/main/apps/help/i18n/tr.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "Yardım",
     "ABOUT": "Yaklaşık",
-    "USEFUL_LINKS": "Faydalı bağlantılar",
-    "CONTACT_US": "Bize Başvurun"
+    "CONTACT_US": "Bize Başvurun",
+    "HELP": "Yardım",
+    "USEFUL_LINKS": "Faydalı bağlantılar"
   }
 }
diff --git a/public/app/main/apps/help/i18n/zh-CN.json b/public/app/main/apps/help/i18n/zh-CN.json
index 9038cad..5db3e0f 100644
--- a/public/app/main/apps/help/i18n/zh-CN.json
+++ b/public/app/main/apps/help/i18n/zh-CN.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "帮助",
     "ABOUT": "关于",
-    "USEFUL_LINKS": "有用的链接",
-    "CONTACT_US": "联系我们"
+    "CONTACT_US": "联系我们",
+    "HELP": "帮助",
+    "USEFUL_LINKS": "有用的链接"
   }
 }
diff --git a/public/app/main/apps/help/i18n/zh-TW.json b/public/app/main/apps/help/i18n/zh-TW.json
index 0f300e9..507265b 100644
--- a/public/app/main/apps/help/i18n/zh-TW.json
+++ b/public/app/main/apps/help/i18n/zh-TW.json
@@ -1,8 +1,8 @@
 {
   "HELP": {
-    "HELP": "協助",
     "ABOUT": "關於",
-    "USEFUL_LINKS": "有用連結",
-    "CONTACT_US": "與我們連絡"
+    "CONTACT_US": "與我們連絡",
+    "HELP": "協助",
+    "USEFUL_LINKS": "有用連結"
   }
 }
diff --git a/public/app/main/apps/integrations/i18n/en.json b/public/app/main/apps/integrations/i18n/en.json
index f9429ca..5fa06bb 100644
--- a/public/app/main/apps/integrations/i18n/en.json
+++ b/public/app/main/apps/integrations/i18n/en.json
@@ -56,7 +56,8 @@
       "EMAIL_REQUIRED": "Mandatory field",
       "TENANTID_REQUIRED": "Mandatory field",
       "CODE_REQUIRED": "Mandatory field",
-      "MOTIONPROXYADDRESS_REQUIRED": "Mandatory field"
+      "MOTIONPROXYADDRESS_REQUIRED": "Mandatory field",
+      "MODULECREATE_REQUIRED": "Mandatory field"
     },
     "HELP": {
       "MOTIONPROXYADDRESS": "Motion (Proxy) Address: it is reqired if you want to fill the ticket body with Recording URL. Enter the address in the following format: <protocol> : //<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
@@ -71,6 +72,7 @@
       "ADDITIONALSEARCHCONTACT": "Additional field name used to search customer phone number in Contacts",
       "ADDITIONALSEARCHLEAD": "Additional field name used to search customer phone number in Leads"
     },
+    "MODULECREATE": "Module create",
     "CODE": "Developer Console Code",
     "REFRESHTOKEN": "Refresh Token (generated)",
     "ACCOUNT": "Account",
@@ -241,6 +243,7 @@
     "ADDITIONALSEARCHLEAD": "Additional Search Lead",
     "PHONECALL": "Phonecall",
     "TASK": "Task",
-    "MODULECREATE": "Module Create"
+    "DYNAMIC365CONTACT": "Contact",
+    "DYNAMIC365NOTHING": "Nothing"
   }
 }
diff --git a/public/app/main/apps/integrations/i18n/hu.json b/public/app/main/apps/integrations/i18n/hu.json
new file mode 100644
index 0000000..f9429ca
--- /dev/null
+++ b/public/app/main/apps/integrations/i18n/hu.json
@@ -0,0 +1,246 @@
+{
+  "INTEGRATIONS": {
+    "ZONE": "Zone",
+    "ADVANCED": "Advanced",
+    "MODULE_SEARCH": "Module Search",
+    "MODULE_CREATE": "Module Create",
+    "LEADS": "Lead",
+    "CONTACTS": "Contact",
+    "INTEGRATIONS": "Integrations",
+    "ZENDESKACCOUNTS": "Zendesk Accounts",
+    "ID": "Id",
+    "NAME": "Name",
+    "USERNAME": "Username",
+    "URI": "URL",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "EDIT_ZENDESKACCOUNT": "Edit Zendesk Account",
+    "DELETE_ZENDESKACCOUNT": "Delete Zendesk Account",
+    "NEW_ZENDESKACCOUNT": "New Zendesk Account",
+    "AUTHTYPE": "Authentication Type",
+    "PASSWORD": "Password",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "EMAIL": "Email",
+    "TOKEN": "Token",
+    "MOTIONPROXYADDRESS": "Motion or Proxy IP Address",
+    "DESCRIPTION": "Description",
+    "ADD_ZENDESKACCOUNT": "Add Zendesk Account",
+    "ERRORS": {
+      "NAME_REQUIRED": "Mandatory field",
+      "USERNAME_REQUIRED": "Mandatory field",
+      "URI_REQUIRED": "Mandatory field",
+      "URI_MUST_VALID_URL": "Wrong format",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "TOKEN_REQUIRED": "Mandatory field",
+      "MOTIONPROXYADDRESS_MUST_VALID_URL": "Wrong format",
+      "CLIENTID_REQUIRED": "Mandatory field",
+      "CLIENTSECRET_REQUIRED": "Mandatory field",
+      "SECURITYTOKEN_REQUIRED": "Mandatory field",
+      "APIKEY_REQUIRED": "Mandatory field",
+      "CONTENT_REQUIRED": "Mandatory field",
+      "VARIABLENAME_REQUIRED": "Mandatory field",
+      "KEY_REQUIRED": "Mandatory field",
+      "TYPE_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "FIELD_REQUIRED": "Mandatory field",
+      "CONSUMERKEY_REQUIRED": "Mandatory field",
+      "CONSUMERSECRET_REQUIRED": "Mandatory field",
+      "TOKENSECRET_REQUIRED": "Mandatory field",
+      "HOST_REQUIRED": "Mandatory field",
+      "AUTHTOKEN_REQUIRED": "Mandatory field",
+      "VTIGER_USER_NAME_REQUIRED": "Mandatory field",
+      "ACCESS_KEY_REQUIRED": "Mandatory field",
+      "EMAIL_REQUIRED": "Mandatory field",
+      "TENANTID_REQUIRED": "Mandatory field",
+      "CODE_REQUIRED": "Mandatory field",
+      "MOTIONPROXYADDRESS_REQUIRED": "Mandatory field"
+    },
+    "HELP": {
+      "MOTIONPROXYADDRESS": "Motion (Proxy) Address: it is reqired if you want to fill the ticket body with Recording URL. Enter the address in the following format: <protocol> : //<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
+      "TICKETTYPE": "Ticket Type",
+      "ZONE": "Choose your geographic zone (US, AU, EU, IN, CN) to activate the domain-specific Zoho Accounts",
+      "CLIENTID": "The specific CLient Id of your application",
+      "CLIENTSECRET": "The specific CLientSecret of your application",
+      "CODE": "The specific code generated through Developer Console",
+      "REFRESHTOKEN": "The automatically generated refresh token used to refresh expired access tokens. Also the access token are automatically generated each time an api is launched.",
+      "LEADID": "Field name used to link Case and Lead objects",
+      "ADDITIONALSEARCHACCOUNT": "Additional field name used to search customer phone number in Accounts",
+      "ADDITIONALSEARCHCONTACT": "Additional field name used to search customer phone number in Contacts",
+      "ADDITIONALSEARCHLEAD": "Additional field name used to search customer phone number in Leads"
+    },
+    "CODE": "Developer Console Code",
+    "REFRESHTOKEN": "Refresh Token (generated)",
+    "ACCOUNT": "Account",
+    "ZENDESKCONFIGURATIONS": "Zendesk Configurations",
+    "SALESFORCECONFIGURATIONS": "Salesforce Configurations",
+    "SUGARCRMCONFIGURATIONS": "SugarCRM Configurations",
+    "FRESHDESKCONFIGURATIONS": "Freshdesk Configurations",
+    "GENERAL": "General",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "NO_ZENDESKCONFIGURATION_AVAILABLE": "No Zendesk Configurations available",
+    "NEW_ZENDESKCONFIGURATION": "New Zendesk Configuration",
+    "ADD_ZENDESKCONFIGURATION": "Add Zendesk Configuration",
+    "EDIT_ZENDESKCONFIGURATION": "Edit Zendesk Configuration",
+    "DELETE_ZENDESKCONFIGURATION": "Delete Zendesk Configuration",
+    "NO_SALESFORCECONFIGURATION_AVAILABLE": "No Salesforce Configurations available",
+    "NEW_SALESFORCECONFIGURATION": "New Salesforce Configuration",
+    "ADD_SALESFORCECONFIGURATION": "Add Salesforce Configuration",
+    "EDIT_SALESFORCECONFIGURATION": "Edit Salesforce Configuration",
+    "DELETE_SALESFORCECONFIGURATION": "Delete Salesforce Configuration",
+    "NO_SUGARCRMCONFIGURATION_AVAILABLE": "No SugarCRM Configurations available",
+    "NEW_SUGARCRMCONFIGURATION": "New SugarCRM Configuration",
+    "ADD_SUGARCRMCONFIGURATION": "Add SugarCRM Configuration",
+    "EDIT_SUGARCRMCONFIGURATION": "Edit SugarCRM Configuration",
+    "DELETE_SUGARCRMCONFIGURATION": "Delete SugarCRM Configuration",
+    "NO_FRESHDESKCONFIGURATION_AVAILABLE": "No Freshdesk Configurations available",
+    "NEW_FRESHDESKCONFIGURATION": "New Freshdesk Configuration",
+    "ADD_FRESHDESKCONFIGURATION": "Add Freshdesk Configuration",
+    "EDIT_FRESHDESKCONFIGURATION": "Edit Freshdesk Configuration",
+    "DELETE_FRESHDESKCONFIGURATION": "Delete Freshdesk Configuration",
+    "SALESFORCEACCOUNTS": "Salesforce Accounts",
+    "EDIT_SALESFORCEACCOUNT": "Edit Salesforce Account",
+    "DELETE_SALESFORCEACCOUNT": "Delete Salesforce Account",
+    "NEW_SALESFORCEACCOUNT": "New Salesforce Account",
+    "ADD_SALESFORCEACCOUNT": "Add Salesforce Account",
+    "CLIENTID": "Client ID",
+    "CLIENTSECRET": "Client Secret",
+    "SECURITYTOKEN": "Security Token",
+    "SEARCH_FOR_ANYONE": "Search",
+    "APIKEY": "Api Key",
+    "FRESHDESKACCOUNTS": "Freshdesk Accounts",
+    "EDIT_FRESHDESKACCOUNT": "Edit Freshdesk Account",
+    "DELETE_FRESHDESKACCOUNT": "Delete Freshdesk Account",
+    "NEW_FRESHDESKACCOUNT": "New Freshdesk Account",
+    "ADD_FRESHDESKACCOUNT": "Add Freshdesk Account",
+    "SUGARCRMACCOUNTS": "SugarCRM Accounts",
+    "EDIT_SUGARCRMACCOUNT": "Edit SugarCRM Account",
+    "DELETE_SUGARCRMACCOUNT": "Delete SugarCRM Account",
+    "NEW_SUGARCRMACCOUNT": "New SugarCRM Account",
+    "ADD_SUGARCRMACCOUNT": "Add SugarCRM Account",
+    "CONFIGURATIONS": "Configurations",
+    "NO_CONFIGURATION_AVAILABLE": "No Configurations available",
+    "NEW_CONFIGURATION": "New Configuration",
+    "ADD_CONFIGURATION": "Add Configuration",
+    "EDIT_CONFIGURATION": "Edit Configuration",
+    "DELETE_CONFIGURATION": "Delete Configuration",
+    "SUBJECTS": "Subjects",
+    "DESCRIPTIONS": "Descriptions",
+    "FIELDS": "Fields",
+    "TAGS": "Tags",
+    "TYPE": "Type",
+    "CONTENT": "Content",
+    "EDIT_SUBJECT": "Edit Subject",
+    "DELETE_SUBJECT": "Delete Subject",
+    "NEW_SUBJECT": "New Subject",
+    "ADD_SUBJECT": "Add Subject",
+    "EDIT_DESCRIPTION": "Edit Description",
+    "DELETE_DESCRIPTION": "Delete Description",
+    "NEW_DESCRIPTION": "New Description",
+    "ADD_DESCRIPTION": "Add Description",
+    "EDIT_FIELD": "Edit Field",
+    "DELETE_FIELD": "Delete Field",
+    "NEW_FIELD": "New Field",
+    "ADD_FIELD": "Add Field",
+    "ADD": "Add",
+    "VOICE": "Voice",
+    "MAIL": "Email",
+    "CHAT": "Chat",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Open Channel",
+    "INBOUND_IN_QUEUE": "Inbound in Queue",
+    "OUTBOUND_CALL": "Outbound Call",
+    "VALUE": "Value",
+    "FIELD": "Field",
+    "KEY": "Key",
+    "CHANNEL": "Channel",
+    "DELETE": "Delete",
+    "NO_AVAILABLE_INFO": "No available info",
+    "TEST_ZENDESKACCOUNT": "Test Zendesk Account",
+    "TEST_FRESHDESKACCOUNT": "Test Freshdesk Account",
+    "TEST_SUGARCRMACCOUNT": "Test SugerCRM Account",
+    "TEST_SALESFORCEACCOUNT": "Test Salesforce Account",
+    "INTEGRATION_TAB": "Integration Tab",
+    "NEW_TAB": "New Tab",
+    "DESKACCOUNTS": "Desk Accounts",
+    "EDIT_DESKACCOUNT": "Edit Desk Account",
+    "TEST_DESKACCOUNT": "Test Desk Account",
+    "DELETE_DESKACCOUNT": "Delete Desk Account",
+    "CONSUMERKEY": "Consumer Key",
+    "CONSUMERSECRET": "Consumer Secret",
+    "TOKENSECRET": "Token Secret",
+    "ADD_DESKACCOUNT": "Add Desk Account",
+    "NEW_DESKACCOUNT": "New Desk Account",
+    "ADD_DESKCONFIGURATION": "Add Desk Configuration",
+    "NEW_DESKCONFIGURATION": "New Desk Configuration",
+    "DELETE_DESKCONFIGURATION": "Delete Desk Configuration",
+    "ZOHOACCOUNTS": "Zoho Accounts",
+    "EDIT_ZOHOACCOUNT": "Edit Zoho Account",
+    "TEST_ZOHOACCOUNT": "Test Zoho Account",
+    "DELETE_ZOHOACCOUNT": "Delete Zoho Account",
+    "ADD_ZOHOACCOUNT": "Add Zoho Account",
+    "NEW_ZOHOACCOUNT": "New Zoho Account",
+    "ADD_ZOHOCONFIGURATION": "Add Zoho Configuration",
+    "NEW_ZOHOCONFIGURATION": "New Zoho Configuration",
+    "AUTHTOKEN": "Authorization Token",
+    "HOST": "Host",
+    "DELETE_ZOHOCONFIGURATION": "Delete Zoho Configuration",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "VTIGERACCOUNTS": "vTiger Accounts",
+    "VTIGER_USER_NAME": "vTiger User Name",
+    "MODULE_NAME": "vTiger Module Name",
+    "ACCESS_KEY": "vTiger Access Key",
+    "ADD_VTIGERACCOUNT": "Add new vTiger Account",
+    "EDIT_VTIGERACCOUNT": "Edit vTiger Account",
+    "TEST_VTIGERACCOUNT": "Test vTiger Account",
+    "DELETE_VTIGERACCOUNT": "Delete vTiger Account",
+    "NEW_VTIGERACCOUNT": "New vTiger Account",
+    "NEW_VTIGERCONFIGURATION": "Create vTiger Configuration",
+    "DELETE_VTIGERCONFIGURATION": "Delete vTiger Configuration",
+    "ADD_VTIGERCONFIGURATION": "Add vTiger Configuration",
+    "FRESHSALESACCOUNTS": "Freshsales Accounts",
+    "EDIT_FRESHSALESACCOUNT": "Edit Freshsales Account",
+    "DELETE_FRESHSALESACCOUNT": "Delete Freshsales Account",
+    "NEW_FRESHSALESACCOUNT": "New Freshsales Account",
+    "ADD_FRESHSALESACCOUNT": "Add Freshsales Account",
+    "NO_FRESHSALESCONFIGURATION_AVAILABLE": "No Freshsales Configurations available",
+    "NEW_FRESHSALESCONFIGURATION": "New Freshsales Configuration",
+    "ADD_FRESHSALESCONFIGURATION": "Add Freshsales Configuration",
+    "EDIT_FRESHSALESCONFIGURATION": "Edit Freshsales Configuration",
+    "DELETE_FRESHSALESCONFIGURATION": "Delete Freshsales Configuration",
+    "TEST_FRESHSALESACCOUNT": "Test Freshsales Account",
+    "SERVICENOWACCOUNTS": "ServiceNow Accounts",
+    "ADD_SERVICENOWACCOUNT": "Add new ServiceNow Account",
+    "EDIT_SERVICENOWACCOUNT": "Edit ServiceNow Account",
+    "TEST_SERVICENOWACCOUNT": "Test ServiceNow Account",
+    "DELETE_SERVICENOWACCOUNT": "Delete ServiceNow Account",
+    "NEW_SERVICENOWACCOUNT": "New ServiceNow Account",
+    "NEW_SERVICENOWCONFIGURATION": "Create ServiceNow Configuration",
+    "DELETE_SERVICENOWCONFIGURATION": "Delete ServiceNow Configuration",
+    "ADD_SERVICENOWCONFIGURATION": "Add ServiceNow Configuration",
+    "DYNAMICS365ACCOUNTS": "Dynamics365 Accounts",
+    "TENANTID": "Tenant Id",
+    "ADD_DYNAMICS365ACCOUNT": "Add new Dynamics365 Account",
+    "EDIT_DYNAMICS365ACCOUNT": "Edit Dynamics365 Account",
+    "TEST_DYNAMICS365ACCOUNT": "Test Dynamics365 Account",
+    "DELETE_DYNAMICS365ACCOUNT": "Delete Dynamics365 Account",
+    "NEW_DYNAMICS365ACCOUNT": "New Dynamics365 Account",
+    "NEW_DYNAMICS365CONFIGURATION": "Create Dynamics365 Configuration",
+    "DELETE_DYNAMICS365CONFIGURATION": "Delete Dynamics365 Configuration",
+    "ADD_DYNAMICS365CONFIGURATION": "Add Dynamics365 Configuration",
+    "TICKETTYPE": "Ticket Type",
+    "CASE": "Case",
+    "LEADID": "Lead Id",
+    "ADDITIONALSEARCHACCOUNT": "Additional Search Account",
+    "ADDITIONALSEARCHCONTACT": "Additional Search Contact",
+    "ADDITIONALSEARCHLEAD": "Additional Search Lead",
+    "PHONECALL": "Phonecall",
+    "TASK": "Task",
+    "MODULECREATE": "Module Create"
+  }
+}
diff --git a/public/app/main/apps/jscripty/i18n/hu.json b/public/app/main/apps/jscripty/i18n/hu.json
new file mode 100644
index 0000000..c5e12d7
--- /dev/null
+++ b/public/app/main/apps/jscripty/i18n/hu.json
@@ -0,0 +1,228 @@
+{
+  "JSCRIPTY": {
+    "CLONE_PROJECT": "Clone Project",
+    "NAME": "Name",
+    "SEARCH_FOR_ANYONE": "Search",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "DESCRIPTION": "Description",
+    "ERRORS": {
+      "NAME_REQUIRED": "Mandatory field",
+      "PROJECT_REQUIRED": "Mandatory field",
+      "FIELD_REQUIRED": "Mandatory field",
+      "NAME_MUST_VALID_PATTERN": "Wrong format"
+    },
+    "SAVE": "Save",
+    "PROJECTS": "Projects",
+    "ADD_PROJECT": "Add Project",
+    "EDIT_PROJECT": "Edit Project",
+    "DELETE_PROJECT": "Delete Project",
+    "JSCRIPTY": "Jscripty",
+    "ID": "Id",
+    "PROJECT": "Project",
+    "CREATED_AT": "Created At",
+    "NEW_PROJECT": "New Project",
+    "EDIT": "Edit",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "BUILDER": "Builder",
+    "PREVIEW": "Preview",
+    "OPEN_CONTACT": "Open Contact",
+    "SENDUNPAUSEONSUBMIT": "Unpause agent on Submit",
+    "HELP": {
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "ENABLEUNCOMPLETESAVE": "Allow to save the agent session even if the survey is not complete",
+      "SENDUNPAUSEONSUBMIT": "At the end of the survey, automatically stop the agent's pause"
+    },
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "JSCRIPTYSESSIONS": "Project Sessions",
+    "SESSIONS": "Sessions",
+    "STARTTIME": "Start Time",
+    "ENDTIME": "End Time",
+    "MEMBERNAME": "Member Name",
+    "CALLERIDNUM": "Caller Number",
+    "NO_SESSION_AVAILABLE": "No Sessions available",
+    "SESSION_RESULTS": "Session Results",
+    "SHOW_QUESTIONS_SESSION": "Show Session Results",
+    "ANSWERS": "Answers",
+    "NO_RESULTS_AVAILABLE": "No results available",
+    "TOTAL": "Total",
+    "ANSWER": "Answer",
+    "EXPORT_TO_CSV": "Export to CSV",
+    "NO_ANSWERS_AVAILABLE": "No answers available",
+    "DELETE_SESSION": "Delete Session",
+    "RESET_SESSION": "Reset Session",
+    "YES": "Yes",
+    "NO": "No",
+    "DO_YOU_WANT_TO_RESET_SESSION": "Do you want to reset the session?",
+    "ALL_SURVEY_DATA_WILL_BE_LOST": "All survey answers will be lost!",
+    "ENABLEUNCOMPLETESAVE": "Enable incomplete save",
+    "SUBMIT": "Submit",
+    "PROJECT_NOT_AVAILABLE": "Project is not available. Please contact the administrator",
+    "COMPLETE": "Complete",
+    "SESSIONS_PROJECT": "Go to Sessions"
+  },
+  "mwForm": {
+    "form": {
+      "name": "Title",
+      "name.placeholder": "Form title",
+      "description": "Description"
+    },
+    "buttons": {
+      "addPage": "Add page",
+      "moveDown": "Move down",
+      "moveUp": "Move up",
+      "removePage": "Remove page",
+      "remove": "Remove",
+      "addElement": "Add element",
+      "questionReady": "Ready",
+      "next": "Next",
+      "back": "Back",
+      "submit": "Submit",
+      "begin": "Begin",
+      "fold": "Fold",
+      "unfold": "Unfold",
+      "edit": "Edit",
+      "clone": "Clone",
+      "view": "View"
+    },
+    "page": {
+      "tab": {
+        "heading": "Page {{page}} of {{allPages}}"
+      },
+      "elements": {
+        "empty": "Empty page"
+      },
+      "pageWithNameCheckbox": "named",
+      "name": "Page name"
+    },
+    "pageFlow": {
+      "afterPage": "After page {{page}}:",
+      "afterQuestionAnswer": "Go to page based on answer",
+      "goToPage": "Go to page {{page.number}}",
+      "goToNextPage": "Continue to next page",
+      "submitForm": "Submit form"
+    },
+    "elements": {
+      "question": "Question",
+      "image": "Image",
+      "paragraph": "Paragraph"
+    },
+    "question": {
+      "types": {
+        "text": {
+          "name": "Short text"
+        },
+        "textarea": {
+          "name": "Long text"
+        },
+        "radio": {
+          "name": "Radio"
+        },
+        "select": {
+          "name": "Select"
+        },
+        "checkbox": {
+          "name": "Checkboxes"
+        },
+        "grid": {
+          "name": "Grid"
+        },
+        "priority": {
+          "name": "Priority"
+        },
+        "division": {
+          "name": "Division"
+        },
+        "number": {
+          "name": "Number"
+        },
+        "date": {
+          "name": "Date"
+        },
+        "datetime": {
+          "name": "Datetime"
+        },
+        "time": {
+          "name": "Time"
+        },
+        "email": {
+          "name": "Email"
+        },
+        "range": {
+          "name": "Range"
+        },
+        "url": {
+          "name": "URL"
+        }
+      },
+      "text": "Question text",
+      "type": "Question type",
+      "required": "Required",
+      "preview": {
+        "text": "Short answer text",
+        "textarea": "Long answer text",
+        "otherAnswer": "Other"
+      },
+      "division": {
+        "quantity": "Quantity",
+        "unit": "Unit label",
+        "assignedSumLabel": "Assigned",
+        "fromRequiredLabel": "from required"
+      },
+      "priority": {
+        "sorted": "Sorted",
+        "available": "Available",
+        "clickToAddItem": "Click to add item"
+      },
+      "grid": {
+        "cellInputType": "Cell input type",
+        "cellInputTypes": {
+          "radio": "Radio",
+          "checkbox": "Checkbox",
+          "text": "Text",
+          "number": "Number",
+          "date": "Date",
+          "time": "Time"
+        },
+        "rowLabel": "Row {{row}}",
+        "clickToAddRow": "Click to add row",
+        "columnLabel": "Column {{col}}",
+        "clickToAddColumn": "Click to add column"
+      },
+      "range": {
+        "from": "Range from",
+        "to": "to"
+      },
+      "number": {
+        "min": "Min",
+        "max": "Max"
+      },
+      "orLabel": "or ",
+      "otherLabel": "Other: ",
+      "userAnswer": "User answer",
+      "buttons": {
+        "addOption": "Click to add option",
+        "addOther": "Add 'Other'"
+      }
+    },
+    "image": {
+      "selectImageButton": "Select image",
+      "caption": "Image caption"
+    },
+    "paragraph": {
+      "placeholder": "Enter paragraph text"
+    },
+    "confirmationPage": {
+      "title": "Confirmation page",
+      "customMessage": "Custom confirmation message",
+      "defaultMessage": "Your response has been saved",
+      "errorMessage": "Error! Your response has not been saved",
+      "pendingMessage": "Your response is being saved"
+    }
+  }
+}
diff --git a/public/app/main/apps/mail/i18n/de.json b/public/app/main/apps/mail/i18n/de.json
index 4b2f44e..fd1c6a8 100644
--- a/public/app/main/apps/mail/i18n/de.json
+++ b/public/app/main/apps/mail/i18n/de.json
@@ -1,83 +1,83 @@
 {
   "MAIL": {
     "TEXT": "Text",
-    "TIMES": "Die Anzahl der Zeiten pro Interaktion",
-    "EDIT_AUTOREPLY": "Bearbeiten Sie automatische Antwort",
+    "TIMES": "Zeitstempel",
+    "EDIT_AUTOREPLY": "Automatische Antwort bearbeiten",
     "AUTOREPLY": "Automatische Antwort",
-    "SHOW_AUTOREPLY": "Die automatische Antwort anzeigen",
+    "SHOW_AUTOREPLY": "Automatische Antwort anzeigen",
     "SHOW_DETAILS": "Details anzeigen",
     "HIDE_DETAILS": "Details ausblenden",
-    "TO": "Zu",
+    "TO": "An",
     "FROM": "Von",
     "DATE": "Datum",
-    "CC": "Cc",
-    "REPLY": "Antwort",
+    "CC": "CC",
+    "REPLY": "Antworten",
     "REPLY_ALL": "Allen antworten",
-    "FORWARD": "Vorwärts",
+    "FORWARD": "Weiterleiten",
     "SUBJECT": "Betreff",
-    "BCC": "Bcc",
+    "BCC": "BCC",
     "SEND": "Senden",
     "ATTACHMENT": "Anhang",
     "ATTACHMENTS": "Anhänge",
     "NAME": "Name",
     "MAILQUEUES": "E-Mail Warteschlangen",
-    "SEARCH_FOR_ANYONE": "Suche für Jedermann",
+    "SEARCH_FOR_ANYONE": "Suche",
     "STRATEGY": "Strategie",
     "ERRORS": {
-      "TEXT_REQUIRED": "Das Feld \"Text\" ist erforderlich",
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "AGENT_TIMEOUT_REQUIRED": "Der Agent Timeout ist erforderlich",
-      "EMAIL_ADDRESS_REQUIRED": "Die E-Mail-Adresse ist erforderlich",
-      "EMAIL_ADDRESS_MUST_VALID": "Die E-Mail Adresse muss in einem gültigen Format",
-      "HOST_REQUIRED": "Der Host wird benötigt",
-      "USERNAME_REQUIRED": "Der Benutzername ist erforderlich",
-      "PORT_REQUIRED": "Der Port ist erforderlich",
+      "TEXT_REQUIRED": "Feld \"Text\" ist erforderlich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "AGENT_TIMEOUT_REQUIRED": "Agent Timeout ist erforderlich",
+      "EMAIL_ADDRESS_REQUIRED": "E-Mail-Adresse ist erforderlich",
+      "EMAIL_ADDRESS_MUST_VALID": "E-Mail ungültiges Format",
+      "HOST_REQUIRED": "Host wird benötigt",
+      "USERNAME_REQUIRED": "Benutzername ist erforderlich",
+      "PORT_REQUIRED": "Port ist erforderlich",
       "CONNTIMEOUT_REQUIRED": "Timeout der Verbindung ist erforderlich",
-      "AUTHTIMEOUT_REQUIRED": "Das Zeitlimit für die Authentifizierung erforderlich ist",
-      "ACCEPTURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "TIMEOUT_REQUIRED": "Der Timeout ist erforderlich",
-      "REJECTURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "CLOSEURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "AGENT_REQUIRED": "Der Agent ist erforderlich",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Timeout muss größer als oder gleich",
-      "DISPOSITION_REQUIRED": "Die Disposition ist erforderlich",
-      "CONDITION_REQUIRED": "Der Zustand ist erforderlich",
-      "TRUEPRIORITY_REQUIRED": "Die wahre Priorität ist erforderlich",
-      "FALSEPRIORITY_REQUIRED": "Die falsche Priorität ist erforderlich",
-      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die wahre Priorität muss größer als oder gleich",
-      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die falsche Priorität muss größer als oder gleich",
-      "PRIORITY_REQUIRED": "Die Priorität ist erforderlich",
-      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Priorität muss größer als oder gleich",
-      "QUEUE_REQUIRED": "Die Warteschlange ist erforderlich",
-      "LIST_REQUIRED": "Die Liste ist erforderlich",
-      "PASSWORD_REQUIRED": "Das Kennwort ist erforderlich",
-      "SERVICE_REQUIRED": "Der Dienst ist erforderlich,",
-      "IMAP_HOST_REQUIRED": "Der IMAP-Host wird benötigt",
-      "IMAP_PORT_REQUIRED": "Der IMAP-Anschluss erforderlich",
-      "SMTP_HOST_REQUIRED": "Der SMTP-Host ist erforderlich",
-      "SMTP_PORT_REQUIRED": "Der SMTP-Port ist erforderlich",
-      "CONFIRM_NOT_MATCH": "Die Passwörter nicht übereinstimmen",
-      "KEY_MAX_LENGTH": "Schlüssel muss eine maximale Länge von {{max}}",
-      "KEY_REQUIRED": "Der Schlüssel ist erforderlich",
-      "TEXT_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
+      "AUTHTIMEOUT_REQUIRED": "Zeitlimit für die Authentifizierung ist erforderlich",
+      "ACCEPTURL_MUST_VALID_URL": "URL ungültiges Format",
+      "TIMEOUT_REQUIRED": "Timeout ist erforderlich",
+      "REJECTURL_MUST_VALID_URL": "URL ungültiges Format",
+      "CLOSEURL_MUST_VALID_URL": "URL ungültiges Format",
+      "AGENT_REQUIRED": "Agent ist erforderlich",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Timeout muss größer oder gleich sein als",
+      "DISPOSITION_REQUIRED": "Qualifizierung ist erforderlich",
+      "CONDITION_REQUIRED": "Bedingung ist erforderlich",
+      "TRUEPRIORITY_REQUIRED": "Wahre Priorität ist erforderlich",
+      "FALSEPRIORITY_REQUIRED": "Falsche Priorität ist erforderlich",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wahre Priorität muss größer oder gleich sein als",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Falsche Priorität muss größer oder gleich sein als",
+      "PRIORITY_REQUIRED": "Priorität ist erforderlich",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Priorität muss größer oder gleich sein als",
+      "QUEUE_REQUIRED": "Warteschlange ist erforderlich",
+      "LIST_REQUIRED": "Liste ist erforderlich",
+      "PASSWORD_REQUIRED": "Passwort ist erforderlich",
+      "SERVICE_REQUIRED": "Dienst ist erforderlich,",
+      "IMAP_HOST_REQUIRED": "IMAP-Host ist erforderlich",
+      "IMAP_PORT_REQUIRED": "IMAP-Port erforderlich",
+      "SMTP_HOST_REQUIRED": "SMTP-Host ist erforderlich",
+      "SMTP_PORT_REQUIRED": "SMTP-Port ist erforderlich",
+      "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein",
+      "KEY_MAX_LENGTH": "Schlüssel darf eine maximale Länge haben von {{max}}",
+      "KEY_REQUIRED": "Schlüssel ist erforderlich",
+      "TEXT_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}}",
       "VALUE_REQUIRED": "Pflichtfeld",
-      "FONT_SIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "FONT_SIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "FONT_SIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "FONT_SIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "FONT_SIZE_REQUIRED": "Pflichtfeld",
       "COMMAND_REQUIRED": "Pflichtfeld",
-      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "NAME_MUST_VALID_PATTERN": "Falsches Format",
-      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Pflichtfeld",
       "TAG_REQUIRED": "Pflichtfeld",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "AGENTTRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "QUEUETRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Pflichtfeld",
       "REPLY_TYPE_REQUIRED": "Pflichtfeld"
@@ -93,9 +93,9 @@
     "MAILACCOUNTS": "E-Mail Konten",
     "EMAIL_ADDRESS": "E-Mail Adresse",
     "ADD_MAILACCOUNT": "E-Mail Konto hinzufügen",
-    "EDIT_MAILACCOUNT": "E-Mail-Konto bearbeiten",
-    "DELETE_MAILACCOUNT": "E-Mail-Konten löschen",
-    "DISPOSITIONS": "Bestimmungen",
+    "EDIT_MAILACCOUNT": "E-Mail Konto bearbeiten",
+    "DELETE_MAILACCOUNT": "E-Mail Konto löschen",
+    "DISPOSITIONS": "Qualifizierungen",
     "WEBHOOKS": "WebHooks",
     "ACTIONS": "Aktionen",
     "OTHERS": "Andere",
@@ -105,20 +105,20 @@
     "SERVICE": "Service",
     "CREATED_AT": "Erstellt am",
     "ACCEPT": "Akzeptieren",
-    "ACCEPTMETHOD": "Die Methode",
+    "ACCEPTMETHOD": "Methode akzeptieren",
     "ACCEPTURL": "URL akzeptieren",
     "REJECT": "Ablehnen",
     "REJECTMETHOD": "Methode ablehnen",
     "REJECTURL": "URL ablehnen",
-    "CLOSE": "In der Nähe",
-    "CLOSEMETHOD": "In der Nähe Methode",
-    "CLOSEURL": "Der URL",
+    "CLOSE": "Schließen",
+    "CLOSEMETHOD": "Methode schließen",
+    "CLOSEURL": "URL schließen",
     "WHITELABEL": "White Label",
-    "SIGNATURE": "Unterschrift",
+    "SIGNATURE": "Signatur",
     "IMAP": "IMAP",
     "HOST": "Host",
     "USERNAME": "Benutzername",
-    "PORT": "Hafen",
+    "PORT": "Port",
     "MAILBOX": "Mailbox",
     "FILTER": "Filter",
     "CONNTIMEOUT": "Connection Timeout [sek]",
@@ -130,48 +130,48 @@
     "SMTP": "SMTP",
     "SELECTED": "Ausgewählte",
     "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
+    "SELECT_NONE": "Nichts auswählen",
     "BACK": "Zurück",
     "MAIL": "E-Mail",
-    "ID": "Id",
+    "ID": "ID",
     "TIMEOUT": "Timeout",
     "PASSWORD": "Passwort",
-    "NO_MAILDISPOSITION_AVAILABLE": "Keine E-Mail zur Verfügung Verfügungen",
-    "ADD_MAILDISPOSITION": "E-Mail hinzufügen Disposition",
-    "NEW_MAILDISPOSITION": "Neue E-Mail zur Verfügung",
-    "EDIT_MAILDISPOSITION": "Bearbeiten von E-Mail zur Verfügung",
-    "DELETE_MAILDISPOSITION": "Löschen von E-Mail zur Verfügung",
-    "MAILDISPOSITIONS": "E-Mail Verfügungen",
+    "NO_MAILDISPOSITION_AVAILABLE": "Keine E-Mail Qualifizierung verfügbar",
+    "ADD_MAILDISPOSITION": "Qualifizierung hinzufügen",
+    "NEW_MAILDISPOSITION": "Neue E-Mail Qualifizierung",
+    "EDIT_MAILDISPOSITION": "Qualifizierung bearbeiten",
+    "DELETE_MAILDISPOSITION": "Qualifizierung löschen",
+    "MAILDISPOSITIONS": "E-Mail Qualifizierungen",
     "NEW_MAILQUEUE": "Neue E-Mail Warteschlange",
-    "NEW_MAILACCOUNT": "Neue E-Mail Konto",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
-    "ALL_TEAMS": "Alle Mannschaften",
+    "NEW_MAILACCOUNT": "Neues E-Mail Konto",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
+    "ALL_TEAMS": "Alle Teams",
     "SELECTED_TEAMS": "Ausgewählte Teams",
     "HELP": {
       "NAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
-      "USERNAME": "Benutzername für die Authentifizierung verwendet werden",
-      "PASSWORD": "Kennwort für die Authentifizierung verwendet werden",
-      "SECURE": "Bei true wird die Verbindung TLS verwenden, wenn eine Verbindung zu Server",
-      "FONT_FAMILY": "Standardschriftfamilie",
+      "USERNAME": "Benutzername für die Authentifizierung",
+      "PASSWORD": "Passwort für die Authentifizierung",
+      "SECURE": "Bei true wird die Verbindung TLS verwenden, wenn eine Verbindung zum Server aufgebaut wird",
+      "FONT_FAMILY": "Standard-Schriften",
       "FONT_SIZE": "Standard Schriftgröße",
-      "MARK_AS_UNREAD": "Agent aktivieren / deaktivieren, um die letzte Nachricht einer Interaktion als ungelesen zu markieren",
-      "MANDATORYDISPOSITION": "Zwingende Disposition",
-      "MANDATORYDISPOSITIONPAUSEID": "Anhalten, um zu verwenden, wenn die obligatorische Disposition aktiviert ist"
+      "MARK_AS_UNREAD": "Aktivieren / deaktivieren, um die letzte Nachricht einer Interaktion als ungelesen zu markieren",
+      "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+      "MANDATORYDISPOSITIONPAUSEID": "PausenID bei erforderlicher Qualifizierung"
     },
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
-    "TEAMADD_MAILQUEUE": "Team Chat Warteschlange hinzufügen",
-    "AGENTADD_MAILQUEUE": "Agent zu Chatten Warteschlange hinzufügen",
+    "OF": "von",
+    "TEAMADD_MAILQUEUE": "Team zur Warteschlange hinzufügen",
+    "AGENTADD_MAILQUEUE": "Agenten zur Warteschlange hinzufügen",
     "ALL_AGENTS": "Alle Agenten",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
     "AGENT": "Agent",
     "EDIT_AGENT": "Agent bearbeiten",
-    "EDIT_CLOSE": "Bearbeiten Schließen",
-    "DISPOSITION": "Disposition",
-    "GOTOIF": "GotoIf",
+    "EDIT_CLOSE": "Bearbeitung abschließen",
+    "DISPOSITION": "Qualifizierung",
+    "GOTOIF": "GoToIf",
     "EDIT_GOTOIF": "Bearbeiten GotoIf",
-    "CONDITION": "Zustand",
+    "CONDITION": "Bedingung",
     "TRUEPRIORITY": "Wahre Priorität",
     "FALSEPRIORITY": "Falsche Priorität",
     "GOTOP": "GotoP",
@@ -182,14 +182,14 @@
     "VALUE": "Wert",
     "QUEUE": "Warteschlange",
     "EDIT_QUEUE": "Warteschlange bearbeiten",
-    "INTERACTIONS": "Wechselwirkungen",
-    "STARTEDAT": "Gestartet am",
+    "INTERACTIONS": "Interaktionen",
+    "STARTEDAT": "Startdatum",
     "CONTACT": "Kontakt",
     "CLOSEDAT": "Geschlossen",
-    "NOTES": "Hinweise",
-    "NO_INTERACTION_AVAILABLE": "Es sind keine Wechselwirkungen zur Verfügung",
+    "NOTES": "Anmerkungen",
+    "NO_INTERACTION_AVAILABLE": "Keine neuen Interaktionen verfügbar",
     "ACTIVE": "Aktiv",
-    "SECURE": "Sichere",
+    "SECURE": "Sicher",
     "AUTHENTICATION": "Authentifizierung",
     "SMTP_HOST": "SMTP-Host",
     "SMTP_PORT": "SMTP-Port",
@@ -197,7 +197,7 @@
     "IMAP_PORT": "IMAP-Port",
     "CONFIRM_PASSWORD": "Passwort bestätigen",
     "SELECT_STATUS": "Status auswählen",
-    "OPENED": "Öffnen",
+    "OPENED": "Geöffnet",
     "CLOSED": "Geschlossen",
     "ALL": "Alle",
     "SELECT_ACCOUNT": "Konto auswählen",
@@ -209,117 +209,117 @@
     "UNPAUSE": "Pause beenden",
     "DEFAULT_PAUSE": "Standard Pause",
     "LOGOUT": "An-/Abmelden",
-    "AGENTADD_QUEUE": "Agent E-Mail Warteschlange hinzufügen",
-    "VOICE": "Voice",
+    "AGENTADD_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "VOICE": "Anrufe",
     "CHAT": "Chat",
-    "SMS": "Sms",
-    "OPENCHANNEL": "Channel öffnen",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Offener Kanal",
     "FAX": "Fax",
     "REALTIME": "Echtzeit",
     "AGENTS": "Agenten",
     "QUEUES": "Warteschlangen",
     "ACCOUNTS": "Konten",
-    "FULLNAME": "Voller Name",
-    "INTERNAL": "Interne",
+    "FULLNAME": "Vollständiger Name",
+    "INTERNAL": "Intern",
     "PHONE_STATE": "Telefonstatus",
     "PHONE_STATUS": "Telefonstatus",
     "PAUSE": "Pause",
     "LOGGED_IN": "Angemeldet",
     "PAUSED": "Angehalten",
     "READY": "Bereit",
-    "WAITING": "Warten",
-    "TOTAL": "Insgesamt",
-    "IN": "In",
-    "OUT": "Aus",
+    "WAITING": "Wartezustand",
+    "TOTAL": "Gesamt",
+    "IN": "Eingehend",
+    "OUT": "Ausgehend",
     "IMAP_STATUS": "IMAP-Status",
     "SMTP_STATUS": "SMTP-Status",
     "DISABLED": "Deaktiviert",
     "CONNECTED": "Verbunden",
-    "NEVER_VERIFIED": "Nie verifiziert",
+    "NEVER_VERIFIED": "Noch nicht verifiziert",
     "ERROR": "Fehler",
     "EDIT_ACCOUNT": "Konto bearbeiten",
-    "VERIFY_SMTP": "Überprüfen Sie die SMTP-",
+    "VERIFY_SMTP": "Bitte SMTP-Einstellungen prüfen",
     "VERIFIED": "Überprüft",
-    "VERIFYSMTP_MAILACCOUNT": "Überprüfen Sie die SMTP-",
-    "GOTOREALTIME_MAILACCOUNT": "In Echtzeit, E-Mail Konto",
-    "GOTO_MAILACCOUNT": "In Echtzeit, E-Mail Konto",
+    "VERIFYSMTP_MAILACCOUNT": "Bitte SMTP-Einstellungen prüfen",
+    "GOTOREALTIME_MAILACCOUNT": "Zum E-Mail-Konto Echtzeitmonitoring",
+    "GOTO_MAILACCOUNT": "Zum E-Mail Konto gehen",
     "UNKNOWN": "Unbekannt",
-    "UNREGISTERED": "Unregistrierte",
+    "UNREGISTERED": "Nicht registriert",
     "UNAVAILABLE": "Nicht verfügbar",
-    "NOT_INUSE": "Nicht in Gebrauch",
+    "NOT_INUSE": "Nicht in Verwendung",
     "REACHABLE": "Erreichbar",
-    "IN_USE": "Im Einsatz",
-    "AGENTSADD_QUEUE": "Agenten zu Warteschlange hinzufügen",
-    "INFO": "Info",
+    "IN_USE": "In Verwendung",
+    "AGENTSADD_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "INFO": "Information",
     "NO_AGENT_ONLINE": "Kein Agent Online",
-    "GOTOREALTIME_MAILQUEUE": "In Echtzeit, E-Mail Warteschlange",
-    "PARTIALPAUSE": "Lastschriftzahlung teilweise Pause",
+    "GOTOREALTIME_MAILQUEUE": "Echtzeitmonitoring E-Mail Warteschlangen",
+    "PARTIALPAUSE": "Teilpause",
     "BUSY": "Besetzt",
     "TIMER": "Timer",
     "IDLE": "Leerlauf",
     "CAPACITY": "Kapazität",
-    "SPYINTERACTION": "Spy",
+    "SPYINTERACTION": "Mithören",
     "ADD_NOTE": "Notiz hinzufügen",
-    "NOTE": "Hinweis",
+    "NOTE": "Notiz",
     "TAGS": "Tags",
-    "INTERACTIONS_MAILACCOUNT": "Zu Wechselwirkungen gehen",
-    "REFRESH_INTERACTIONS": "Aktualisieren Interaktionen",
-    "PENDING": "Ausstehend",
-    "SEND_AS_PENDING": "Senden als Ausstehend",
-    "SEND_AND_CLOSE": "Senden und Schließen",
-    "CANNED_ANSWER_NOT_FOUND": "Es wurden keine vordefinierten Antworten gefunden",
-    "CANNED_ANSWER_SEARCH": "Geben Sie einen Text ein, um eine vordefinierte Antwort zu suchen",
-    "NO_MAILCANNEDANSWER_AVAILABLE": "Keine vordefinierten Antworten verfügbar",
-    "NEW_MAILCANNEDANSWER": "Neue vordefinierte Antowrt",
-    "ADD_MAILCANNEDANSWER": "Vordefinierte Antwort hinzufügen",
-    "EDIT_MAILCANNEDANSWER": "Vordefiierte Antwort bearbeiten",
-    "DELETE_MAILCANNEDANSWER": "Vordefinierte Antwort löschen",
+    "INTERACTIONS_MAILACCOUNT": "Zu den Interaktionen gehen",
+    "REFRESH_INTERACTIONS": "Interaktionen aktualisieren",
+    "PENDING": "Warten auf Rückmeldung",
+    "SEND_AS_PENDING": "Senden und auf Rückmeldung warten",
+    "SEND_AND_CLOSE": "Senden und schließen",
+    "CANNED_ANSWER_NOT_FOUND": "Keine Textvorlagen gefunden",
+    "CANNED_ANSWER_SEARCH": "Nach Textvorlagen suchen",
+    "NO_MAILCANNEDANSWER_AVAILABLE": "Keine Textvorlagen verfügbar",
+    "NEW_MAILCANNEDANSWER": "Neue Textvorlage",
+    "ADD_MAILCANNEDANSWER": "Textvorlage hinzufügen",
+    "EDIT_MAILCANNEDANSWER": "Textvorlage bearbeiten",
+    "DELETE_MAILCANNEDANSWER": "Textvorlage löschen",
     "SHOW_ORIGINAL_MESSAGE": "Ursprüngliche Nachricht anzeigen",
     "DELETE_INTERACTION": "Interaktion löschen",
     "ACCEPTED": "Akzeptiert",
     "FONT_FAMILY": "Schriftfamilie",
     "FONT_SIZE": "Schriftgröße",
-    "MARK_AS_UNREAD": "als ungelesen markieren",
-    "ADD_MAILSUBSTATUS": "Unterstatus hinzufügen",
-    "DELETE_MAILSUBSTATUS": "Löschen",
-    "EDIT_MAILSUBSTATUS": "Bearbeiten",
-    "MAILSUBSTATUSES": "E-Mail-Unterstatus",
-    "NEW_MAILSUBSTATUS": "Neuer Unterstatus",
-    "SEND_AS": "Senden Als",
-    "COMMAND": "Befehl",
+    "MARK_AS_UNREAD": "Als ungelesen markieren",
+    "ADD_MAILSUBSTATUS": "SubStatus hinzufügen",
+    "DELETE_MAILSUBSTATUS": "SubStatus löschen",
+    "EDIT_MAILSUBSTATUS": "SubStatus bearbeiten",
+    "MAILSUBSTATUSES": "E-Mail SubStatus",
+    "NEW_MAILSUBSTATUS": "Neuer SubStatus",
+    "SEND_AS": "Senden als",
+    "COMMAND": "Eingabe",
     "EDIT_SYSTEM": "System bearbeiten",
     "SYSTEM": "System",
     "VARIABLE": "Variable",
     "NOTIFICATION": "Benachrichtigung",
-    "NOTIFICATIONSHAKE": "Shake",
-    "NOTIFICATIONSOUND": "Klingen",
+    "NOTIFICATIONSHAKE": "Schütteln",
+    "NOTIFICATIONSOUND": "Klingeln",
     "NOTIFICATIONTEMPLATE": "Vorlage",
     "WAITFORTHEASSIGNEDAGENT": "Warte auf den zugewiesenen Agenten",
     "EDIT_TAG": "Tag bearbeiten",
-    "TAG": "Etikett",
-    "AGENTTRANSFER": "Agentenübertragung",
-    "AGENTTRANSFERTIMEOUT": "Zeitlimit für Agentenübertragungen",
-    "QUEUETRANSFER": "Warteschlangenübertragung",
-    "QUEUETRANSFERTIMEOUT": "Zeitüberschreitung bei der Warteschlangenübertragung",
-    "TRANSFER": "Transfer",
-    "AGENTADD_MAILACCOUNT": "Fügen Sie dem E-Mail-Konto Agent hinzu",
+    "TAG": "Tag",
+    "AGENTTRANSFER": "Weiterleitung Agent",
+    "AGENTTRANSFERTIMEOUT": "Zeitlimit für Agententransfer",
+    "QUEUETRANSFER": "Weiterleitung Warteschlange",
+    "QUEUETRANSFERTIMEOUT": "Zeitüberschreitung für Warteschlangentransfer",
+    "TRANSFER": "Weiterleitung",
+    "AGENTADD_MAILACCOUNT": "Agenten zum E-Mail Konto hinzufügen",
     "YOU_ARE_REGISTERED_AS_A": "Sie sind registriert als",
-    "CANNEDANSWERS": "Vordefinierte Antworten",
+    "CANNEDANSWERS": "Textvorlagen",
     "DOWNLOAD_INTERACTION": "Herunterladen",
-    "MAILCANNEDANSWERS": "Vordefinierte Antworten",
-    "LOGIN_TIME": "Login-Zeit",
-    "PAUSE_TIME": "Pausenzeit",
+    "MAILCANNEDANSWERS": "E-Mail Textvorlagen",
+    "LOGIN_TIME": "Zeit angemeldet",
+    "PAUSE_TIME": "Zeit in Pause",
     "DOWNLOAD": "Herunterladen",
-    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download ohne Anhänge",
-    "DOWNLOAD_WITH_ATTACHMENTS": "Mit Anhängen herunterladen",
-    "TEAMS_ASSOCIATION": "Vereinigung der Mannschaften",
-    "MANDATORYDISPOSITION": "Zwingende Disposition",
-    "MANDATORYDISPOSITIONPAUSEID": "Pause zur Verwendung, wenn die obligatorische Disposition aktiviert ist",
-    "ADVANCED": "Fortgeschritten",
-    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme verfügbar",
-    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
-    "DOWNLOAD_WITHOUT_ATTACHMENT": "Ohne Anhang herunterladen",
-    "DOWNLOAD_WITH_ATTACHMENT": "Download mit Anhang",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Herunterladen ohne Anhänge",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Herunterlagen inkl. Anhänge",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
+    "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+    "MANDATORYDISPOSITIONPAUSEID": "Qualifizierung pausieren, sofern sonst erforderlich",
+    "ADVANCED": "Erweitert",
+    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufzeichnung angehalten",
+    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufzeichnung läuft",
+    "DOWNLOAD_WITHOUT_ATTACHMENT": "Herunterladen ohne Anhang",
+    "DOWNLOAD_WITH_ATTACHMENT": "Herunterladen inkl. Anhang",
     "LASTMESSAGE": "Letzte Nachricht",
     "REPLY_TYPE": "Antworttyp"
   }
diff --git a/public/app/main/apps/mail/i18n/en.json b/public/app/main/apps/mail/i18n/en.json
index 6183ea9..22a7db6 100644
--- a/public/app/main/apps/mail/i18n/en.json
+++ b/public/app/main/apps/mail/i18n/en.json
@@ -178,7 +178,8 @@
       "CONFIRM_NOT_MATCH": "The passwords inserted don't match",
       "KEY_MAX_LENGTH": "Key must have a maximum length equal to {{max}}",
       "KEY_REQUIRED": "Mandatory Field",
-      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field"
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
+      "FIELD_REQUIRED": "Mandatory field"
     },
     "AGENT_TIMEOUT": "Agent Timeout",
     "DESCRIPTION": "Description",
@@ -192,7 +193,7 @@
     "EMAIL_ADDRESS": "Email Address",
     "ADD_MAILACCOUNT": "Add Email Account",
     "EDIT_MAILACCOUNT": "Edit Email Account",
-    "DELETE_MAILACCOUNT": "Delete Email Accounts",
+    "DELETE_MAILACCOUNT": "Delete Email Account",
     "DISPOSITIONS": "Dispositions",
     "WEBHOOKS": "WebHooks",
     "ACTIONS": "Actions",
@@ -254,7 +255,8 @@
       "SECURE": "If true, the connection will use TLS when connecting to server",
       "MANDATORYDISPOSITION": "Mandatory disposition",
       "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled",
-      "MARK_AS_UNREAD": "Enable/Disable agent to mark as unread the last message of an interaction"
+      "MARK_AS_UNREAD": "Enable/Disable agent to mark as unread the last message of an interaction",
+      "CLOUD_PROVIDER": "Cloud Provider used for authentication"
     },
     "PAGE": "Page",
     "ROWSPERPAGE": "Rows per page",
@@ -321,6 +323,24 @@
     "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
     "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
     "DOWNLOAD_WITH_ATTACHMENT": "Download with attachment",
-    "DOWNLOAD_WITHOUT_ATTACHMENT": "Download without attachment"
+    "DOWNLOAD_WITHOUT_ATTACHMENT": "Download without attachment",
+    "MODERN_AUTHENTICATION": "Modern Authentication",
+    "CLOUD_PROVIDER": "Cloud Provider",
+    "CUSTOM": "Custom",
+    "CREDENTIALS": "Credentials",
+    "NOTIFICATIONS": {
+      "ACCOUNT_CREATED_SUCCESS_TITLE": "Account successfully created",
+      "ACCOUNT_SAVED_SUCCESS_TITLE": "Account successfully saved",
+      "ACCOUNT_DELETE_TITLE": "Are you sure want to delete the account?",
+      "ACCOUNT_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "ACCOUNT_DELETED_SUCCESS_TITLE": "Account successfully deleted",
+      "ACCOUNT_SERVICE_DELETE": "You cannot delete a service account",
+      "ACCOUNTS_DELETE_TITLE": "Are you sure want to delete the selected accounts?",
+      "ACCOUNTS_DELETE_MESSAGE": "{{ total }} accounts will be deleted",
+      "ACCOUNTS_DELETED_SUCCESS_TITLE": "Accounts successfully deleted",
+      "SMTP_CONNECTION_SUCCESS_TITLE": "Successfully connected to the SMTP server",
+      "SMTP_CONNECTION_FAIL_TITLE": "Unable to connect to the SMTP server",
+      "UNKNOWN_SMTP_SERVER": "Unknown STMP server"
+    }
   }
 }
diff --git a/public/app/main/apps/mail/i18n/hu.json b/public/app/main/apps/mail/i18n/hu.json
new file mode 100644
index 0000000..7a1ec06
--- /dev/null
+++ b/public/app/main/apps/mail/i18n/hu.json
@@ -0,0 +1,326 @@
+{
+  "MAIL": {
+    "ADVANCED": "Advanced",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments",
+    "DOWNLOAD": "Download",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "DOWNLOAD_INTERACTION": "Download",
+    "YOU_ARE_REGISTERED_AS_A": "You are registered as a",
+    "TRANSFER": "Transfer",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "TAG": "Tag",
+    "EDIT_TAG": "Edit Tag",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "SYSTEM": "System",
+    "EDIT_SYSTEM": "Edit System",
+    "COMMAND": "Command",
+    "VARIABLE": "Variable",
+    "SEND_AS": "Send as",
+    "NEW_MAILSUBSTATUS": "New Sub Status",
+    "ADD_MAILSUBSTATUS": "Add Sub Status",
+    "MAILSUBSTATUSES": "Email Sub Statuses",
+    "EDIT_MAILSUBSTATUS": "Edit",
+    "DELETE_MAILSUBSTATUS": "Delete",
+    "FONT_FAMILY": "Font Family",
+    "FONT_SIZE": "Font Size",
+    "MARK_AS_UNREAD": "Mark as unread",
+    "ACCEPTED": "Accepted",
+    "CANNEDANSWERS": "Canned Answers",
+    "MAILCANNEDANSWERS": "Canned Answers",
+    "NO_MAILCANNEDANSWER_AVAILABLE": "No Canned Answers Available",
+    "NEW_MAILCANNEDANSWER": "New Canned Answer",
+    "ADD_MAILCANNEDANSWER": "Add Canned Answer",
+    "EDIT_MAILCANNEDANSWER": "Edit Canned Answer",
+    "DELETE_MAILCANNEDANSWER": "Delete Canned Answer",
+    "SHOW_ORIGINAL_MESSAGE": "Show original message",
+    "PENDING": "Pending",
+    "SEND_AS_PENDING": "Send as Pending",
+    "SEND_AND_CLOSE": "Send and Close",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
+    "CANNED_ANSWER_SEARCH": "Enter a text to search a Canned Answer",
+    "SPYINTERACTION": "Spy",
+    "ADD_NOTE": "Add note",
+    "NOTE": "Note",
+    "TAGS": "Tags",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "GOTOREALTIME_MAILQUEUE": "Go To Realtime Mail Queue",
+    "PARTIALPAUSE": "Parital Pause",
+    "BUSY": "Busy",
+    "TIMER": "Timer",
+    "IDLE": "Idle",
+    "CAPACITY": "Capacity",
+    "UNPAUSE": "End Pause",
+    "DEFAULT_PAUSE": "Default pause",
+    "LOGOUT": "Logout",
+    "AGENTADD_QUEUE": "Add Agent To Email Queue",
+    "VOICE": "Voice",
+    "CHAT": "Chat",
+    "SMS": "Sms",
+    "OPENCHANNEL": "Open channel",
+    "FAX": "Fax",
+    "REALTIME": "Realtime",
+    "AGENTS": "Agents",
+    "QUEUES": "Queues",
+    "ACCOUNTS": "Accounts",
+    "FULLNAME": "Full Name",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "PAUSE": "Pause",
+    "LOGGED_IN": "Logged In",
+    "PAUSED": "Paused",
+    "READY": "Ready",
+    "WAITING": "Waiting",
+    "TOTAL": "Total",
+    "IN": "In",
+    "OUT": "Out",
+    "IMAP_STATUS": "IMAP Status",
+    "SMTP_STATUS": "SMTP Status",
+    "DISABLED": "Disabled",
+    "CONNECTED": "Connected",
+    "NEVER_VERIFIED": "Never Verified",
+    "ERROR": "Error",
+    "EDIT_ACCOUNT": "Edit Account",
+    "VERIFY_SMTP": "Verify SMTP",
+    "VERIFIED": "Verified",
+    "VERIFYSMTP_MAILACCOUNT": "Verify SMTP",
+    "GOTOREALTIME_MAILACCOUNT": "Go to Realtime Email Account",
+    "GOTO_MAILACCOUNT": "Go to Realtime Email Account",
+    "TEXT": "Text",
+    "TIMES": "Number of times per interaction",
+    "REPLY_TYPE": "Reply Type",
+    "EDIT_AUTOREPLY": "Edit Auto Reply",
+    "AUTOREPLY": "Auto Reply",
+    "SHOW_AUTOREPLY": "Show Auto Reply",
+    "SHOW_DETAILS": "Show details",
+    "HIDE_DETAILS": "Hide details",
+    "TO": "To",
+    "FROM": "From",
+    "DATE": "Date",
+    "CC": "Cc",
+    "REPLY": "Reply",
+    "REPLY_ALL": "Reply All",
+    "FORWARD": "Forward",
+    "SUBJECT": "Subject",
+    "BCC": "Bcc",
+    "SEND": "Send",
+    "ATTACHMENT": "Attachment",
+    "ATTACHMENTS": "Attachments",
+    "NAME": "Name",
+    "MAILQUEUES": "Email Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "STRATEGY": "Strategy",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled",
+    "ERRORS": {
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "FONT_SIZE_REQUIRED": "Mandatory Field",
+      "FONT_SIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FONT_SIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TEXT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "TEXT_REQUIRED": "Mandatory Field",
+      "REPLY_TYPE_REQUIRED": "Mandatory Field",
+      "NAME_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory Field",
+      "EMAIL_ADDRESS_REQUIRED": "Mandatory Field",
+      "EMAIL_ADDRESS_MUST_VALID": "Wrong format",
+      "HOST_REQUIRED": "Mandatory Field",
+      "USERNAME_REQUIRED": "Mandatory Field",
+      "PORT_REQUIRED": "Mandatory Field",
+      "CONNTIMEOUT_REQUIRED": "Mandatory Field",
+      "AUTHTIMEOUT_REQUIRED": "Mandatory Field",
+      "ACCEPTURL_MUST_VALID_URL": "Wrong format",
+      "TIMEOUT_REQUIRED": "Mandatory Field",
+      "REJECTURL_MUST_VALID_URL": "Wrong format",
+      "CLOSEURL_MUST_VALID_URL": "Wrong format",
+      "AGENT_REQUIRED": "Mandatory Field",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "DISPOSITION_REQUIRED": "Mandatory Field",
+      "CONDITION_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_REQUIRED": "Mandatory Field",
+      "FALSEPRIORITY_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PRIORITY_REQUIRED": "Mandatory Field",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUE_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "PASSWORD_REQUIRED": "Mandatory Field",
+      "SERVICE_REQUIRED": "Mandatory Field",
+      "IMAP_HOST_REQUIRED": "Mandatory Field",
+      "IMAP_PORT_REQUIRED": "Mandatory Field",
+      "SMTP_HOST_REQUIRED": "Mandatory Field",
+      "SMTP_PORT_REQUIRED": "Mandatory Field",
+      "CONFIRM_NOT_MATCH": "The passwords inserted don't match",
+      "KEY_MAX_LENGTH": "Key must have a maximum length equal to {{max}}",
+      "KEY_REQUIRED": "Mandatory Field",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field"
+    },
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "DESCRIPTION": "Description",
+    "ADD_MAILQUEUE": "Add Email Queue",
+    "EDIT_MAILQUEUE": "Edit Email Queue",
+    "DELETE_MAILQUEUE": "Delete Email Queue",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "SAVE": "Save",
+    "MAILACCOUNTS": "Email Accounts",
+    "EMAIL_ADDRESS": "Email Address",
+    "ADD_MAILACCOUNT": "Add Email Account",
+    "EDIT_MAILACCOUNT": "Edit Email Account",
+    "DELETE_MAILACCOUNT": "Delete Email Accounts",
+    "DISPOSITIONS": "Dispositions",
+    "WEBHOOKS": "WebHooks",
+    "ACTIONS": "Actions",
+    "OTHERS": "Others",
+    "LIST": "List",
+    "TEMPLATE": "Template",
+    "FIDELITY": "Fidelity",
+    "SERVICE": "Service",
+    "CREATED_AT": "Created At",
+    "ACCEPT": "Accept",
+    "ACCEPTMETHOD": "Accept Method",
+    "ACCEPTURL": "Accept URL",
+    "REJECT": "Reject",
+    "REJECTMETHOD": "Reject Method",
+    "REJECTURL": "Reject URL",
+    "CLOSE": "Close",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "WHITELABEL": "White Label",
+    "SIGNATURE": "Signature",
+    "IMAP": "IMAP",
+    "HOST": "Host",
+    "USERNAME": "Username",
+    "PORT": "Port",
+    "MAILBOX": "Mailbox",
+    "FILTER": "Filter",
+    "CONNTIMEOUT": "Connection Timeout [sec]",
+    "AUTHTIMEOUT": "Authentication Timeout [sec]",
+    "DELETE": "Delete Email From Server",
+    "SSL": "SSL",
+    "KEEPALIVE": "Keepalive",
+    "POLLING": "Polling",
+    "SMTP": "SMTP",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "BACK": "Back",
+    "MAIL": "Email",
+    "ID": "Id",
+    "TIMEOUT": "Timeout",
+    "PASSWORD": "Password",
+    "NO_MAILDISPOSITION_AVAILABLE": "No Email Dispositions available",
+    "ADD_MAILDISPOSITION": "Add Email Disposition",
+    "NEW_MAILDISPOSITION": "New Email Disposition",
+    "EDIT_MAILDISPOSITION": "Edit Email Disposition",
+    "DELETE_MAILDISPOSITION": "Delete Email Disposition",
+    "MAILDISPOSITIONS": "Email Dispositions",
+    "NEW_MAILQUEUE": "New Email Queue",
+    "NEW_MAILACCOUNT": "New Email Account",
+    "NO_AVAILABLE_INFO": "No availables info",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "HELP": {
+      "FONT_FAMILY": "Default Font Family",
+      "FONT_SIZE": "Default Font Size",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "USERNAME": "Username used for authentication",
+      "PASSWORD": "Password used for authentication",
+      "SECURE": "If true, the connection will use TLS when connecting to server",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled",
+      "MARK_AS_UNREAD": "Enable/Disable agent to mark as unread the last message of an interaction"
+    },
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "TEAMADD_MAILQUEUE": "Add Team to Email Queue",
+    "AGENTADD_MAILQUEUE": "Add Agent to Email Queue",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "AGENT": "Agent",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_CLOSE": "Edit Close",
+    "DISPOSITION": "Disposition",
+    "GOTOIF": "GotoIf",
+    "EDIT_GOTOIF": "Edit GotoIf",
+    "CONDITION": "Condition",
+    "TRUEPRIORITY": "True Priority",
+    "FALSEPRIORITY": "False Priority",
+    "GOTOP": "GotoP",
+    "EDIT_GOTOP": "Edit GotoP",
+    "PRIORITY": "Priority",
+    "NOOP": "Noop",
+    "EDIT_NOOP": "Edit Noop",
+    "VALUE": "Value",
+    "QUEUE": "Queue",
+    "EDIT_QUEUE": "Edit Queue",
+    "INTERACTIONS": "Interactions",
+    "STARTEDAT": "Started At",
+    "LASTMESSAGE": "Last message",
+    "CONTACT": "Contact",
+    "CLOSEDAT": "Closed At",
+    "NOTES": "Notes",
+    "NO_INTERACTION_AVAILABLE": "No interactions available",
+    "ACTIVE": "Active",
+    "SECURE": "Secure",
+    "AUTHENTICATION": "Authentication",
+    "SMTP_HOST": "SMTP Host",
+    "SMTP_PORT": "SMTP Port",
+    "IMAP_HOST": "IMAP Host",
+    "IMAP_PORT": "IMAP Port",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "SELECT_STATUS": "Select Status",
+    "OPENED": "Open",
+    "CLOSED": "Closed",
+    "ALL": "All",
+    "SELECT_ACCOUNT": "Select Account",
+    "STATUS": "Status",
+    "ACCOUNT": "Account",
+    "OPEN": "Open",
+    "KEY": "Key",
+    "SMTPSERVICE": "SMTP Service",
+    "UNKNOWN": "Unknown",
+    "UNREGISTERED": "Unregistered",
+    "UNAVAILABLE": "Unavailable",
+    "NOT_INUSE": "Not in use",
+    "REACHABLE": "Reachable",
+    "IN_USE": "In use",
+    "AGENTSADD_QUEUE": "Add agents to Email Queue",
+    "INFO": "Info",
+    "INTERACTIONS_MAILACCOUNT": "Go to Interactions",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "AGENTADD_MAILACCOUNT": "Add Agent to Email Account",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "DOWNLOAD_WITH_ATTACHMENT": "Download with attachment",
+    "DOWNLOAD_WITHOUT_ATTACHMENT": "Download without attachment"
+  }
+}
diff --git a/public/app/main/apps/mail/i18n/it.json b/public/app/main/apps/mail/i18n/it.json
index aa75688..94e1baf 100644
--- a/public/app/main/apps/mail/i18n/it.json
+++ b/public/app/main/apps/mail/i18n/it.json
@@ -168,7 +168,8 @@
       "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Il valore deve essere maggiore o uguale a",
       "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a",
       "QUEUETRANSFERTIMEOUT_REQUIRED": "Campo obbligatorio",
-      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Campo obbligatorio"
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Campo obbligatorio",
+      "FIELD_REQUIRED": "Campo obbligatorio"
     },
     "AGENT_TIMEOUT": "Timeout Agente",
     "DESCRIPTION": "Descrizione",
@@ -244,7 +245,8 @@
       "SECURE": "Se attivo, la coonessione al server verrà effettuata usando il protocollo TLS",
       "MARK_AS_UNREAD": "Abilita/Disabilita l'agente a segnare come non letto l'ultimo messaggio di un'interazione",
       "MANDATORYDISPOSITION": "Disposizione obbligatoria",
-      "MANDATORYDISPOSITIONPAUSEID": "Pausa da utilizzare quando è abilitata la disposizione obbligatoria"
+      "MANDATORYDISPOSITIONPAUSEID": "Pausa da utilizzare quando è abilitata la disposizione obbligatoria",
+      "CLOUD_PROVIDER": "Cloud provider usato per l'autenticazione"
     },
     "PAGE": "Pagina",
     "ROWSPERPAGE": "Righe per pagina",
@@ -321,6 +323,24 @@
     "TOOLTIP_SCREENRECORDING_OFF": "Registrazione dello schermo disponibile",
     "TOOLTIP_SCREENRECORDING_ON": "Registrazione dello schermo in corso",
     "DOWNLOAD_WITHOUT_ATTACHMENT": "Scarica senza allegato",
-    "DOWNLOAD_WITH_ATTACHMENT": "Scarica con allegato"
+    "DOWNLOAD_WITH_ATTACHMENT": "Scarica con allegato",
+    "MODERN_AUTHENTICATION": "Authenticazione moderna",
+    "CLOUD_PROVIDER": "Cloud Provider",
+    "CUSTOM": "Personalizzato",
+    "CREDENTIALS": "Credenziali",
+    "NOTIFICATIONS": {
+      "ACCOUNT_CREATED_SUCCESS_TITLE": "Account creato con successo",
+      "ACCOUNT_SAVED_SUCCESS_TITLE": "Account salvato con successo",
+      "ACCOUNT_DELETE_TITLE": "Sei sicuro di voler eliminare l'account?",
+      "ACCOUNT_DELETE_MESSAGE": "{{ name }} verrà rimosso",
+      "ACCOUNT_DELETED_SUCCESS_TITLE": "Account rimosso con successo",
+      "ACCOUNT_SERVICE_DELETE": "Non puoi eliminare un account di servizio",
+      "ACCOUNTS_DELETE_TITLE": "Sei sicuro di voler eliminare gli accounts selezionati?",
+      "ACCOUNTS_DELETE_MESSAGE": "{{ total }} accounts verranno rimossi",
+      "ACCOUNTS_DELETED_SUCCESS_TITLE": "Accounts rimossi con successo",
+      "SMTP_CONNECTION_SUCCESS_TITLE": "Connesso con successo al server SMTP",
+      "SMTP_CONNECTION_FAIL_TITLE": "Impossibile connettersi al server SMTP",
+      "UNKNOWN_SMTP_SERVER": "Server STMP sconosciuto"
+    }
   }
 }
diff --git a/public/app/main/apps/marketplace/i18n/hu.json b/public/app/main/apps/marketplace/i18n/hu.json
new file mode 100644
index 0000000..312c4ab
--- /dev/null
+++ b/public/app/main/apps/marketplace/i18n/hu.json
@@ -0,0 +1,51 @@
+{
+  "MARKETPLACE": {
+    "MARKETPLACE": "App Zone",
+    "PLUGINS": "Plugins",
+    "BACK": "Back",
+    "SEARCH_FOR_ANYONE": "Search",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select all",
+    "SELECT_NONE": "Select none",
+    "NAME": "Name",
+    "DESCRIPTION": "Description",
+    "ACTIVE": "Active",
+    "TYPE": "Type",
+    "ICON": "Icon",
+    "ADMINURL": "Admin url",
+    "AGENTURL": "Agent url",
+    "SCRIPTNAME": "Script name",
+    "SCRIPTPATH": "Script path",
+    "SIDEBAR": "Sidebar",
+    "VERSION": "Version",
+    "NO_AVAILABLE_INFO": "No available info",
+    "MORE": "More",
+    "INSTALL_PLUGIN": "Install plugin",
+    "EDIT_PLUGIN": "Edit plugin",
+    "STOP_PLUGIN": "Stop plugin",
+    "RESTART_PLUGIN": "Restart plugin",
+    "DOWNLOAD_PLUGIN": "Download plugin",
+    "UNINSTALL_PLUGIN": "Uninstall plugin",
+    "DELETE_PLUGIN": "Remove plugin",
+    "CANCEL": "Cancel",
+    "FINISH": "Finish",
+    "DELETE": "Delete",
+    "SAVE": "Save",
+    "INSTALLING": "Installing",
+    "DROP_TO_UPLOAD": "Drop To Upload",
+    "DROP_TO_UPLOAD_MESSAGE": "Drop your file here to upload. Only ZIP - Max. 4MB",
+    "UPLOAD_PLUGIN": "Upload plugin",
+    "UPLOADING": "Uploading",
+    "CREATED_AT": "Created at",
+    "GENERAL": "General",
+    "SETTINGS": "Settings",
+    "EDITOR": "Editor",
+    "ERRORS": {
+      "URL_REQUIRED": "Mandatory field"
+    },
+    "HELP": {},
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of"
+  }
+}
diff --git a/public/app/main/apps/motiondialer/i18n/ar.json b/public/app/main/apps/motiondialer/i18n/ar.json
index 23696ab..6ce8e95 100644
--- a/public/app/main/apps/motiondialer/i18n/ar.json
+++ b/public/app/main/apps/motiondialer/i18n/ar.json
@@ -104,9 +104,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "مكالمة add.phone بعد دقيقة. يجب أن تكون أكبر من أو تساوي",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "حقل الزامي"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي"
     },
     "HELP": {
       "ACTIVE": "نشيط",
@@ -205,7 +203,8 @@
       "MACHINERETRYTIME": "الوقت في دقائق قبل محاولة الاتصال مرة أخرى جهة اتصال فاشلة بسبب الجهاز",
       "NOSUCHNUMBERETRYTIME": "الوقت في دقائق قبل محاولة الاتصال مرة أخرى جهة اتصال فاشلة بسبب عدم وجود هذا الرقم",
       "NOSUCHNUMBERMAXRETRY": "الحد الأقصى لعدد المرات التي يتم فيها الاتصال بجهة الاتصال قبل اعتبارها مغلقة ، عندما فشلت المكالمة لأي رقم من هذا القبيل",
-      "NOSUCHNUMBERRETRYTIME": "الوقت بالدقائق قبل محاولة الاتصال مرة أخرى بجهة اتصال فاشلة بسبب عدم وجود مثل هذا الرقم"
+      "NOSUCHNUMBERRETRYTIME": "الوقت بالدقائق قبل محاولة الاتصال مرة أخرى بجهة اتصال فاشلة بسبب عدم وجود مثل هذا الرقم",
+      "PREVIEW_AUTO_RECALL_ME": "في حالة التمكين ، سيقوم النظام تلقائيًا بإنشاء مكالمات Recall Me ؛ وإلا ، يجب على الوكيل القيام بذلك يدويًا"
     },
     "ABANDONED": "المتروكة",
     "ADD_IVRCAMPAIGN": "إضافه حمله الرد التفاعلى الآلى",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "تسجيل الشاشة في التقدم",
     "SECOND_LEVEL_DISPOSITION": "ترتيب المستوى الثاني",
     "THIRD_LEVEL_DISPOSITION": "الترتيب الثالث",
-    "ADDITIONALPHONES": "هواتف إضافية",
-    "CALLADDITIONALPHONEAFTERMIN": "الاتصال بهاتف إضافي بعد [دقيقة]"
+    "PREVIEW_AUTO_RECALL_ME": "أتمتة تذكرني المكالمات"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/cs.json b/public/app/main/apps/motiondialer/i18n/cs.json
index 07b4b7e..0f3d24c 100644
--- a/public/app/main/apps/motiondialer/i18n/cs.json
+++ b/public/app/main/apps/motiondialer/i18n/cs.json
@@ -239,9 +239,7 @@
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Hodnota musí být menší nebo rovna",
       "NOSUCHNUMBERMAXRETRY_REQUIRED": "Povinné pole",
       "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Hodnota musí být menší nebo rovna",
-      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Povinné pole",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Volejte add.phone po min. by měla být větší nebo rovna",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Povinné pole"
+      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Povinné pole"
     },
     "GENERAL": "General",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -347,7 +345,8 @@
       "MACHINEMAXRETRY": "Maximální počet volání kontaktu, než se považuje za uzavřený, když se volání nezdařilo pro stroj",
       "MACHINERETRYTIME": "Čas v minutách před pokusem o opětovné volání neúspěšného kontaktu kvůli zařízení",
       "NOSUCHNUMBERMAXRETRY": "Maximální počet volání kontaktu, než se považuje za uzavřený, když volání selhalo pro žádné takové číslo",
-      "NOSUCHNUMBERRETRYTIME": "Čas v minutách před pokusem o opětovné volání neúspěšného kontaktu z důvodu neexistence takového čísla"
+      "NOSUCHNUMBERRETRYTIME": "Čas v minutách před pokusem o opětovné volání neúspěšného kontaktu z důvodu neexistence takového čísla",
+      "PREVIEW_AUTO_RECALL_ME": "Pokud je povoleno, systém automaticky generuje volání Recall Me; jinak to musí agent provést ručně"
     },
     "MUSICONHOLD": "Music On Hold",
     "ANNOUNCETOAGENT": "Announce To Agent",
@@ -689,7 +688,6 @@
     "NOSUCHNUMBERRETRYTIME": "Čas opakování [min]",
     "SECOND_LEVEL_DISPOSITION": "Dispozice druhé úrovně",
     "THIRD_LEVEL_DISPOSITION": "Dispozice třetí úrovně",
-    "ADDITIONALPHONES": "Další telefony",
-    "CALLADDITIONALPHONEAFTERMIN": "Zavolat další telefon po [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizujte volání Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/da.json b/public/app/main/apps/motiondialer/i18n/da.json
index 3bcb80d..e91c196 100644
--- a/public/app/main/apps/motiondialer/i18n/da.json
+++ b/public/app/main/apps/motiondialer/i18n/da.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Opkald tilføj. Telefon efter min. skal være større end eller lig med",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Obligatorisk felt"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med"
     },
     "GENERAL": "Generel",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Tid i minutter, før du forsøger at ringe igen en mislykket kontakt på grund af maskinen",
       "NOSUCHNUMBERETRYTIME": "Tid i minutter, før du forsøger at ringe igen en mislykket kontakt på grund af intet sådant nummer",
       "NOSUCHNUMBERMAXRETRY": "Maksimalt antal gange, der ringes til en kontakt, inden den overvejer at være lukket, når opkaldet mislykkedes uden noget sådant nummer",
-      "NOSUCHNUMBERRETRYTIME": "Tid i minutter, før du prøver at ringe til en mislykket kontakt på grund af intet sådant nummer"
+      "NOSUCHNUMBERRETRYTIME": "Tid i minutter, før du prøver at ringe til en mislykket kontakt på grund af intet sådant nummer",
+      "PREVIEW_AUTO_RECALL_ME": "Hvis det er aktiveret, vil systemet automatisk generere Recall Me-opkaldene; ellers skal agenten gøre det manuelt"
     },
     "MUSICONHOLD": "Musik ved parkeret opkald",
     "ANNOUNCETOAGENT": "Annoncere til agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Skærmoptagelse pågår",
     "SECOND_LEVEL_DISPOSITION": "Andet niveau disposition",
     "THIRD_LEVEL_DISPOSITION": "Tredje niveau disposition",
-    "ADDITIONALPHONES": "Yderligere telefoner",
-    "CALLADDITIONALPHONEAFTERMIN": "Ring til yderligere telefon efter [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatiser Call Me-opkald"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/de.json b/public/app/main/apps/motiondialer/i18n/de.json
index cb7987a..6805ea3 100644
--- a/public/app/main/apps/motiondialer/i18n/de.json
+++ b/public/app/main/apps/motiondialer/i18n/de.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Rufen Sie nach min. sollte größer oder gleich sein",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Pflichtfeld"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein"
     },
     "GENERAL": "Allgemein",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Zeit in Minuten, bevor versucht wird, einen fehlgeschlagenen Kontakt aufgrund der Maschine erneut anzurufen",
       "NOSUCHNUMBERETRYTIME": "Zeit in Minuten, bevor versucht wird, einen fehlgeschlagenen Kontakt erneut anzurufen, da keine solche Nummer vorhanden ist",
       "NOSUCHNUMBERMAXRETRY": "Maximale Häufigkeit, mit der ein Kontakt angerufen wird, bevor er als geschlossen betrachtet wird, wenn der Anruf für keine solche Nummer fehlgeschlagen ist",
-      "NOSUCHNUMBERRETRYTIME": "Zeit in Minuten, bevor versucht wird, einen fehlgeschlagenen Kontakt erneut anzurufen, da keine solche Nummer vorhanden ist"
+      "NOSUCHNUMBERRETRYTIME": "Zeit in Minuten, bevor versucht wird, einen fehlgeschlagenen Kontakt erneut anzurufen, da keine solche Nummer vorhanden ist",
+      "PREVIEW_AUTO_RECALL_ME": "Wenn aktiviert, generiert das System automatisch die Recall Me-Anrufe; andernfalls muss der Agent dies manuell tun"
     },
     "MUSICONHOLD": "Musik auf Halten",
     "ANNOUNCETOAGENT": "Verkünden auf Agenten",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
     "SECOND_LEVEL_DISPOSITION": "Disposition der zweiten Ebene",
     "THIRD_LEVEL_DISPOSITION": "Disposition der dritten Ebene",
-    "ADDITIONALPHONES": "Zusätzliche Telefone",
-    "CALLADDITIONALPHONEAFTERMIN": "Zusätzliches Telefon anrufen nach [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatisieren Sie Recall Me-Anrufe"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/en.json b/public/app/main/apps/motiondialer/i18n/en.json
index 4a87798..617a393 100644
--- a/public/app/main/apps/motiondialer/i18n/en.json
+++ b/public/app/main/apps/motiondialer/i18n/en.json
@@ -23,6 +23,7 @@
     "SCHEDULED_CALLS": "Scheduled Calls",
     "LOGIN_TIME": "Login time",
     "PAUSE_TIME": "Pause time",
+    "PREVIEW_RECALL_ME_REMINDER": "Recall Me Reminder",
     "CUTDIGIT": "Cut Digits",
     "RANDOMLASTDIGITCALLERIDNUMBER": "Random Outgoing CallerId Number",
     "CLONE_IVRCAMPAIGN": "Clone Campaign",
@@ -152,22 +153,6 @@
     "NOANSWER": "No Answer",
     "NOANSWERMAXRETRY": "Max Retries",
     "NOANSWERRETRYTIME": "Retry Time [min]",
-    "NOSUCHNUMBER": "No such number",
-    "NOSUCHNUMBERMAXRETRY": "Max Retries",
-    "NOSUCHNUMBERRETRYTIME": "Retry Time [min]",
-    "DROP": "Drop",
-    "DROPMAXRETRY": "Max Retries",
-    "DROPRETRYTIME": "Retry Time [min]",
-    "ABANDONEDMAXRETRY": "Max Retries",
-    "ABANDONEDRETRYTIME": "Retry Time [min]",
-    "MACHINE": "Machine",
-    "MACHINEMAXRETRY": "Max Retries",
-    "MACHINERETRYTIME": "Retry Time [min]",
-    "AGENTREJECT": "Agent Reject",
-    "AGENTREJECTMAXRETRY": "Max Retries",
-    "AGENTREJECTRETRYTIME": "Retry Time [min]",
-    "CALLADDITIONALPHONEAFTERMIN": "Call additional phone after [min]",
-    "ADDITIONALPHONES": "Additional phones",
     "QUEUE_PARAMS": "Queue Parameters",
     "ORIGINATED": "Originated",
     "MESSAGE": "Message",
@@ -291,9 +276,7 @@
       "CONCURRENTCALLS_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
       "CALLYSQUAREPROJECT_REQUIRED": "Mandatory field",
-      "TRUNK_REQUIRED": "Mandatory field",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Mandatory field",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Call add.phone after min. should be greater than or equal to"
+      "TRUNK_REQUIRED": "Mandatory field"
     },
     "GENERAL": "General",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -316,6 +299,7 @@
       "DIALRECALLINQUEUE": "Reschedule call for agents in the Queue",
       "DIALRECALLMETIMEOUT": "Time interval (in minutes) for Recall Me period of validity",
       "PRIORITY": "Priority in the list",
+      "PREVIEW_RECALL_ME_REMINDER": "If enabled, the system will send a notification to the agent n minutes (according to time interval set in general settings) before generating the recall me",
       "AMDMAXIMUMWORDLENGTH": "Maximum duration allowed of a single Voice utterance",
       "AMDMINWORDLENGTH": "Minimum duration of a Voice to be considered a word",
       "AMDSILENCETHRESHOLD": "If the average level of noise in a sample does not reach this value, from a scale of 0 to 32767, then we will consider it as silence",
@@ -387,6 +371,8 @@
       "BUSYRETRYTIME": "Time in minutes before trying to call again a failed contact due to busy",
       "NOANSWERMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for no answer",
       "NOANSWERRETRYTIME": "Time in minutes before trying to call again a failed contact due to no answer",
+      "GLOBALINTERVAL": "Global time interval during which the dialer is allowed to call contacts. We decline responsibility: pay attention when you modify this field, because you may fail to comply with the national Autodialer Laws and Regulations",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
       "NOSUCHNUMBERMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for no such number",
       "NOSUCHNUMBERRETRYTIME": "Time in minutes before trying to call again a failed contact due to no such number",
       "DROPMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for drop",
@@ -397,10 +383,8 @@
       "MACHINERETRYTIME": "Time in minutes before trying to call again a failed contact due to machine",
       "AGENTREJECTMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for agent reject",
       "AGENTREJECTRETRYTIME": "Time in minutes before trying to call again a failed contact due to agent reject",
-      "CALLADDITIONALPHONEAFTERMIN": "",
-      "GLOBALINTERVAL": "Global time interval during which the dialer is allowed to call contacts. We decline responsibility: pay attention when you modify this field, because you may fail to comply with the national Autodialer Laws and Regulations",
-      "NAME": "Only numbers, letters and specific characters (._) are supported",
-      "MANDATORYDISPOSITIONPAUSEID": "Pause status to set during mandatory disposition"
+      "MANDATORYDISPOSITIONPAUSEID": "Pause status to set during mandatory disposition",
+      "PREVIEW_AUTO_RECALL_ME": "If enabled, the system will automatically generate the Recall Me calls; otherwise, the agent must do it manually"
     },
     "MUSICONHOLD": "Music On Hold",
     "ANNOUNCETOAGENT": "Announce To Agent",
@@ -705,6 +689,7 @@
     "MANDATORYDISPOSITION": "Mandatory disposition",
     "MANDATORYDISPOSITIONPAUSEID": "Mandatory disposition pause status",
     "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
-    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available"
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "PREVIEW_AUTO_RECALL_ME": "Automate Recall Me calls"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/es.json b/public/app/main/apps/motiondialer/i18n/es.json
index 845f786..7f1ae56 100644
--- a/public/app/main/apps/motiondialer/i18n/es.json
+++ b/public/app/main/apps/motiondialer/i18n/es.json
@@ -100,7 +100,8 @@
       "MACHINERETRYTIME": "Tiempo en minutos antes de intentar volver a llamar a un contacto fallido debido a la máquina",
       "NOSUCHNUMBERETRYTIME": "Tiempo en minutos antes de intentar volver a llamar a un contacto fallido debido a que no existe ese número",
       "NOSUCHNUMBERMAXRETRY": "Número máximo de veces que se llama a un contacto antes de considerarlo cerrado, cuando la llamada falló por dicho número",
-      "NOSUCHNUMBERRETRYTIME": "Tiempo en minutos antes de intentar llamar de nuevo a un contacto fallido debido a que no existe dicho número"
+      "NOSUCHNUMBERRETRYTIME": "Tiempo en minutos antes de intentar llamar de nuevo a un contacto fallido debido a que no existe dicho número",
+      "PREVIEW_AUTO_RECALL_ME": "Si está habilitado, el sistema generará automáticamente las llamadas Recall Me; de lo contrario, el agente debe hacerlo manualmente"
     },
     "ERRORS": {
       "AFTERCALLWORKDURATION_REQUIRED": "Campo obligatorio",
@@ -203,9 +204,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Llamar al teléfono adicional después de min. debe ser mayor o igual a",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Campo obligatorio"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que"
     },
     "ABANDONED": "Abandonado",
     "ABANDONEDCALLS": "Llamadas de cola abandonadas",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Grabación de pantalla en progreso",
     "SECOND_LEVEL_DISPOSITION": "Tipficación de segundo nivel",
     "THIRD_LEVEL_DISPOSITION": "Tipificación de tercer nivel",
-    "ADDITIONALPHONES": "Teléfonos adicionales",
-    "CALLADDITIONALPHONEAFTERMIN": "Llamar a otro teléfono después de [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizar las llamadas de Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/et.json b/public/app/main/apps/motiondialer/i18n/et.json
index 9188853..59161b2 100644
--- a/public/app/main/apps/motiondialer/i18n/et.json
+++ b/public/app/main/apps/motiondialer/i18n/et.json
@@ -239,9 +239,7 @@
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Väärtus peab olema väiksem või võrdne",
       "NOSUCHNUMBERMAXRETRY_REQUIRED": "Kohustuslik väli",
       "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Väärtus peab olema väiksem või võrdne",
-      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Kohustuslik väli",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Helista lisa.telefon pärast min. peaks olema suurem või võrdne",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Kohustuslik väli"
+      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Kohustuslik väli"
     },
     "GENERAL": "General",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -347,7 +345,8 @@
       "MACHINEMAXRETRY": "Maksimaalne kordade arv kontaktile enne sulgemise pidamist, kui kõne masinale nurjus",
       "MACHINERETRYTIME": "Aeg minutites, enne kui proovite uuesti helistada nurjunud kontaktile masina tõttu",
       "NOSUCHNUMBERMAXRETRY": "Maksimaalne kordade arv, millal kontaktile helistati enne selle lõpetatuks lugemist, kui kõne nurjus sellise numbri puudumisel",
-      "NOSUCHNUMBERRETRYTIME": "Aega minutites, enne kui proovite uuesti helistada nurjunud kontaktile, kuna sellist numbrit pole"
+      "NOSUCHNUMBERRETRYTIME": "Aega minutites, enne kui proovite uuesti helistada nurjunud kontaktile, kuna sellist numbrit pole",
+      "PREVIEW_AUTO_RECALL_ME": "Kui see on lubatud, genereerib süsteem automaatselt Call Me kõned; vastasel juhul peab agent seda käsitsi tegema"
     },
     "MUSICONHOLD": "Music On Hold",
     "ANNOUNCETOAGENT": "Announce To Agent",
@@ -689,7 +688,6 @@
     "NOSUCHNUMBERRETRYTIME": "Uuesti proovimise aeg [min]",
     "SECOND_LEVEL_DISPOSITION": "Teise taseme korraldus",
     "THIRD_LEVEL_DISPOSITION": "Kolmanda taseme korraldus",
-    "ADDITIONALPHONES": "Täiendavad telefonid",
-    "CALLADDITIONALPHONEAFTERMIN": "Helistage täiendavale telefonile pärast [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatiseerige Call Me kõned"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/fa.json b/public/app/main/apps/motiondialer/i18n/fa.json
index de92080..40f8edf 100644
--- a/public/app/main/apps/motiondialer/i18n/fa.json
+++ b/public/app/main/apps/motiondialer/i18n/fa.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر یا برابر باشد",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر یا برابر باشد",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر یا برابر باشد",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر یا برابر باشد",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "بعد از دقیقه با add.phone تماس بگیرید باید بزرگتر یا مساوی باشد",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "زمینه اجباری"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر یا برابر باشد"
     },
     "GENERAL": "سردار",
     "AGENTTIMEOUT": "عامل زمان مجاز",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "دقایقی قبل از تلاش برای تماس مجدد با شما به دلیل دستگاه تماس برقرار نشد",
       "NOSUCHNUMBERETRYTIME": "دقایقی قبل از تلاش برای تماس مجدد با شما تماس ناموفق بخاطر وجود چنین شماره ای",
       "NOSUCHNUMBERMAXRETRY": "حداکثر تعداد تماس با شما قبل از بسته شدن تماس گرفته می شود ، در صورت عدم موفقیت در چنین شماره ای",
-      "NOSUCHNUMBERRETRYTIME": "چند دقیقه قبل از تلاش برای تماس مجدد با یک تماس ناموفق به دلیل نداشتن چنین شماره ای زمان بگذارید"
+      "NOSUCHNUMBERRETRYTIME": "چند دقیقه قبل از تلاش برای تماس مجدد با یک تماس ناموفق به دلیل نداشتن چنین شماره ای زمان بگذارید",
+      "PREVIEW_AUTO_RECALL_ME": "اگر فعال باشد، سیستم به طور خودکار تماس های Recall Me را ایجاد می کند. در غیر این صورت، نماینده باید این کار را به صورت دستی انجام دهد"
     },
     "MUSICONHOLD": "موسيقي را نگه دارید",
     "ANNOUNCETOAGENT": "عامل را اعلام می کند",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "ضبط صفحه در حال انجام است",
     "SECOND_LEVEL_DISPOSITION": "دفع سطح دوم",
     "THIRD_LEVEL_DISPOSITION": "دفع سطح سوم",
-    "ADDITIONALPHONES": "تلفن های اضافی",
-    "CALLADDITIONALPHONEAFTERMIN": "بعد از [دقیقه] با تلفن اضافی تماس بگیرید"
+    "PREVIEW_AUTO_RECALL_ME": "تماس‌های Recall Me را خودکار کنید"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/fi.json b/public/app/main/apps/motiondialer/i18n/fi.json
index 2e9bcdb..7f79acb 100644
--- a/public/app/main/apps/motiondialer/i18n/fi.json
+++ b/public/app/main/apps/motiondialer/i18n/fi.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Soita lisäpuhelimeen min. pitäisi olla suurempi tai yhtä suuri kuin",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Pakollinen kenttä"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin"
     },
     "GENERAL": "Yleistä",
     "AGENTTIMEOUT": "Agentti aikakatkaisu",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Aika minuutteina ennen kuin yrität soittaa uudestaan epäonnistuneelle konetalle koneesta johtuen",
       "NOSUCHNUMBERETRYTIME": "Aika minuutteina ennen kuin yrität soittaa uudelleen epäonnistuneelle yhteyshenkilölle, koska sellaista numeroa ei ole",
       "NOSUCHNUMBERMAXRETRY": "Enimmäiskertojen lukumäärä, johon yhteyshenkilöön on soitettu, ennen kuin harkitaan sen sulkeutumista, kun puhelu epäonnistui ilman tällaista numeroa",
-      "NOSUCHNUMBERRETRYTIME": "Aika minuutteina ennen kuin yrität soittaa uudelleen epäonnistuneelle yhteyshenkilölle, koska tällaista numeroa ei ole"
+      "NOSUCHNUMBERRETRYTIME": "Aika minuutteina ennen kuin yrität soittaa uudelleen epäonnistuneelle yhteyshenkilölle, koska tällaista numeroa ei ole",
+      "PREVIEW_AUTO_RECALL_ME": "Jos tämä on käytössä, järjestelmä luo automaattisesti Recall Me -kutsut. Muussa tapauksessa edustajan on tehtävä se manuaalisesti"
     },
     "MUSICONHOLD": "Musiikkia puhelun ollessa pidossa",
     "ANNOUNCETOAGENT": "Ilmoittaa Agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Näytön nauhoitus käynnissä",
     "SECOND_LEVEL_DISPOSITION": "Toisen tason sijoitus",
     "THIRD_LEVEL_DISPOSITION": "Kolmannen tason sijoitus",
-    "ADDITIONALPHONES": "Muut puhelimet",
-    "CALLADDITIONALPHONEAFTERMIN": "Soita lisäpuhelimeen [min] jälkeen"
+    "PREVIEW_AUTO_RECALL_ME": "Automatisoi Recall Me -puhelut"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/fr.json b/public/app/main/apps/motiondialer/i18n/fr.json
index a881f10..8e689aa 100644
--- a/public/app/main/apps/motiondialer/i18n/fr.json
+++ b/public/app/main/apps/motiondialer/i18n/fr.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Appelez add.phone après min. doit être supérieur ou égal à",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Champ obligatoire"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à"
     },
     "GENERAL": "Général",
     "AGENTTIMEOUT": "Délai d'agent",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Temps en minutes avant d'essayer de rappeler un contact ayant échoué en raison de la machine",
       "NOSUCHNUMBERETRYTIME": "Temps en minutes avant d'essayer de rappeler un contact ayant échoué en raison d'un tel numéro",
       "NOSUCHNUMBERMAXRETRY": "Nombre maximal de fois qu'un contact est appelé avant de le considérer comme fermé, lorsque l'appel a échoué pour un tel numéro",
-      "NOSUCHNUMBERRETRYTIME": "Temps en minutes avant de réessayer de rappeler un contact ayant échoué en raison d'un tel numéro"
+      "NOSUCHNUMBERRETRYTIME": "Temps en minutes avant de réessayer de rappeler un contact ayant échoué en raison d'un tel numéro",
+      "PREVIEW_AUTO_RECALL_ME": "S'il est activé, le système générera automatiquement les appels Recall Me ; sinon, l'agent doit le faire manuellement"
     },
     "MUSICONHOLD": "La musique d'attente",
     "ANNOUNCETOAGENT": "Annoncer à l'Agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Enregistrement d'écran en cours",
     "SECOND_LEVEL_DISPOSITION": "Disposition de deuxième niveau",
     "THIRD_LEVEL_DISPOSITION": "Disposition de troisième niveau",
-    "ADDITIONALPHONES": "Téléphones supplémentaires",
-    "CALLADDITIONALPHONEAFTERMIN": "Appeler un autre téléphone après [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatisez les appels de rappel"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/he.json b/public/app/main/apps/motiondialer/i18n/he.json
index ddf6881..1f7ba21 100644
--- a/public/app/main/apps/motiondialer/i18n/he.json
+++ b/public/app/main/apps/motiondialer/i18n/he.json
@@ -239,9 +239,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות קטן או שווה ל-",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות קטן או שווה ל-",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות קטן או שווה ל-",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות קטן או שווה ל-",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "התקשרו add.phone לאחר דקות. צריך להיות גדול או שווה ל",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "שדה חובה"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות קטן או שווה ל-"
     },
     "GENERAL": "כללי",
     "AGENTTIMEOUT": "סוף זמן המתנה לנציג",
@@ -348,7 +346,8 @@
       "NOSUCHNUMBERETRYTIME": "זמן בתוך דקות לפני שניסה להתקשר שוב לאיש קשר כושל מכיוון שאין מספר כזה",
       "NOSUCHNUMBERMAXRETRY": "המספר המרבי של הפעמים שאיש קשר מתקשר לפני שהוא שוקל לסגור אותו, כאשר השיחה נכשלה ללא מספר כזה",
       "NOSUCHNUMBERRETRYTIME": "זמן בדקות לפני שניסה להתקשר שוב לאיש קשר נכשל בגלל מספר כזה",
-      "CALLYSQUAREPROJECT2": "בחירת פרויקט IVR, חייגן יעביר את השיחה ל- IVR לאחר התור (אם התור מסתיים בפסק זמן קצוב)"
+      "CALLYSQUAREPROJECT2": "בחירת פרויקט IVR, חייגן יעביר את השיחה ל- IVR לאחר התור (אם התור מסתיים בפסק זמן קצוב)",
+      "PREVIEW_AUTO_RECALL_ME": "אם מופעלת, המערכת תיצור אוטומטית את השיחות 'חזור אליי'; אחרת, הסוכן חייב לעשות זאת באופן ידני"
     },
     "MUSICONHOLD": "מוזיקה בהמתנה",
     "ANNOUNCETOAGENT": "הודעה לנציג",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "הקלטת מסך מתבצעת",
     "SECOND_LEVEL_DISPOSITION": "נטייה בדרגה שנייה",
     "THIRD_LEVEL_DISPOSITION": "נטייה ברמה השלישית",
-    "ADDITIONALPHONES": "טלפונים נוספים",
-    "CALLADDITIONALPHONEAFTERMIN": "התקשר לטלפון נוסף לאחר [דקה]"
+    "PREVIEW_AUTO_RECALL_ME": "אוטומציה של שיחות Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/hi.json b/public/app/main/apps/motiondialer/i18n/hi.json
index 433099d..78d66f1 100644
--- a/public/app/main/apps/motiondialer/i18n/hi.json
+++ b/public/app/main/apps/motiondialer/i18n/hi.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "मिनट के बाद add.phone पर कॉल करें। से बड़ा या बराबर होना चाहिए",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "आवश्यक स्थान"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए"
     },
     "GENERAL": "सामान्य",
     "AGENTTIMEOUT": "एजेंट समयबाह्य",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "मशीन के कारण फिर से कॉल करने की कोशिश करने से पहले मिनटों में समय",
       "NOSUCHNUMBERETRYTIME": "इस तरह की कोई संख्या नहीं होने के कारण फिर से कॉल करने की कोशिश करने से पहले मिनटों में समय",
       "NOSUCHNUMBERMAXRETRY": "किसी संपर्क को बंद करने पर विचार करने से पहले अधिकतम बार कॉल किया जाता है, जब कॉल ऐसी किसी भी संख्या के लिए विफल रही",
-      "NOSUCHNUMBERRETRYTIME": "इस तरह की कोई संख्या नहीं होने के कारण फिर से कॉल करने की कोशिश करने से पहले मिनटों में समय"
+      "NOSUCHNUMBERRETRYTIME": "इस तरह की कोई संख्या नहीं होने के कारण फिर से कॉल करने की कोशिश करने से पहले मिनटों में समय",
+      "PREVIEW_AUTO_RECALL_ME": "यदि सक्षम किया गया है, तो सिस्टम स्वचालित रूप से रिकॉल मी कॉल उत्पन्न करेगा; अन्यथा, एजेंट को इसे मैन्युअल रूप से करना होगा"
     },
     "MUSICONHOLD": "संगीत पर रखें.",
     "ANNOUNCETOAGENT": "घोषणा के एजेंट",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "स्क्रीन रिकॉर्डिंग प्रगति पर है",
     "SECOND_LEVEL_DISPOSITION": "दूसरा स्तर विवाद",
     "THIRD_LEVEL_DISPOSITION": "तीसरे स्तर का विवाद",
-    "ADDITIONALPHONES": "अतिरिक्त फोन",
-    "CALLADDITIONALPHONEAFTERMIN": "[मिनट] के बाद अतिरिक्त फ़ोन पर कॉल करें"
+    "PREVIEW_AUTO_RECALL_ME": "स्वचालित रिकॉल मी कॉल"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/hu.json b/public/app/main/apps/motiondialer/i18n/hu.json
new file mode 100644
index 0000000..bc7a95d
--- /dev/null
+++ b/public/app/main/apps/motiondialer/i18n/hu.json
@@ -0,0 +1,693 @@
+{
+  "MOTIONDIALER": {
+    "SECOND_LEVEL_DISPOSITION": "Second Level Disposition",
+    "THIRD_LEVEL_DISPOSITION": "Third Level Disposition",
+    "ONE_CALL_EVERY": "One call every",
+    "CURRENT_INTERVAL": "Current Interval",
+    "PREVIOUS_INTERVAL": "Previous Interval",
+    "PREDICTIVE_IS_RUNNING": "Predictive is running",
+    "PREDICTIVE_IS_NOT_RUNNING": "Predictive is not running",
+    "DATA_COLLECTION_IN_PROGRESSIVE": "Data collection in Progressive",
+    "SHOW_PREDICTIVE_QUEUE_CAMPAIGN_INFO": "Show Predictive Info",
+    "AVG_TALK_TIME": "Avg Talk Time",
+    "ANSWERED_CALLS": "Answered Calls",
+    "TOTAL_CALLS": "Total Calls",
+    "THRESHOLDS": "Thresholds",
+    "PREDICTIVEMAXTHRESHOLD": "Predictive Max Threshold [%]",
+    "PREDICTIVEMINTHRESHOLD": "Predictive Min Threshold [%]",
+    "REFRESH_SCHEDULED_CALLS": "Refresh Scheduled Calls",
+    "RECALLINQUEUE": "Recall in queue",
+    "SELECT_DATE": "Select Date",
+    "SELECT_TYPE": "Select Type",
+    "SELECT_CAMPAIGN": "Select Campaign",
+    "SCHEDULED_CALLS": "Scheduled Calls",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "CUTDIGIT": "Cut Digits",
+    "RANDOMLASTDIGITCALLERIDNUMBER": "Random Outgoing CallerId Number",
+    "CLONE_IVRCAMPAIGN": "Clone Campaign",
+    "CLONE_QUEUECAMPAIGN": "Clone Queue Campaign",
+    "ABANDONEDCALLS": "Abandoned Queue Calls",
+    "HOPPERWIDGET": "Summary",
+    "RESETLIST_IVRCAMPAIGN": "Reset Lists",
+    "RESETLIST_QUEUECAMPAIGN": "Reset Lists",
+    "RESET": "Reset",
+    "RESETLIST": "Reset Lists",
+    "SELECTALL": "Select All",
+    "UNSELECTALL": "Un-Select All",
+    "NO_AVAILABLE_INFO": "No available info",
+    "TIMEOUT": "Timeout",
+    "CALLYSQUAREPROJECTPREVIEW": "Cally Square Project Preview",
+    "CALLYSQUAREPROJECTPREVIEW2": "Cally Square Project After Preview",
+    "RUNIFHANGUPAGENT": "Run Cally Square Project After even if the agent hangs up the call",
+    "CALLYSQUAREPROJECT2": "Cally Square Project After Queue",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "PARTIALPAUSE": "Parital Pause",
+    "ALL": "All",
+    "IDLE": "Idle",
+    "TIMER": "Timer",
+    "MOVE_HOPPERFINAL": "Restore contact",
+    "RESTORECONTACTS": "Restore Contacts",
+    "NO_SUCH_NUMBER": "No Such Number",
+    "ANSWERING_MACHINE": "Answering machine",
+    "DIALORDERBYSCHEDULEDAT": "Order By scheduledat",
+    "ASC": "ASC",
+    "DESC": "DESC",
+    "RECALLAGENT": "Recall Agent",
+    "DIALRECALLINQUEUE": "Recall In Queue",
+    "DIALRECALLMETIMEOUT": "Recall Me Timeout [min]",
+    "RECALLME": "Recall Me",
+    "RECALLFAILEDTIMEOUT": "Recall Failed",
+    "PREVIEW_CAMPAIGN": "Preview Campaigns",
+    "PREVIEW_CAMPAIGNS": "Preview Campaigns",
+    "AMD": "Asterisk Answering Machine Detection (AMD)",
+    "AMDTOTALANALYSISTIME": "Total Analysis Time",
+    "AMDACTIVE": "AMD",
+    "AMDINITIALSILENCE": "Initial Silence",
+    "AMDGREETING": "Greeting",
+    "AMDAFTERGREETINGSILENCE": "Silence after Greeting",
+    "AMDSILENCETHRESHOLD": "Silence Threshold",
+    "AMDMINWORDLENGTH": "Min Word Length",
+    "AMDBETWEENWORDSSILENCE": "Silence Between Words",
+    "AMDMAXIMUMWORDLENGTH": "Maximum Word Length",
+    "AMDMAXIMUMNUMBEROFWORDS": "Maximum Number Of Words",
+    "GOTO_QUEUECAMPAIGN": "Go To Realtime Queue Campaigns",
+    "GOTOREALTIME_QUEUECAMPAIGN": "Go To Realtime Queue Campaigns",
+    "GOTO_IVRCAMPAIGN": "Go To Realtime IVR Campaigns",
+    "GOTOREALTIME_IVRCAMPAIGN": "Go To Realtime IVR Campaigns",
+    "LOGOUT": "Logout",
+    "EDIT_CAMPAIGN": "Edit Campaign",
+    "LIMITED": "Limited",
+    "IVR_CAMPAIGNS": "IVR Campaigns",
+    "MOTIONDIALER": "Motion Bull",
+    "QUEUECAMPAIGNS": "Queue Campaigns",
+    "IVRCAMPAIGNS": "IVR Campaigns",
+    "MANAGED": "Managed",
+    "AVAILABLE_CONTACTS_FINISHED": "Available contacts finished",
+    "HISTORY": "History",
+    "SCHEDULEDAT": "Scheduled At",
+    "HOPPERBLACKS": "Hopper Blacklist",
+    "NO_HOPPERBLACK_AVAILABLE": "No items available",
+    "HOPPERFINALS": "Hopper Final",
+    "NO_HOPPERFINAL_AVAILABLE": "No items available",
+    "HOPPERHISTORIES": "Call history",
+    "NO_HOPPERHISTORY_AVAILABLE": "No items available",
+    "DELETE_HOPPERHISTORY": "Delete",
+    "DELETE_HOPPERFINAL": "Delete",
+    "CONTACTID": "Contact ID",
+    "STARTTIME": "Start Time",
+    "RESPONSETIME": "Response Time",
+    "ENDTIME": "End Time",
+    "STATUS": "Status",
+    "HOPPERS": "Hopper",
+    "NO_HOPPER_AVAILABLE": "No items available",
+    "EDIT_HOPPER": "Edit Hopper",
+    "DELETE_HOPPER": "Delete Hopper",
+    "FINAL": "Final",
+    "BLACKLIST": "Blacklist",
+    "NAME": "Name",
+    "VOICEQUEUES": "Voice Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "DELETE_VOICEDISPOSITION": "Delete Voice Disposition",
+    "EDIT_VOICEDISPOSITION": "Edit Voice Disposition",
+    "EDIT_VOICEQUEUE": "Edit Voice Queue",
+    "DELETE_VOICEQUEUE": "Delete Voice Queue",
+    "MOHSOUNDS": "Moh Sounds",
+    "STRATEGY": "Strategy",
+    "DESCRIPTION": "Description",
+    "INTERVAL": "Time Interval",
+    "ADD_VOICEQUEUE": "Add Voice Queue",
+    "NEW_QUEUECAMPAIGN": "New Queue Campaign",
+    "ACTIVE": "Active",
+    "METHOD": "Method",
+    "POWERLEVEL": "Power Level",
+    "DROPRATE": "Drop Rate",
+    "AGENTBUSYFACTOR": "Agent Busy Factor",
+    "PREDICTIVEOPTIMIZATION": "Predictive Optimization",
+    "PREDICTIVEOPTIMIZATIONPERCENTAGE": "Predictive Optimization Percentage",
+    "PREDICTIVEINTERVAL": "Predictive Interval",
+    "ADD_QUEUECAMPAIGN": "Add Queue Campaign",
+    "CAMPAIGN": "Campaign",
+    "MAXCONCURRENTCALLS": "Max Concurrent Calls",
+    "CONCURRENTCALLS": "Max Concurrent Calls",
+    "ORIGINATE": "Originate",
+    "ORIGINATECALLERIDNAME": "Caller ID Name",
+    "ORIGINATECALLERIDNUMBER": "Caller ID Number",
+    "ORIGINATETIMEOUT": "Originate Timeout",
+    "QUEUEOPTIONS": "Queue Options",
+    "QUEUETIMEOUT": "Queue Timeout",
+    "CALLYSQUAREPROJECT": "Cally Square Project",
+    "RETRYANDFREQUENCY": "Retry Settings",
+    "GLOBAL": "Global",
+    "GLOBALMAXRETRY": "Max Retries",
+    "CONGESTION": "Congestion",
+    "CONGESTIONMAXRETRY": "Max Retries",
+    "CONGESTIONRETRYTIME": "Retry Time [min]",
+    "BUSYMAXRETRY": "Max Retries",
+    "BUSYRETRYTIME": "Retry Time [min]",
+    "NOANSWER": "No Answer",
+    "NOANSWERMAXRETRY": "Max Retries",
+    "NOANSWERRETRYTIME": "Retry Time [min]",
+    "QUEUE_PARAMS": "Queue Parameters",
+    "ORIGINATED": "Originated",
+    "MESSAGE": "Message",
+    "DROPPED": "Dropped",
+    "CREATED_AT": "Created At",
+    "NOSUCHNUMBER": "No such number",
+    "NOSUCHNUMBERMAXRETRY": "Max Retries",
+    "NOSUCHNUMBERRETRYTIME": "Retry Time [min]",
+    "DROP": "Drop",
+    "DROPMAXRETRY": "Max Retries",
+    "DROPRETRYTIME": "Retry Time [min]",
+    "ABANDONEDMAXRETRY": "Max Retries",
+    "ABANDONEDRETRYTIME": "Retry Time [min]",
+    "MACHINE": "Machine",
+    "MACHINEMAXRETRY": "Max Retries",
+    "MACHINERETRYTIME": "Retry Time [min]",
+    "AGENTREJECT": "Agent Reject",
+    "AGENTREJECTMAXRETRY": "Max Retries",
+    "AGENTREJECTRETRYTIME": "Retry Time [min]",
+    "LEGEND": {
+      "CUSTOM_APPLICATION": "(*) - Custom application."
+    },
+    "ERRORS": {
+      "AGENT_REQUIRED": "Mandatory field",
+      "CUTDIGIT_REQUIRED": "Mandatory field",
+      "CUTDIGIT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CUTDIGIT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "RANDOMLASTDIGITCALLERIDNUMBER_REQUIRED": "Mandatory field",
+      "RANDOMLASTDIGITCALLERIDNUMBER_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "RANDOMLASTDIGITCALLERIDNUMBER_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTIMEOUT_REQUIRED": "Mandatory field",
+      "INTERVAL_REQUIRED": "Mandatory field",
+      "EMAIL_REQUIRED": "Mandatory field",
+      "DIALRECALLMETIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "DIALRECALLMETIMEOUT_REQUIRED": "Mandatory field",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "PREFIX_MUST_VALID_PATTERN": "Wrong format",
+      "NAME_REQUIRED": "Mandatory field",
+      "TIMEOUT_REQUIRED": "Mandatory field",
+      "PHONENUMBER_REQUIRED": "Mandatory field",
+      "CONTEXT_REQUIRED": "Mandatory field",
+      "DESTINATIONPATTERN_REQUIRED": "Mandatory field",
+      "FULLNAME_REQUIRED": "Mandatory field",
+      "EMAIL_REQUUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "MAILBOX_REQUIRED": "Mandatory Field",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "TIMEZONE_REQUIRED": "Mandatory field",
+      "PREFIX_REQUIRED": "Mandatory field",
+      "OPTIONS_REQUIRED": "Mandatory field",
+      "AFTERCALLWORKDURATION_REQUIRED": "Mandatory field",
+      "TECHNOLOGY/RESOURCE_REQUIRED": "Mandatory field",
+      "PHONE_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "EXTENSION_REQUIRED": "Mandatory field",
+      "PRIORITY_REQUIRED": "Mandatory field",
+      "GLOBALMAXRETRY_REQUIRED": "Mandatory field",
+      "CONGESTIONMAXRETRY_REQUIRED": "Mandatory field",
+      "CONGESTIONRETRYTIME_REQUIRED": "Mandatory field",
+      "BUSYMAXRETRY_REQUIRED": "Mandatory field",
+      "BUSYRETRYTIME_REQUIRED": "Mandatory field",
+      "NOANSWERMAXRETRY_REQUIRED": "Mandatory field",
+      "NOANSWERRETRYTIME_REQUIRED": "Mandatory field",
+      "QUEUETIMEOUT_REQUIRED": "Mandatory field",
+      "ORIGINATETIMEOUT_REQUIRED": "Mandatory field",
+      "GLOBALINTERVAL_REQUIRED": "Mandatory field",
+      "MAXCONCURRENTCALLS_REQUIRED": "Mandatory field",
+      "CONCURRENTCALLS_REQUIRED": "Mandatory field",
+      "NOSUCHNUMBERMAXRETRY_REQUIRED": "Mandatory field",
+      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Mandatory field",
+      "DROPMAXRETRY_REQUIRED": "Mandatory field",
+      "DROPRETRYTIME_REQUIRED": "Mandatory field",
+      "ABANDONEDMAXRETRY_REQUIRED": "Mandatory field",
+      "ABANDONEDRETRYTIME_REQUIRED": "Mandatory field",
+      "MACHINEMAXRETRY_REQUIRED": "Mandatory field",
+      "MACHINERETRYTIME_REQUIRED": "Mandatory field",
+      "AGENTREJECTMAXRETRY_REQUIRED": "Mandatory field",
+      "AGENTREJECTRETRYTIME_REQUIRED": "Mandatory field",
+      "POWERLEVEL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PREDICTIVEOPTIMIZATIONPERCENTAGE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PREDICTIVEINTERVAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAXCONCURRENTCALLS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "ORIGINATETIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "RETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WRAPUPTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WEIGHT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "GLOBALMAXRETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CONGESTIONMAXRETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CONGESTIONRETRYTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "BUSYMAXRETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "BUSYRETRYTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NOANSWERMAXRETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NOANSWERRETRYTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CONCURRENTCALLS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "POWERLEVEL_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "PREDICTIVEOPTIMIZATIONPERCENTAGE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "PREDICTIVEINTERVAL_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MAXCONCURRENTCALLS_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "ORIGINATETIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "GLOBALMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "CONGESTIONMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "CONGESTIONRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "BUSYMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "BUSYRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "NOANSWERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "NOANSWERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "DROPMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "DROPRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "ABANDONEDMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "ABANDONEDRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTREJECTMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTREJECTRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "CONCURRENTCALLS_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
+      "CALLYSQUAREPROJECT_REQUIRED": "Mandatory field",
+      "TRUNK_REQUIRED": "Mandatory field"
+    },
+    "GENERAL": "General",
+    "AGENTTIMEOUT": "Agent Timeout",
+    "MAXLENGTH": "Maximum Length",
+    "RETRY": "Retry",
+    "WRAPUPTIME": "Wrapup Time",
+    "WEIGHT": "Weight",
+    "JOINWHENEMPTY": "Join when empty",
+    "LEAVEWHENEMPTY": "Leave when empty",
+    "HELP": {
+      "PREDICTIVEMAXTHRESHOLD": "If the percentage of agents available in the time window, compared to the agents available at the time of prediction, exceeds the configured maximum limit, the predictive recalculates the prediction. ",
+      "PREDICTIVEMINTHRESHOLD": "If the percentage of agents available in the time window, compared to the agents available at the time of prediction, exceeds the configured minimum limit, the predictive recalculates the prediction.",
+      "RANDOMLASTDIGITCALLERIDNUMBER": "If greater than 0, it generates randomly the corresponding last digits of the Outgoing Caller Id Number",
+      "TIMEOUT": "Number of seconds to ring agent in queue",
+      "CALLYSQUAREPROJECTPREVIEW": "Selecting an IVR project, the dialer will forward the call to the IVR when an agent answers (the IVR will be directed to the agent)",
+      "CALLYSQUAREPROJECTPREVIEW2": "Selecting an IVR project, the dialer will forward the call to the IVR when an client hangup or unreachable (the IVR will be directed to the agent)",
+      "RUNIFHANGUPAGENT": "Run Cally Square Project After even if the agent hangs up the call",
+      "CALLYSQUAREPROJECT2": "Selecting an IVR project, the dialer will forward the call to the IVR after the queue (if the queue ends by timeout)",
+      "DIALORDERBYSCHEDULEDAT": "Get contacts from hopper (descending or ascending).",
+      "DIALRECALLINQUEUE": "Reschedule call for agents in the Queue",
+      "DIALRECALLMETIMEOUT": "Time interval (in minutes) for Recall Me period of validity",
+      "PRIORITY": "Priority in the list",
+      "AMDMAXIMUMWORDLENGTH": "Maximum duration allowed of a single Voice utterance",
+      "AMDMINWORDLENGTH": "Minimum duration of a Voice to be considered a word",
+      "AMDSILENCETHRESHOLD": "If the average level of noise in a sample does not reach this value, from a scale of 0 to 32767, then we will consider it as silence",
+      "AMDTOTALANALYSISTIME": "Maximum time allowed for the algorithm to decide on whether the audio represents a HUMAN or a MACHINE",
+      "AMDAFTERGREETINGSILENCE": "Silence after detecting a greeting. If exceeded, then the result is detection as a HUMAN",
+      "AMDGREETING": "Maximum length of a greeting. If exceeded, then the result is detection as a MACHINE",
+      "AMDINITIALSILENCE": "Maximum silence duration before the greeting. If exceeded, then the result is detection as a MACHINE",
+      "AMDACTIVE": "Activate or disactivate answering machines detection attempts",
+      "AMDBETWEENWORDSSILENCE": "Minimum duration of silence after a word to consider the audio that follows as a new word",
+      "AMDMAXIMUMNUMBEROFWORDS": "Maximum number of words in the greeting. If REACHED, then the result is detection as a MACHINE",
+      "CALLYSQUAREPROJECT": "Selecting an IVR project, the dialer will forward the call to the IVR before the queue",
+      "PREFIX": "Telephone prefix",
+      "ACTIVE": "Active",
+      "AGENTTIMEOUT": "How long (in seconds) to ring an agent’s device",
+      "MAXLENGTH": "Maximum number of callers allowed to be waiting in a queue (0=unlimited)",
+      "RETRY": "How long (in seconds) to wait before calling the next agent in the queue when the agent timeout is expired",
+      "WRAPUPTIME": "How long (in seconds) to keep an agent unavailable in a queue after completing a call",
+      "WEIGHT": "Used to determine priority if the agents are associated with more than one queue",
+      "JOINWHENEMPTY": "If a caller is added to the queue, when no agents are available",
+      "LEAVEWHENEMPTY": "If a caller is expelled from the queue when no agents are available",
+      "ANNOUNCEFREQUENCY": "How often to announce the caller’s position and/or estimated hold time in the queue (0=disable)",
+      "MINANNOUNCEFREQUENCY": "Minimum announcement frequency (useful when the caller’s position changes frequently)",
+      "PERIODICANNOUNCEFREQUENCY": "Frequency of periodic announcements to the caller",
+      "ANNOUNCEPOSITIONLIMIT": "Used if you’ve defined announce-position as either 'limit' or 'more'",
+      "AFTERCALLWORKDURATION": "Pause length triggered by the After Call Work option",
+      "MEMBERDELAY": "Inserts a delay prior to the caller and agent in queue get connected",
+      "MUSICONHOLD": "Sets the music class to use for a particular queue",
+      "ANNOUNCETOAGENT": "Plays an announcement to the agent answering the call (e.g. to let him know which queue the caller is coming from)",
+      "RANDOMPERIODICANNOUNCE": "If yes, it plays the periodic announcements in random order",
+      "ANNOUNCEHOLDTIME": "Plays the estimated hold time along with the periodic announcements (Yes/No/Once)",
+      "ANNOUNCECALLERPOSITION": "Used to define if the caller’s position in the queue should be announced: No=never; Yes=always; Limit=only if it is within the limit defined by announce-position-limit; More= only if it is beyond the value defined by announce-position-limit",
+      "REPORTHOLDTIMEAGENT": "Enables reporting caller’s hold time to the agent in queue prior to connection",
+      "PERIODICANNOUNCE": "Set of periodic announcements to be played (in the order)",
+      "HOLDTIMEANNOUNCE": "Choose a Sound defined in Tools. Default=“Hold time”. Undefined=no announcement",
+      "YOUARENEXTANNOUNCE": "Choose a Sound defined in Tools. Default=“You are now first in line”. Undefined=no announcement",
+      "THEREAREANNOUNCE": "Choose a Sound defined in Tools. Default=“There are”. Undefined=no announcement",
+      "WAITINGCALLSANNOUNCE": "Choose a Sound defined in Tools. Default=“calls waiting”. Undefined=no announcement",
+      "ESTIMATEDHOLDTIMEANNOUNCE": "Choose a Sound defined in Tools. Default=“The current estimated hold time is”. Undefined=no announcement",
+      "MINUTESANNOUNCE": "Choose a Sound defined in Tools. Default=“minutes”. Undefined=no announcement",
+      "MINUTEANNOUNCE": "Choose a Sound defined in Tools. Default=“minute”. Undefined=no announcement",
+      "SECONDSANNOUNCE": "Choose a Sound defined in Tools. Default=“seconds”. Undefined=no announcement",
+      "THANKYOUANNOUNCE": "Choose a Sound defined in Tools. Default=“Thank you for your patience”. Undefined=no announcement",
+      "AFTERCALLWORK": "If enabled, the agent will be set on Pause after completing a call",
+      "AUTOPAUSE": "Enables/disables the automatic pause of agents who fail to answer a call. If enabled, it causes the agent to be paused in all queues he belongs to",
+      "RINGINUSE": "To avoid/allow sending calls to members whose status is In Use",
+      "TIMEOUTRESTART": "If yes, this resets the timeout for an agent to answer when either a BUSY or CONGESTION status is received from the channel",
+      "MONITORFORMAT": "Specifies the file format to use when recording. If monitor-format is inactive, calls will not be recorded",
+      "CONTEXT": "Allows a caller to exit the queue by pressing a single DTMF digit. If a context is specified and the caller enters a number, that digit will attempt to be matched in the context specified, and dialplan execution will continue there",
+      "SETINTERFACEVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent some variables will be set (for more information see wiki docs:<a target=\"_blank\"href=\"https://wiki.xcallymotion.com/display/XMV/Queue+Campaigns#QueueCampaigns-Advanced\">click here</a>)",
+      "SETQUEUEVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent and leaving the queue, some variables will be set (for more information, see wiki docs:<a target=\"_blank\"href=\"https://wiki.xcallymotion.com/display/XMV/Queue+Campaigns#QueueCampaigns-Advanced\">click here</a>)",
+      "SETQUEUEENTRYVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent some variables will be set (for more information, see wiki docs:<a target=\"_blank\"href=\"https://wiki.xcallymotion.com/display/XMV/Queue+Campaigns#QueueCampaigns-Advanced\">click here</a>)",
+      "RECORDING": "Enable call recording",
+      "VOICEMAIL_CONTEXT": "The context of the relative extension",
+      "METHOD": "Outbound dialer method",
+      "POWERLEVEL": "Number of contacts to call for any available agent",
+      "PREDICTIVEOPTIMIZATION": "A factor to optimize in the predictive algorithm",
+      "PREDICTIVEOPTIMIZATIONPERCENTAGE": "Percentage based on the selected predictive optimization factor",
+      "PREDICTIVEINTERVAL": "Time interval (in minutes) considered by the predictive algorithm to calculate the amount of calls to generate to optimize the result",
+      "MAXCONCURRENTCALLS": "Maximum number of concurrent calls that will be originated by the outbound dialer for this campaign (0=unlimited)",
+      "CONCURRENTCALLS": "Maximum number of concurrent calls that will be originated by the outbound dialer for this campaign",
+      "ORIGINATECALLERIDNAME": "Outgoing Caller Id Name",
+      "ORIGINATECALLERIDNUMBER": "Outgoing Caller Id Number",
+      "ORIGINATETIMEOUT": "Time (in seconds) for the outbound call to establish a connection, otherwise the status is set to No Answer ",
+      "QUEUETIMEOUT": "Time (in seconds) a call will wait in the queue before it is dropped (Min 1 and Max 999)",
+      "GLOBALMAXRETRY": "Maximum number of times a contact is called before considering it closed",
+      "CONGESTIONMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for congestion",
+      "CONGESTIONRETRYTIME": "Time in minutes before trying to call again a failed contact due to congestion",
+      "BUSYMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for busy",
+      "BUSYRETRYTIME": "Time in minutes before trying to call again a failed contact due to busy",
+      "NOANSWERMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for no answer",
+      "NOANSWERRETRYTIME": "Time in minutes before trying to call again a failed contact due to no answer",
+      "GLOBALINTERVAL": "Global time interval during which the dialer is allowed to call contacts. We decline responsibility: pay attention when you modify this field, because you may fail to comply with the national Autodialer Laws and Regulations",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "NOSUCHNUMBERMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for no such number",
+      "NOSUCHNUMBERRETRYTIME": "Time in minutes before trying to call again a failed contact due to no such number",
+      "DROPMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for drop",
+      "DROPRETRYTIME": "Time in minutes before trying to call again a failed contact due to drop",
+      "ABANDONEDMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for abandon",
+      "ABANDONEDRETRYTIME": "Time in minutes before trying to call again a failed contact due to abandon",
+      "MACHINEMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for machine",
+      "MACHINERETRYTIME": "Time in minutes before trying to call again a failed contact due to machine",
+      "AGENTREJECTMAXRETRY": "Maximum number of times a contact is called before considering it closed, when the call failed for agent reject",
+      "AGENTREJECTRETRYTIME": "Time in minutes before trying to call again a failed contact due to agent reject",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause status to set during mandatory disposition",
+      "PREVIEW_AUTO_RECALL_ME": "If enabled, the system will automatically generate the Recall Me calls; otherwise, the agent must do it manually"
+    },
+    "MUSICONHOLD": "Music On Hold",
+    "ANNOUNCETOAGENT": "Announce To Agent",
+    "ANNOUNCEMENTS": "Announcements",
+    "ADVANCEDPREVIEW": "Advanced",
+    "ADVANCED": "Advanced",
+    "ADVANCE": "Advanced",
+    "ANNOUNCEFREQUENCY": "Announce Frequency",
+    "MINANNOUNCEFREQUENCY": "Minimum Announce Frequency",
+    "PERIODICANNOUNCEFREQUENCY": "Periodic Announce Frequency",
+    "RANDOMPERIODICANNOUNCE": "Random Periodic Announce",
+    "ANNOUNCEHOLDTIME": "Announce Hold Time",
+    "ANNOUNCECALLERPOSITION": "Announce Caller Position",
+    "ANNOUNCEPOSITIONLIMIT": "Announce Position Limit",
+    "REPORTHOLDTIMEAGENT": "Report Agent Hold Time",
+    "PERIODICANNOUNCE": "Periodic Announce",
+    "HOLDTIMEANNOUNCE": "Hold Time Announce",
+    "YOUARENEXTANNOUNCE": "'You are next' Announce",
+    "THEREAREANNOUNCE": "'There are' Announce",
+    "WAITINGCALLSANNOUNCE": "Waiting Calls Announce",
+    "ESTIMATEDHOLDTIMEANNOUNCE": "Estimated Hold Time Announce",
+    "MINUTESANNOUNCE": "Minutes Announce",
+    "MINUTEANNOUNCE": "Minute Announce",
+    "SECONDSANNOUNCE": "Seconds Announce",
+    "THANKYOUANNOUNCE": "'Thank You' Announce",
+    "AUTOPAUSE": "Auto Pause",
+    "AFTERCALLWORK": "After Call Work",
+    "AFTERCALLWORKDURATION": "After Call Work Duration",
+    "RINGINUSE": "Ring In Use",
+    "MEMBERDELAY": "Member Delay",
+    "TIMEOUTRESTART": "Timeout Restart",
+    "MONITORFORMAT": "Recording Format",
+    "SETINTERFACEVARIABLES": "Set Interface Variables",
+    "SETQUEUEVARIABLES": "Set Queue Variables",
+    "SETQUEUEENTRYVARIABLES": "Set Queue Entry Variables",
+    "CONTEXT": "Context",
+    "SAVE": "Save",
+    "SETTINGS": "Settings",
+    "INBOUNDROUTES": "Inbound Routes",
+    "PHONENUMBER": "Phone Number",
+    "ADD_INBOUNDROUTE": "Add Inbound Route",
+    "EDIT_INBOUNDROUTE": "Edit Inbound Route",
+    "DELETE_INBOUNDROUTE": "Delete Inbound Route",
+    "ACTIONS": "Actions",
+    "OUTBOUNDROUTES": "Outbound Routes",
+    "DESTINATIONPATTERN": "Destination Pattern",
+    "ADD_OUTBOUNDROUTE": "Add Outbound Route",
+    "EDIT_OUTBOUNDROUTE": "Edit Outbound Route",
+    "DELETE_OUTBOUNDROUTE": "Delete Outbound Route",
+    "CUTDIGITS": "Cut Digits",
+    "RECORDING": "Recording",
+    "RECORDINGFORMAT": "Recording format",
+    "INTERNALROUTES": "Internal Routes",
+    "ADD_INTERNALROUTE": "Add Internal Route",
+    "EDIT_INTERNALROUTE": "Edit Internal Route",
+    "DELETE_INTERNALROUTE": "Delete Internal Route",
+    "CONTEXTS": "Contexts",
+    "ADD_CONTEXT": "Add Context",
+    "EDIT_CONTEXT": "Edit Context",
+    "DELETE_CONTEXT": "Delete Context",
+    "VOICEMAILS": "Voicemails",
+    "ADD_VOICEMAIL": "Add Voicemail",
+    "EDIT_VOICEMAIL": "Edit Voicemail",
+    "DELETE_VOICEMAIL": "Delete Voicemail",
+    "FULLNAME": "Full Name",
+    "EMAIL": "Email",
+    "MAILBOX": "Mailbox",
+    "PASSWORD": "Password",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "TIMEZONE": "Timezone",
+    "ATTACH": "Attach",
+    "ENVELOPE": "Envelope",
+    "DELETE": "Delete",
+    "EMAILBODY": "Email Body",
+    "EMAILSUBJECT": "Email Subject",
+    "MAXSECONDS": "Max Seconds",
+    "MAXMESSAGES": "Max Messages",
+    "MESSAGES": "Messages",
+    "SORT": "Sort",
+    "ADD_MUSICONHOLD": "Add Music On Hold",
+    "MUSICONHOLDS": "Music On Hold",
+    "EDIT_MUSICONHOLD": "Edit Music On Hold",
+    "DELETE_MUSICONHOLD": "Delete Music On Hold",
+    "DIRECTORY": "Directory",
+    "AUDIOFILES": "Audio Files",
+    "RECORDINGS": "Recordings",
+    "CHANSPY": "ChanSpy",
+    "PREFIX": "Prefix",
+    "OPTIONS": "Options",
+    "AUTH": "Auth",
+    "ADD_CHANSPY": "Add ChanSpy",
+    "EDIT_CHANSPY": "Edit ChanSpy",
+    "DELETE_CHANSPY": "Delete ChanSpy",
+    "AGENTS": "Agents",
+    "TELEPHONES": "Telephones",
+    "QUEUES": "Queues",
+    "QUEUE_CALLS": "Queue Calls",
+    "QUEUE_PARAMETERS": "Queue Parameters",
+    "ABANDONED_CALLS": "Abandoned Calls",
+    "OUTBOUND_CALLS": "Outbound Calls",
+    "AGI": "AGI",
+    "DIAL": "Dial",
+    "INTERNALDIAL": "Internal Dial",
+    "EXTERNALDIAL": "External Dial",
+    "RINGGROUP": "Ring Group",
+    "PLAYBACK": "Playback",
+    "QUEUE": "Queue",
+    "SET": "Set",
+    "VOICEMAIL": "Voicemail",
+    "GOTO": "GoTo",
+    "HANGUP": "Hangup",
+    "CUSTOM": "Custom",
+    "PROJECT": "Cally-Square Project",
+    "TECHNOLOGY/RESOURCE": "Technology/Resource",
+    "URL": "URL",
+    "EDIT_APP": "Edit Application",
+    "EDIT_INTERVAL": "Edit Interval",
+    "DELETE_APP": "Delete Application",
+    "INTERVALS": "Intervals",
+    "USER": "User",
+    "TRUNK": "Trunk",
+    "PHONE": "Phone",
+    "AUDIO_FILES": "Audio Files",
+    "ANNOUNCE_OVERRIDES": "Announce Overrides",
+    "MACRO": "Macro",
+    "GOSUB": "GoSub",
+    "RULE": "Rule",
+    "POSITION": "Position",
+    "ANSWER": "Answer",
+    "VALUE": "Value",
+    "MAILBOX@CONTEXT": "Mailbox@Context",
+    "EXTENSION": "Extension",
+    "PRIORITY": "Priority",
+    "HANGUP_CAUSE": "Hangup Cause",
+    "OUTBOUNDDIAL": "Outbound Dial",
+    "CALLER_ID": "Caller ID",
+    "NO_MESSAGE_AVAILABLE": "No messages available",
+    "NO_SOUND_AVAILABLE": "No sounds available",
+    "VOICERECORDINGS": "Voice Recordings",
+    "CHANSPIES": "ChanSpy",
+    "VOICE": "Voice",
+    "REALTIME": "Realtime",
+    "ID": "Id",
+    "VOICEMAIL_CONTEXT": "Context",
+    "NO_MOHSOUND_AVAILABLE": "No Music On Hold available",
+    "FILE": "File",
+    "ADD_MOHSOUND": "Add Music On Hold sound",
+    "DOWNLOAD_MOHSOUND": "Download Music On Hold sound",
+    "DELETE_MOHSOUND": "Delete Music On Hold sound",
+    "UNIQUEID": "Unique ID",
+    "AGENT": "Agent",
+    "TYPE": "Type",
+    "RATING": "Rating",
+    "AUDIO": "Audio",
+    "DATE": "Date",
+    "NEW_VOICEQUEUE": "New Voice Queue",
+    "NEW_INBOUNDROUTE": "New Inbound Route",
+    "NEW_OUTBOUNDROUTE": "New Outbound Route",
+    "NEW_INTERNALROUTE": "New Internal Route",
+    "NEW_CONTEXT": "New Context",
+    "NEW_VOICEMAIL": "New Voicemail",
+    "NEW_MUSICONHOLD": "New Music On Hold",
+    "NEW_CHANSPY": "New ChanSpy",
+    "PENALTY": "Penalty",
+    "ADD_TEAM_TO_VOICEQUEUE": "Add Team to Voice Queue",
+    "ADD_AGENT_TO_VOICEQUEUE": "Add Agent to Voice Queue",
+    "EDIT_DIAL": "Edit Dial",
+    "EDIT_AGI": "Edit AGI",
+    "EDIT_INTERNALDIAL": "Edit Internal Dial",
+    "EDIT_EXTERNALDIAL": "Edit External Dial",
+    "EDIT_RINGGROUP": "Edit Ring Group",
+    "EDIT_PLAYBACK": "Edit Playback",
+    "EDIT_QUEUE": "Edit Queue",
+    "EDIT_SET": "Edit Set",
+    "EDIT_GOTO": "Edit GoTo",
+    "EDIT_HANGUP": "Edit Hangup",
+    "EDIT_CUSTOM": "Edit Custom",
+    "DURATION": "Duration",
+    "RECEIVED_AT": "Received At",
+    "YES": "Yes",
+    "NO": "No",
+    "HANGUPCAUSE_1": "1 = Unallocated number",
+    "HANGUPCAUSE_16": "16 = Normal call clearing",
+    "HANGUPCAUSE_17": "17 = User busy",
+    "HANGUPCAUSE_18": "18 = No user responding (telehone device not connected)",
+    "HANGUPCAUSE_21": "21 = Call rejected",
+    "HANGUPCAUSE_22": "22 = Number changed",
+    "HANGUPCAUSE_27": "27 = Destination out of order",
+    "HANGUPCAUSE_38": "38 = Network out of order",
+    "HANGUPCAUSE_41": "41 = Temporary failure",
+    "RANDOM": "Random",
+    "ALPHABETICAL": "Alphabetical",
+    "NO_APPS_AVAILABLE": "No applications available",
+    "DOWNLOAD_VOICERECORDING": "Download Voice Recording",
+    "DELETE_VOICERECORDING": "Delete Voice Recording",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "REGISTERED": "Registered",
+    "UNREGISTERED": "Unregistered",
+    "LAGGED": "Lagged",
+    "REACHABLE": "Reachable",
+    "UNREACHABLE": "Unreachable",
+    "UNKNOWN": "Unknown",
+    "NOT_INUSE": "Not in use",
+    "INUSE": "In Use",
+    "BUSY": "Busy",
+    "INVALID": "Invalid",
+    "UNAVAILABLE": "Unavailable",
+    "RINGING": "Ringing",
+    "ONHOLD": "On Hold",
+    "RING": "Ring",
+    "UP": "Up",
+    "INFO": "Info",
+    "TRUNKS": "Trunks",
+    "REGISTRY": "Registry",
+    "NO_REGISTRY": "No registry",
+    "LOGGED_IN": "Logged in (SIP connected)",
+    "PAUSED": "Paused",
+    "DISPOSITION": "Disposition",
+    "WAITING": "Waiting",
+    "TALKING": "Talking",
+    "DID": "DID",
+    "CALLER": "Caller",
+    "TOTAL": "Total",
+    "ANSWERED": "Answered",
+    "ABANDONED": "Abandoned",
+    "UNMANAGED": "Unmanaged",
+    "REDIRECT_TO_NUMBER": "Redirect to a number",
+    "REDIRECT_TO_AGENT": "Redirect to an agent",
+    "CLOSING": "Closing",
+    "AVG_HOLD_TIME": "Avg Hold Time",
+    "AVG_DURATION": "Avg Duration",
+    "AVG_BILLABLE": "Avg Billable",
+    "SOURCE": "Source",
+    "DESTINATION": "Destination",
+    "REJECTED": "Rejected",
+    "FAILED": "Failed",
+    "CALLED": "Called",
+    "CONNECTED": "Connected",
+    "NO_RATING": "No rating",
+    "EDIT_VOICERECORDING": "Edit Voice Recording",
+    "APPLICATION_NAME": "Application Name",
+    "ARGUMENTS": "Arguments",
+    "EDIT_QUEUECAMPAIGN": "Edit Campaign",
+    "LISTADD_QUEUECAMPAIGN": "Add List",
+    "BLACKLISTADD_QUEUECAMPAIGN": "Add Blacklist",
+    "TEAMADD_QUEUECAMPAIGN": "Add Team",
+    "AGENTADD_QUEUECAMPAIGN": "Add Agent",
+    "DELETE_QUEUECAMPAIGN": "Delete Campaign",
+    "DELETE_IVRCAMPAIGN": "Delete Campaign",
+    "EDIT_IVRCAMPAIGN": "Edit Campaign",
+    "NEW_IVRCAMPAIGN": "New IVR Campaign",
+    "ADD_IVRCAMPAIGN": "Add IVR Campaign",
+    "LISTADD_IVRCAMPAIGN": "Add List",
+    "BLACKLISTADD_IVRCAMPAIGN": "Add Blacklist",
+    "ENABLED": "Enabled",
+    "READY": "Ready",
+    "PAUSE": "Pause",
+    "UNPAUSE": "End Pause",
+    "DEFAULT_PAUSE": "Default Pause",
+    "AGENTADD_QUEUE": "Add Agent to queue campaign",
+    "AGENTSADD_QUEUE": "Add Agents to queue campaign",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "ALL_LISTS": "All Lists",
+    "SELECTED_LISTS": "Selected Lists",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "WAITING_FOR_AGENT": "Waiting for Agent",
+    "TOTAL_OFFERED": "Total Offered",
+    "RUNNING": "Running",
+    "TRUNK_IS_NOT_REACHABLE": "Trunk is Not Reachable",
+    "AGENTS_NOT_LOGGED": "Agent not logged",
+    "NOT_ACTIVE": "Not Active",
+    "IS_DISACTIVED": "Deactivated",
+    "BACKUPTRUNK": "Backup Trunk",
+    "GLOBALINTERVAL": "Global Interval",
+    "RESCHEDULED_CONTACTS": "Rescheduled contacts",
+    "INTERVAL_IS_OVERTIME": "Out of Interval",
+    "GLOBAL_INTERVAL_IS_OVERTIME": "Out of Interval (Global)",
+    "INTERVAL_IS_NULL": "Interval is Null",
+    "TIMEZONE_UNKNOW": "Timezone Unknow",
+    "INTERVAL_IS_EMPTY": "Interval is Empty",
+    "TOTAL_MANAGED": "Total Managed",
+    "OPEN": "Open",
+    "FRESH": "Fresh",
+    "CLOSED": "Closed",
+    "ALWAYS": "Always",
+    "NEVER": "Never",
+    "ONLY_IF_OPEN": "Only If Open",
+    "CHECKDUPLICATE": "Check Duplicate",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Open Channel",
+    "FAX": "Fax",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Mandatory disposition pause status",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "PREVIEW_AUTO_RECALL_ME": "Automate Recall Me calls"
+  }
+}
diff --git a/public/app/main/apps/motiondialer/i18n/id.json b/public/app/main/apps/motiondialer/i18n/id.json
index 8e63086..248b861 100644
--- a/public/app/main/apps/motiondialer/i18n/id.json
+++ b/public/app/main/apps/motiondialer/i18n/id.json
@@ -104,9 +104,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilainya harus kurang dari atau sama dengan",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilainya harus kurang dari atau sama dengan",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilainya harus kurang dari atau sama dengan",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilainya harus kurang dari atau sama dengan",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Hubungi add.phone setelah min. harus lebih besar dari atau sama dengan",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Bidang wajib"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilainya harus kurang dari atau sama dengan"
     },
     "HELP": {
       "ACTIVE": "Aktif",
@@ -205,7 +203,8 @@
       "MACHINERETRYTIME": "Waktu dalam beberapa menit sebelum mencoba menelepon lagi kontak yang gagal karena mesin",
       "NOSUCHNUMBERETRYTIME": "Waktu dalam beberapa menit sebelum mencoba menelepon lagi kontak yang gagal karena tidak ada nomor tersebut",
       "NOSUCHNUMBERMAXRETRY": "Jumlah maksimum kontak dipanggil sebelum mempertimbangkannya ditutup, ketika panggilan gagal karena tidak ada nomor tersebut",
-      "NOSUCHNUMBERRETRYTIME": "Waktu dalam menit sebelum mencoba menelepon lagi kontak yang gagal karena tidak ada nomor tersebut"
+      "NOSUCHNUMBERRETRYTIME": "Waktu dalam menit sebelum mencoba menelepon lagi kontak yang gagal karena tidak ada nomor tersebut",
+      "PREVIEW_AUTO_RECALL_ME": "Jika diaktifkan, sistem akan secara otomatis menghasilkan panggilan Recall Me; jika tidak, agen harus melakukannya secara manual"
     },
     "ABANDONED": "Ditinggalkan",
     "ABANDONEDCALLS": "Panggilan Antrian yang Ditinggalkan",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Perekaman Layar sedang berlangsung",
     "SECOND_LEVEL_DISPOSITION": "Disposisi Tingkat Kedua",
     "THIRD_LEVEL_DISPOSITION": "Disposisi Tingkat Ketiga",
-    "ADDITIONALPHONES": "Telepon tambahan",
-    "CALLADDITIONALPHONEAFTERMIN": "Hubungi telepon tambahan setelah [mnt]"
+    "PREVIEW_AUTO_RECALL_ME": "Otomatiskan panggilan Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/it.json b/public/app/main/apps/motiondialer/i18n/it.json
index fc0835c..dadfa14 100644
--- a/public/app/main/apps/motiondialer/i18n/it.json
+++ b/public/app/main/apps/motiondialer/i18n/it.json
@@ -194,9 +194,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Chiama agg.telefono dopo min. dovrebbe essere maggiore o uguale a",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Campo obbligatorio"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore deve essere minore o uguale a"
     },
     "GENERAL": "Generale",
     "TIMEOUT": "Timeout",
@@ -218,6 +216,7 @@
       "DIALRECALLINQUEUE": "Rischedula per gli agenti della coda",
       "DIALRECALLMETIMEOUT": "Intervallo di tempo (in minuti) per la validità della chiamata di Recall Me",
       "PRIORITY": "livello di priorità nella lista contatti",
+      "PREVIEW_RECALL_ME_REMINDER": "If enabled, the system will send a notification to the agent n minutes (according to time interval set in general settings) before generating the recall me",
       "AMDMAXIMUMWORDLENGTH": "Massima durata di una singola parola pronunciata",
       "AMDMINWORDLENGTH": "Durata minima della voce per considerarla come parola",
       "AMDSILENCETHRESHOLD": "Soglia del silenzio: se il livello medio di rumore in un campione non raggiunge questo valore, in una scala da 0 a 32767, lo considereremo silenzioso",
@@ -303,7 +302,8 @@
       "MACHINERETRYTIME": "Tempo in minuti prima di provare a richiamare un contatto non riuscito a causa della macchina",
       "NOSUCHNUMBERETRYTIME": "Tempo in minuti prima di provare a chiamare nuovamente un contatto non riuscito a causa di tale numero",
       "NOSUCHNUMBERMAXRETRY": "Numero massimo di volte in cui un contatto viene chiamato prima di considerarlo chiuso, quando la chiamata non è riuscita senza tale numero",
-      "NOSUCHNUMBERRETRYTIME": "Tempo in minuti prima di provare a chiamare di nuovo un contatto fallito a causa della mancanza di tale numero"
+      "NOSUCHNUMBERRETRYTIME": "Tempo in minuti prima di provare a chiamare di nuovo un contatto fallito a causa della mancanza di tale numero",
+      "PREVIEW_AUTO_RECALL_ME": "Se abilitato, il sistema genererà automaticamente le chiamate Recall Me, altrimenti l'agente dovrà effettuarle manualmente"
     },
     "MUSICONHOLD": "Musica di attesa",
     "ANNOUNCETOAGENT": "Annuncio all'Agente",
@@ -690,7 +690,6 @@
     "NOSUCHNUMBERRETRYTIME": "Riprova [min]",
     "TOOLTIP_SCREENRECORDING_OFF": "Registrazione dello schermo disponibile",
     "TOOLTIP_SCREENRECORDING_ON": "Registrazione dello schermo in corso",
-    "ADDITIONALPHONES": "Telefoni aggiuntivi",
-    "CALLADDITIONALPHONEAFTERMIN": "Chiama telefono aggiuntivo dopo [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizza chiamate Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/ja.json b/public/app/main/apps/motiondialer/i18n/ja.json
index 07f76a6..19f3e34 100644
--- a/public/app/main/apps/motiondialer/i18n/ja.json
+++ b/public/app/main/apps/motiondialer/i18n/ja.json
@@ -101,9 +101,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "分後にadd.phoneを呼び出します。以上である必要があります",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "必須フィールド"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません"
     },
     "HELP": {
       "ACTIVE": "アクティブ",
@@ -202,7 +200,8 @@
       "MACHINERETRYTIME": "マシンが原因で失敗した連絡先に再度電話をかけるまでの時間（分単位）",
       "NOSUCHNUMBERETRYTIME": "そのような番号がないために失敗した連絡先に再度電話をかけるまでの時間（分単位）",
       "NOSUCHNUMBERMAXRETRY": "連絡先が閉じられたと見なされる前に、そのような番号がないために失敗した場合に連絡先が呼び出される最大回数",
-      "NOSUCHNUMBERRETRYTIME": "そのような番号がないために失敗した連絡先に再度電話をかけるまでの時間（分）"
+      "NOSUCHNUMBERRETRYTIME": "そのような番号がないために失敗した連絡先に再度電話をかけるまでの時間（分）",
+      "PREVIEW_AUTO_RECALL_ME": "有効にすると、システムは自動的にRecallMe呼び出しを生成します。それ以外の場合、エージェントは手動で行う必要があります"
     },
     "LEGEND": {
       "CUSTOM_APPLICATION": "(*) - カスタムアプリケーション"
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "スクリーン録画中",
     "SECOND_LEVEL_DISPOSITION": "第2レベルの気質",
     "THIRD_LEVEL_DISPOSITION": "第3レベルの気質",
-    "ADDITIONALPHONES": "追加の電話",
-    "CALLADDITIONALPHONEAFTERMIN": "[分]後に追加の電話をかける"
+    "PREVIEW_AUTO_RECALL_ME": "リコールミーコールを自動化する"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/ko.json b/public/app/main/apps/motiondialer/i18n/ko.json
index b799a07..ecd6b6c 100644
--- a/public/app/main/apps/motiondialer/i18n/ko.json
+++ b/public/app/main/apps/motiondialer/i18n/ko.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 다음보다 작거나 같아야합니다.",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 다음보다 작거나 같아야합니다.",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 다음보다 작거나 같아야합니다.",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 다음보다 작거나 같아야합니다.",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "분 후에 add.phone에 전화를 겁니다. 보다 크거나 같아야 합니다.",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "필수 필드"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 다음보다 작거나 같아야합니다."
     },
     "GENERAL": "일반",
     "AGENTTIMEOUT": "상담원 시간 초과",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "기계로 인해 실패한 컨택을 다시 호출하기 전의 시간 (분)",
       "NOSUCHNUMBERETRYTIME": "해당 번호가 없어 실패한 연락처를 다시 호출하기 전의 시간 (분)",
       "NOSUCHNUMBERMAXRETRY": "해당 번호가없는 통화에 실패한 경우, 통화 종료를 고려하기 전에 연락처가 전화를 건 최대 횟수",
-      "NOSUCHNUMBERRETRYTIME": "해당 번호가 없어 실패한 연락처로 다시 전화를 걸기 전의 시간 (분)"
+      "NOSUCHNUMBERRETRYTIME": "해당 번호가 없어 실패한 연락처로 다시 전화를 걸기 전의 시간 (분)",
+      "PREVIEW_AUTO_RECALL_ME": "활성화된 경우 시스템은 자동으로 Recall Me 호출을 생성합니다. 그렇지 않으면 에이전트가 수동으로 수행해야 합니다."
     },
     "MUSICONHOLD": "대기 중 음악",
     "ANNOUNCETOAGENT": "상담원에게 공지",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "화면 녹화 중",
     "SECOND_LEVEL_DISPOSITION": "두 번째 수준 처리",
     "THIRD_LEVEL_DISPOSITION": "3 단계 처리",
-    "ADDITIONALPHONES": "추가 전화",
-    "CALLADDITIONALPHONEAFTERMIN": "[min] 후 추가 전화 걸기"
+    "PREVIEW_AUTO_RECALL_ME": "자동 회상 전화"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/lt.json b/public/app/main/apps/motiondialer/i18n/lt.json
index cd32d1c..dd64b67 100644
--- a/public/app/main/apps/motiondialer/i18n/lt.json
+++ b/public/app/main/apps/motiondialer/i18n/lt.json
@@ -259,9 +259,7 @@
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vertė turi būti mažesnė arba lygi",
       "NOSUCHNUMBERMAXRETRY_REQUIRED": "Privalomas laukas",
       "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vertė turi būti mažesnė arba lygi",
-      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Privalomas laukas",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Skambinti add.phone po min. turėtų būti didesnis arba lygus",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Privalomas laukas"
+      "NOSUCHNUMBERRETRYTIME_REQUIRED": "Privalomas laukas"
     },
     "GENERAL": "Bendras",
     "AGENTTIMEOUT": "Agento laikas",
@@ -367,7 +365,8 @@
       "MACHINEMAXRETRY": "Maksimalus kartų skaičius, kiek kontaktui yra skambinama prieš laikant jį uždarytu, kai skambutis nepavyko dėl įrenginio",
       "MACHINERETRYTIME": "Laikas minutėmis, kai bandysite dar kartą paskambinti nepavykusiam kontaktui dėl įrenginio",
       "NOSUCHNUMBERMAXRETRY": "Maksimalus kartų skaičius, kiek kontaktui yra skambinama prieš laikant jį uždarytu, kai skambutis nepavyko, nes nėra tokio numerio",
-      "NOSUCHNUMBERRETRYTIME": "Laikas minutėmis, kai bandysite dar kartą paskambinti nepavykusiam kontaktui, kai nėra tokio numerio"
+      "NOSUCHNUMBERRETRYTIME": "Laikas minutėmis, kai bandysite dar kartą paskambinti nepavykusiam kontaktui, kai nėra tokio numerio",
+      "PREVIEW_AUTO_RECALL_ME": "Jei įjungta, sistema automatiškai generuos Recall Me skambučius; kitu atveju agentas turi tai padaryti rankiniu būdu"
     },
     "MUSICONHOLD": "Muzika sulaikyta",
     "ANNOUNCETOAGENT": "Pranešti agentui",
@@ -689,7 +688,6 @@
     "NOSUCHNUMBERRETRYTIME": "Pakartojimų laikas [min.]",
     "SECOND_LEVEL_DISPOSITION": "Antro lygio disponavimas",
     "THIRD_LEVEL_DISPOSITION": "Trečiojo lygio disponavimas",
-    "ADDITIONALPHONES": "Papildomi telefonai",
-    "CALLADDITIONALPHONEAFTERMIN": "Paskambinkite papildomu telefonu po [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizuokite „Recall Me“ skambučius"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/lv.json b/public/app/main/apps/motiondialer/i18n/lv.json
index 1fc6b6b..0db7391 100644
--- a/public/app/main/apps/motiondialer/i18n/lv.json
+++ b/public/app/main/apps/motiondialer/i18n/lv.json
@@ -104,9 +104,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazākai vai vienādai ar",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazākai vai vienādai ar",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazākai vai vienādai ar",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazākai vai vienādai ar",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Zvans add.phone pēc min. jābūt lielākam vai vienādam ar",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Obligāts lauks"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazākai vai vienādai ar"
     },
     "HELP": {
       "TIMEOUT": "Sekunžu skaits, lai piezvanītu aģentam rindā",
@@ -205,7 +203,8 @@
       "MACHINERETRYTIME": "Laiks minūtēs, pirms mēģināt vēlreiz piezvanīt neveiksmīgam kontaktam mašīnas dēļ",
       "NOSUCHNUMBERETRYTIME": "Laiks minūtēs, pirms mēģināt vēlreiz piezvanīt neveiksmīgam kontaktam, jo šāda numura nav",
       "NOSUCHNUMBERMAXRETRY": "Maksimālais reižu skaits, uz kuru tiek piezvanīts kontaktam pirms tā uzskatīšanas par slēgtu, kad zvana neizdevās, ja šāda numura nav",
-      "NOSUCHNUMBERRETRYTIME": "Laiks minūtēs, pirms mēģināt vēlreiz piezvanīt uz neizdevušos kontaktu, jo nav šāda numura"
+      "NOSUCHNUMBERRETRYTIME": "Laiks minūtēs, pirms mēģināt vēlreiz piezvanīt uz neizdevušos kontaktu, jo nav šāda numura",
+      "PREVIEW_AUTO_RECALL_ME": "Ja tas ir iespējots, sistēma automātiski ģenerēs Recall Me zvanus; pretējā gadījumā aģentam tas jādara manuāli"
     },
     "NO_AVAILABLE_INFO": "Nav pieejama informācija",
     "TIMEOUT": "Noildze",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Notiek ekrāna ierakstīšana",
     "SECOND_LEVEL_DISPOSITION": "Otrā līmeņa izvietojums",
     "THIRD_LEVEL_DISPOSITION": "Trešā līmeņa izvietojums",
-    "ADDITIONALPHONES": "Papildu tālruņi",
-    "CALLADDITIONALPHONEAFTERMIN": "Zvaniet uz papildu tālruni pēc [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizējiet Recall Me zvanus"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/nl.json b/public/app/main/apps/motiondialer/i18n/nl.json
index 5c57e52..95fa4fc 100644
--- a/public/app/main/apps/motiondialer/i18n/nl.json
+++ b/public/app/main/apps/motiondialer/i18n/nl.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Bel add.phone na min. moet groter zijn dan of gelijk zijn aan",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Verplicht veld"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan"
     },
     "GENERAL": "Algemeen",
     "AGENTTIMEOUT": "Time-out agent",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Tijd in minuten voordat u probeert een mislukt contact vanwege de machine opnieuw te bellen",
       "NOSUCHNUMBERETRYTIME": "Tijd in minuten voordat u probeert een mislukt contact opnieuw te bellen vanwege een dergelijk nummer",
       "NOSUCHNUMBERMAXRETRY": "Maximaal aantal keren dat een contactpersoon wordt gebeld voordat deze als gesloten wordt beschouwd, wanneer het gesprek niet voor zo'n aantal is mislukt",
-      "NOSUCHNUMBERRETRYTIME": "Tijd in minuten voordat u opnieuw probeert een mislukt contact te bellen omdat een dergelijk nummer niet bestaat"
+      "NOSUCHNUMBERRETRYTIME": "Tijd in minuten voordat u opnieuw probeert een mislukt contact te bellen omdat een dergelijk nummer niet bestaat",
+      "PREVIEW_AUTO_RECALL_ME": "Indien ingeschakeld, genereert het systeem automatisch de Recall Me-oproepen; anders moet de agent het handmatig doen"
     },
     "MUSICONHOLD": "Wachtmuziek",
     "ANNOUNCETOAGENT": "Kondig Agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Schermopname bezig",
     "SECOND_LEVEL_DISPOSITION": "Tweede niveau dispositie",
     "THIRD_LEVEL_DISPOSITION": "Dispositie op het derde niveau",
-    "ADDITIONALPHONES": "Extra telefoons",
-    "CALLADDITIONALPHONEAFTERMIN": "Extra telefoon bellen na [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatisch terugbellen oproepen"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/no.json b/public/app/main/apps/motiondialer/i18n/no.json
index 53465e3..8c04670 100644
--- a/public/app/main/apps/motiondialer/i18n/no.json
+++ b/public/app/main/apps/motiondialer/i18n/no.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Ring tilleggstelefon etter min. skal være større enn eller lik",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Obligatoriske felt"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik"
     },
     "GENERAL": "Generelt",
     "AGENTTIMEOUT": "Agent tidsavbrudd",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Tid i minutter før du prøver å ringe igjen en mislykket kontakt på grunn av maskinen",
       "NOSUCHNUMBERETRYTIME": "Tid i minutter før du prøver å ringe igjen en mislykket kontakt på grunn av ikke noe slikt nummer",
       "NOSUCHNUMBERMAXRETRY": "Maksimalt antall ganger en kontakt ringes før den vurderes som lukket, når samtalen mislyktes uten noe slikt nummer",
-      "NOSUCHNUMBERRETRYTIME": "Tid i minutter før du prøver å ringe en mislykket kontakt igjen på grunn av ikke noe slikt nummer"
+      "NOSUCHNUMBERRETRYTIME": "Tid i minutter før du prøver å ringe en mislykket kontakt igjen på grunn av ikke noe slikt nummer",
+      "PREVIEW_AUTO_RECALL_ME": "Hvis aktivert, vil systemet automatisk generere Recall Me-anropene; ellers må agenten gjøre det manuelt"
     },
     "MUSICONHOLD": "Musikk på vent",
     "ANNOUNCETOAGENT": "Annonsere til agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Skjermopptak pågår",
     "SECOND_LEVEL_DISPOSITION": "Andre nivå disposisjon",
     "THIRD_LEVEL_DISPOSITION": "Tredje nivå disposisjon",
-    "ADDITIONALPHONES": "Ekstra telefoner",
-    "CALLADDITIONALPHONEAFTERMIN": "Ring ytterligere telefon etter [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatiser Recall Me-samtaler"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/pl.json b/public/app/main/apps/motiondialer/i18n/pl.json
index 69804e9..c25baec 100644
--- a/public/app/main/apps/motiondialer/i18n/pl.json
+++ b/public/app/main/apps/motiondialer/i18n/pl.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Zadzwoń na ad.telefon po min. powinna być większa lub równa",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Pole obowiązkowe"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa"
     },
     "GENERAL": "Ogólne",
     "AGENTTIMEOUT": "Agent Timeout",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Czas w minutach przed ponownym wywołaniem nieudanego kontaktu z powodu urządzenia",
       "NOSUCHNUMBERETRYTIME": "Czas w minutach przed ponownym wywołaniem nieudanego kontaktu z powodu braku takiego numeru",
       "NOSUCHNUMBERMAXRETRY": "Maksymalna liczba wywołań kontaktu przed uznaniem go za zamknięty, gdy połączenie nie powiodło się z powodu braku takiego numeru",
-      "NOSUCHNUMBERRETRYTIME": "Czas w minutach przed ponowną próbą połączenia z nieudanym kontaktem z powodu braku takiego numeru"
+      "NOSUCHNUMBERRETRYTIME": "Czas w minutach przed ponowną próbą połączenia z nieudanym kontaktem z powodu braku takiego numeru",
+      "PREVIEW_AUTO_RECALL_ME": "Jeśli ta opcja jest włączona, system automatycznie wygeneruje połączenia Przywołaj mnie; w przeciwnym razie agent musi to zrobić ręcznie"
     },
     "MUSICONHOLD": "Music on Hold",
     "ANNOUNCETOAGENT": "Poinformowania agenta",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Trwa nagrywanie ekranu",
     "SECOND_LEVEL_DISPOSITION": "Dyspozycja drugiego poziomu",
     "THIRD_LEVEL_DISPOSITION": "Dyspozycja trzeciego poziomu",
-    "ADDITIONALPHONES": "Dodatkowe telefony",
-    "CALLADDITIONALPHONEAFTERMIN": "Zadzwoń na dodatkowy telefon po [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatyzacja połączeń typu Przypomnij mnie"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/pt-BR.json b/public/app/main/apps/motiondialer/i18n/pt-BR.json
index e3b99e7..8719976 100644
--- a/public/app/main/apps/motiondialer/i18n/pt-BR.json
+++ b/public/app/main/apps/motiondialer/i18n/pt-BR.json
@@ -239,9 +239,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Ligue para add.phone após min. deve ser maior ou igual a",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Campo obrigatório"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a"
     },
     "GENERAL": "Geral",
     "AGENTTIMEOUT": "Tempo limite do agente",
@@ -348,7 +346,8 @@
       "MACHINERETRYTIME": "Tempo em minutos antes de tentar chamar novamente um contato com falha devido à máquina",
       "NOSUCHNUMBERETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato com falha devido a esse número",
       "NOSUCHNUMBERMAXRETRY": "Número máximo de vezes que um contato é chamado antes de considerá-lo fechado, quando a chamada falhou para esse número",
-      "NOSUCHNUMBERRETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato que falhou devido à inexistência desse número"
+      "NOSUCHNUMBERRETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato que falhou devido à inexistência desse número",
+      "PREVIEW_AUTO_RECALL_ME": "Se ativado, o sistema irá gerar automaticamente as chamadas Recall Me; caso contrário, o agente deve fazer isso manualmente"
     },
     "MUSICONHOLD": "Música em espera",
     "ANNOUNCETOAGENT": "Anunciar ao agente",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Gravação de tela em andamento",
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "THIRD_LEVEL_DISPOSITION": "Disposição de terceiro nível",
-    "ADDITIONALPHONES": "Telefones adicionais",
-    "CALLADDITIONALPHONEAFTERMIN": "Ligue para outro telefone após [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizar Chamadas Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/pt-PT.json b/public/app/main/apps/motiondialer/i18n/pt-PT.json
index 03e0ddd..4aec7f4 100644
--- a/public/app/main/apps/motiondialer/i18n/pt-PT.json
+++ b/public/app/main/apps/motiondialer/i18n/pt-PT.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Ligue para add.phone após min. deve ser maior ou igual a",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Campo obrigatório"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a"
     },
     "GENERAL": "Geral",
     "AGENTTIMEOUT": "Tempo Limite do Agente",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Tempo em minutos antes de tentar chamar novamente um contato com falha devido à máquina",
       "NOSUCHNUMBERETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato com falha devido a esse número",
       "NOSUCHNUMBERMAXRETRY": "Número máximo de vezes que um contato é chamado antes de considerá-lo fechado, quando a chamada falhou para esse número",
-      "NOSUCHNUMBERRETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato que falhou devido à inexistência desse número"
+      "NOSUCHNUMBERRETRYTIME": "Tempo em minutos antes de tentar ligar novamente para um contato que falhou devido à inexistência desse número",
+      "PREVIEW_AUTO_RECALL_ME": "Se ativado, o sistema irá gerar automaticamente as chamadas Recall Me; caso contrário, o agente deve fazer isso manualmente"
     },
     "MUSICONHOLD": "Música em espera",
     "ANNOUNCETOAGENT": "Anunciar para agente",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Gravação de tela em andamento",
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "THIRD_LEVEL_DISPOSITION": "Disposição de terceiro nível",
-    "ADDITIONALPHONES": "Telefones adicionais",
-    "CALLADDITIONALPHONEAFTERMIN": "Ligue para outro telefone após [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatizar Chamadas Recall Me"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/ru.json b/public/app/main/apps/motiondialer/i18n/ru.json
index cc6e1fc..ad68aa1 100644
--- a/public/app/main/apps/motiondialer/i18n/ru.json
+++ b/public/app/main/apps/motiondialer/i18n/ru.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Звоните на доп. Телефон через мин. должно быть больше или равно",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Обязательное поле"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно"
     },
     "GENERAL": "Генеральной",
     "AGENTTIMEOUT": "Время ожидания оператора",
@@ -322,7 +320,8 @@
       "MACHINEMAXRETRY": "Максимальное количество вызовов контакта, прежде чем он будет считаться закрытым, когда вызов не удался для машины",
       "MACHINERETRYTIME": "Время в минутах до повторной попытки дозвона. Неудачный контакт из-за машины",
       "NOSUCHNUMBERMAXRETRY": "Максимальное количество вызовов контакта, прежде чем он будет считаться закрытым, если вызов не удался ни для одного такого номера",
-      "NOSUCHNUMBERRETRYTIME": "Время в минутах до повторной попытки дозвона. Неудачный контакт из-за отсутствия такого номера"
+      "NOSUCHNUMBERRETRYTIME": "Время в минутах до повторной попытки дозвона. Неудачный контакт из-за отсутствия такого номера",
+      "PREVIEW_AUTO_RECALL_ME": "Если этот параметр включен, система автоматически генерирует вызовы «Перезвоните мне»; в противном случае агент должен сделать это вручную"
     },
     "MUSICONHOLD": "Музыка на удержании",
     "ANNOUNCETOAGENT": "Сообщить оператору",
@@ -689,7 +688,6 @@
     "NOSUCHNUMBERRETRYTIME": "Время повтора [мин]",
     "SECOND_LEVEL_DISPOSITION": "Расположение второго уровня",
     "THIRD_LEVEL_DISPOSITION": "Расположение третьего уровня",
-    "ADDITIONALPHONES": "Дополнительные телефоны",
-    "CALLADDITIONALPHONEAFTERMIN": "Позвонить на дополнительный телефон через [мин]"
+    "PREVIEW_AUTO_RECALL_ME": "Автоматическая функция \"Перезвоните мне\""
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/sv.json b/public/app/main/apps/motiondialer/i18n/sv.json
index 784199b..66021b0 100644
--- a/public/app/main/apps/motiondialer/i18n/sv.json
+++ b/public/app/main/apps/motiondialer/i18n/sv.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Ring till. Telefon efter min. bör vara större än eller lika med",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Obligatoriskt fält"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med"
     },
     "GENERAL": "Allmänt",
     "AGENTTIMEOUT": "Tidsgräns för agent",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Tid i minuter innan du försöker ringa igen en misslyckad kontakt på grund av maskinen",
       "NOSUCHNUMBERETRYTIME": "Tid i minuter innan du försöker ringa igen en misslyckad kontakt på grund av inget sådant nummer",
       "NOSUCHNUMBERMAXRETRY": "Maximalt antal gånger en kontakt anropas innan den överväger att den är stängd, när samtalet misslyckades för inget sådant nummer",
-      "NOSUCHNUMBERRETRYTIME": "Tid i minuter innan du försöker ringa igen en misslyckad kontakt på grund av inget sådant nummer"
+      "NOSUCHNUMBERRETRYTIME": "Tid i minuter innan du försöker ringa igen en misslyckad kontakt på grund av inget sådant nummer",
+      "PREVIEW_AUTO_RECALL_ME": "Om det är aktiverat kommer systemet automatiskt att generera Recall Me-samtal; annars måste agenten göra det manuellt"
     },
     "MUSICONHOLD": "Musik i vänteläge",
     "ANNOUNCETOAGENT": "Meddela till agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Skärminspelning pågår",
     "SECOND_LEVEL_DISPOSITION": "Andra nivån disposition",
     "THIRD_LEVEL_DISPOSITION": "Tredje nivåens disposition",
-    "ADDITIONALPHONES": "Ytterligare telefoner",
-    "CALLADDITIONALPHONEAFTERMIN": "Ring ytterligare telefon efter [min]"
+    "PREVIEW_AUTO_RECALL_ME": "Automatisera Recall Me-samtal"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/tr.json b/public/app/main/apps/motiondialer/i18n/tr.json
index 8142920..f1a9f7a 100644
--- a/public/app/main/apps/motiondialer/i18n/tr.json
+++ b/public/app/main/apps/motiondialer/i18n/tr.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şundan küçük veya ona eşit olmalıdır",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şundan küçük veya ona eşit olmalıdır",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şundan küçük veya ona eşit olmalıdır",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şundan küçük veya ona eşit olmalıdır",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Dakikadan sonra add.phone'u arayın. daha büyük veya eşit olmalıdır",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "Zorunlu alan"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şundan küçük veya ona eşit olmalıdır"
     },
     "GENERAL": "Genel",
     "AGENTTIMEOUT": "Ajan Zaman Aşımı",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "Makine nedeniyle başarısız bir kişiyi tekrar aramaya çalışmadan önce dakika",
       "NOSUCHNUMBERETRYTIME": "Böyle bir numara olmadığı için başarısız bir kişiyi tekrar aramaya çalışmadan önce dakika cinsinden süre",
       "NOSUCHNUMBERMAXRETRY": "Böyle bir numara için arama başarısız olduğunda, bir kişi kapalı olduğunu düşünmeden önce maksimum çağrı sayısı",
-      "NOSUCHNUMBERRETRYTIME": "Böyle bir numara olmaması nedeniyle başarısız bir kişiyi tekrar aramaya çalışmadan önce dakika cinsinden süre"
+      "NOSUCHNUMBERRETRYTIME": "Böyle bir numara olmaması nedeniyle başarısız bir kişiyi tekrar aramaya çalışmadan önce dakika cinsinden süre",
+      "PREVIEW_AUTO_RECALL_ME": "Etkinleştirilirse sistem, Beni Geri Çağır çağrılarını otomatik olarak oluşturur; aksi takdirde, aracının bunu manuel olarak yapması gerekir"
     },
     "MUSICONHOLD": "Bekletme Müziği",
     "ANNOUNCETOAGENT": "Duyurmak Agent",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "Ekran Kaydı devam ediyor",
     "SECOND_LEVEL_DISPOSITION": "İkinci Düzey Tasarruf",
     "THIRD_LEVEL_DISPOSITION": "Üçüncü Düzey Tasarruf",
-    "ADDITIONALPHONES": "Ek telefonlar",
-    "CALLADDITIONALPHONEAFTERMIN": "[dk] sonra ek telefonu arayın"
+    "PREVIEW_AUTO_RECALL_ME": "Beni Geri Çağır aramalarını otomatikleştir"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/zh-CN.json b/public/app/main/apps/motiondialer/i18n/zh-CN.json
index 157d69a..3ae2392 100644
--- a/public/app/main/apps/motiondialer/i18n/zh-CN.json
+++ b/public/app/main/apps/motiondialer/i18n/zh-CN.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "分钟后拨打 add.phone。应该大于或等于",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "必填项"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于"
     },
     "GENERAL": "总的",
     "AGENTTIMEOUT": "代理超时",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "以分钟为单位的时间，尝试再打一次由于计算机而导致失败的联系",
       "NOSUCHNUMBERETRYTIME": "分钟（以分钟为单位），由于没有该号码，因此尝试再次致电失败的联系人",
       "NOSUCHNUMBERMAXRETRY": "如果呼叫没有成功，则在联系被关闭之前被呼叫的最大次数",
-      "NOSUCHNUMBERRETRYTIME": "分钟（以分钟为单位），由于没有该号码，因此尝试再次致电失败的联系人"
+      "NOSUCHNUMBERRETRYTIME": "分钟（以分钟为单位），由于没有该号码，因此尝试再次致电失败的联系人",
+      "PREVIEW_AUTO_RECALL_ME": "如果启用，系统将自动生成 Recall Me 呼叫；否则，代理必须手动执行"
     },
     "MUSICONHOLD": "音乐保留",
     "ANNOUNCETOAGENT": "宣布到座席",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "屏幕录制正在进行中",
     "SECOND_LEVEL_DISPOSITION": "二级处置",
     "THIRD_LEVEL_DISPOSITION": "第三级处置",
-    "ADDITIONALPHONES": "附加电话",
-    "CALLADDITIONALPHONEAFTERMIN": "[分钟] 后拨打其他电话"
+    "PREVIEW_AUTO_RECALL_ME": "自动回叫我电话"
   }
 }
diff --git a/public/app/main/apps/motiondialer/i18n/zh-TW.json b/public/app/main/apps/motiondialer/i18n/zh-TW.json
index 84cfd11..847f0d6 100644
--- a/public/app/main/apps/motiondialer/i18n/zh-TW.json
+++ b/public/app/main/apps/motiondialer/i18n/zh-TW.json
@@ -214,9 +214,7 @@
       "MACHINEMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於",
       "MACHINERETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於",
       "NOSUCHNUMBERMAXRETRY_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於",
-      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於",
-      "CALLADDITIONALPHONEAFTERMIN_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "分鐘後撥打 add.phone。應該大於或等於",
-      "CALLADDITIONALPHONEAFTERMIN_REQUIRED": "必填項"
+      "NOSUCHNUMBERRETRYTIME_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於"
     },
     "GENERAL": "通用",
     "AGENTTIMEOUT": "值機人員等候逾時",
@@ -323,7 +321,8 @@
       "MACHINERETRYTIME": "以分鐘為單位的時間，嘗試再打一次由於機器而導致失敗的聯繫",
       "NOSUCHNUMBERETRYTIME": "分鐘（以分鐘為單位），由於沒有該號碼，因此嘗試再次致電失敗的聯繫人",
       "NOSUCHNUMBERMAXRETRY": "當呼叫未成功關閉時，呼叫被聯繫之前被關閉的最大次數",
-      "NOSUCHNUMBERRETRYTIME": "分鐘（以分鐘為單位），由於沒有該號碼，因此嘗試再次致電失敗的聯繫人"
+      "NOSUCHNUMBERRETRYTIME": "分鐘（以分鐘為單位），由於沒有該號碼，因此嘗試再次致電失敗的聯繫人",
+      "PREVIEW_AUTO_RECALL_ME": "如果啟用，系統將自動生成 Recall Me 呼叫；否則，代理必須手動執行"
     },
     "MUSICONHOLD": "音樂保留通話",
     "ANNOUNCETOAGENT": "發佈至值機員",
@@ -690,7 +689,6 @@
     "TOOLTIP_SCREENRECORDING_ON": "屏幕錄製正在進行中",
     "SECOND_LEVEL_DISPOSITION": "二級處置",
     "THIRD_LEVEL_DISPOSITION": "第三級處置",
-    "ADDITIONALPHONES": "附加電話",
-    "CALLADDITIONALPHONEAFTERMIN": "[分鐘] 後撥打其他電話"
+    "PREVIEW_AUTO_RECALL_ME": "自動回叫我電話"
   }
 }
diff --git a/public/app/main/apps/openchannel/i18n/de.json b/public/app/main/apps/openchannel/i18n/de.json
index 0ef1225..d002733 100644
--- a/public/app/main/apps/openchannel/i18n/de.json
+++ b/public/app/main/apps/openchannel/i18n/de.json
@@ -1,59 +1,59 @@
 {
   "OPENCHANNEL": {
     "TEXT": "Text",
-    "TIMES": "Die Anzahl der Zeiten pro Interaktion",
-    "EDIT_AUTOREPLY": "Bearbeiten Sie automatische Antwort",
+    "TIMES": "Zeitstempel",
+    "EDIT_AUTOREPLY": "Automatische Antwort bearbeiten",
     "AUTOREPLY": "Automatische Antwort",
     "NAME": "Name",
-    "OPENCHANNELQUEUES": "Offener Kanal Warteschlangen",
-    "SEARCH_FOR_ANYONE": "Suche für Jedermann",
+    "OPENCHANNELQUEUES": "Warteschlangen offener Kanal",
+    "SEARCH_FOR_ANYONE": "Suche",
     "ERRORS": {
-      "TEXT_REQUIRED": "Das Feld \"Text\" ist erforderlich",
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "AGENT_TIMEOUT_REQUIRED": "Der Agent Timeout ist erforderlich",
-      "MOTIONADDRESS_REQUIRED": "Die Adresse ist erforderlich",
-      "MOTIONADDRESS_MUST_VALID_URL": "Die Adresse muss in einem gültigen Format",
-      "ACCEPTURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "TIMEOUT_REQUIRED": "Der Timeout ist erforderlich",
-      "REJECTURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "CLOSEURL_MUST_VALID_URL": "Die URL muss in einem gültigen Format",
-      "REPLYURI_REQUIRED": "Die Antwort URL ist erforderlich",
-      "REPLYURI_MUST_VALID_URL": "Die Antwort URL muss im gültigen Format geschrieben werden",
-      "PRIORITY_REQUIRED": "Die Priorität ist erforderlich",
-      "CONDITION_REQUIRED": "Der Zustand ist erforderlich",
-      "TRUEPRIORITY_REQUIRED": "Die wahre Priorität ist erforderlich",
-      "FALSEPRIORITY_REQUIRED": "Die falsche Priorität ist erforderlich",
+      "TEXT_REQUIRED": "Feld \"Text\" ist erforderlich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "AGENT_TIMEOUT_REQUIRED": "Agent Timeout ist erforderlich",
+      "MOTIONADDRESS_REQUIRED": "Adresse ist erforderlich",
+      "MOTIONADDRESS_MUST_VALID_URL": "Adresse ungültiges Format",
+      "ACCEPTURL_MUST_VALID_URL": "URL ungültiges Format",
+      "TIMEOUT_REQUIRED": "Timeout ist erforderlich",
+      "REJECTURL_MUST_VALID_URL": "URL ungültiges Format",
+      "CLOSEURL_MUST_VALID_URL": "URL ungültiges Format",
+      "REPLYURI_REQUIRED": "Antwort-URL ungültiges Format",
+      "REPLYURI_MUST_VALID_URL": "Antwort-URL ungültiges Format",
+      "PRIORITY_REQUIRED": "Priorität ist erforderlich",
+      "CONDITION_REQUIRED": "Bedingung ist erforderlich",
+      "TRUEPRIORITY_REQUIRED": "Wahre Priorität ist erforderlich",
+      "FALSEPRIORITY_REQUIRED": "Falsche Priorität ist erforderlich",
       "AGENT_REQUIRED": "Pflichtfeld",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer als oder gleich",
-      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer als oder gleich",
-      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer als oder gleich",
-      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer als oder gleich",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
       "DISPOSITION_REQUIRED": "Pflichtfeld",
       "QUEUE_REQUIRED": "Pflichtfeld",
-      "KEY_MAX_LENGTH": "Schlüssel muss eine maximale Länge von {{max}}",
-      "TEXT_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
+      "KEY_MAX_LENGTH": "Schlüssel darf eine maximale Länge haben von {{max}}",
+      "TEXT_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}}",
       "VALUE_REQUIRED": "Pflichtfeld",
       "COMMAND_REQUIRED": "Pflichtfeld",
       "LIST_REQUIRED": "Pflichtfeld",
       "KEY_REQUIRED": "Pflichtfeld",
-      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "NAME_MUST_VALID_PATTERN": "Falsches Format",
-      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "NAME_MUST_VALID_PATTERN": "Format ungültig",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Pflichtfeld",
       "TAG_REQUIRED": "Pflichtfeld",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "AGENTTRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "QUEUETRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Pflichtfeld",
       "ACCESSKEYID_REQUIRED": "Zugangsschlüssel-ID ist erforderlich",
-      "BOTNAME_REQUIRED": "Der Bot-Name ist erforderlich",
-      "SECRETACCESSKEY_REQUIRED": "Zugangsschlüssel geheim ist erforderlich",
+      "BOTNAME_REQUIRED": "Bot-Name ist erforderlich",
+      "SECRETACCESSKEY_REQUIRED": "Geheimer Schlüssel ist erforderlich",
       "CLIENTEMAIL_REQUIRED": "Pflichtfeld",
       "PRIVATEKEY_REQUIRED": "Pflichtfeld",
       "PROJECTID_REQUIRED": "Pflichtfeld"
@@ -64,208 +64,208 @@
     "GOTOIF": "Gotoif",
     "NOOP": "Noop",
     "QUEUE": "Warteschlange",
-    "EDIT_AGENT": "Agent bearbeiten",
-    "EDIT_GOTO": "Bearbeiten Gehe zu",
-    "EDIT_NOOP": "Bearbeiten Noop",
-    "EDIT_GOTOIF": "Bearbeiten Gotoif",
+    "EDIT_AGENT": "Agenteb bearbeiten",
+    "EDIT_GOTO": "Gehe zu bearbeiten",
+    "EDIT_NOOP": "Noop bearbeiten",
+    "EDIT_GOTOIF": "GoToIf bearbeiten",
     "EDIT_QUEUE": "Warteschlange bearbeiten",
-    "CONDITION": "Zustand",
+    "CONDITION": "Bedingung",
     "TRUEPRIORITY": "Wahre Priorität",
     "FALSEPRIORITY": "Falsche Priorität",
     "VALUE": "Wert",
     "PRIORITY": "Priorität",
     "AGENT_TIMEOUT": "Agent Timeout",
     "DESCRIPTION": "Beschreibung",
-    "ADD_OPENCHANNELQUEUE": "Fügen Sie im Offenen Kanal Warteschlange",
-    "EDIT_OPENCHANNELQUEUE": "Offener Kanal Warteschlange bearbeiten",
-    "DELETE_OPENCHANNELQUEUE": "Löschen der Warteschlange im Offenen Kanal",
-    "PENALTY": "Strafe",
+    "ADD_OPENCHANNELQUEUE": "Warteschlange offener Kanal hinzufügen",
+    "EDIT_OPENCHANNELQUEUE": "Warteschlange offener Kanal bearbeiten",
+    "DELETE_OPENCHANNELQUEUE": "Warteschlange offener Kanal löschen",
+    "PENALTY": "Verzögerung",
     "TEAMADD_OPENCHANNELQUEUE": "Team zur Warteschlange hinzufügen",
-    "AGENTADD_OPENCHANNELQUEUE": "Agent zur Warteschlange hinzufügen",
+    "AGENTADD_OPENCHANNELQUEUE": "Agenten zur Warteschlange hinzufügen",
     "ALL_AGENTS": "Alle Agenten",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
     "CREATED_AT": "Erstellt am",
     "SAVE": "Speichern",
     "SETTINGS": "Einstellungen",
     "GENERAL": "Allgemein",
-    "OPENCHANNELACCOUNTS": "Offener Kanal Konten",
+    "OPENCHANNELACCOUNTS": "Konten offener Kanal",
     "MOTIONADDRESS": "Motion Adresse",
-    "ADD_OPENCHANNELACCOUNT": "Öffnen Sie den Channel Account hinzufügen",
-    "EDIT_OPENCHANNELACCOUNT": "Öffnen Sie den Channel Account bearbeiten",
-    "DELETE_OPENCHANNELACCOUNT": "Öffnen Sie den Channel Account löschen.",
+    "ADD_OPENCHANNELACCOUNT": "Konto offener Kanal hinzufügen",
+    "EDIT_OPENCHANNELACCOUNT": "Konto offener Kanal bearbeiten",
+    "DELETE_OPENCHANNELACCOUNT": "Konto offener Kanal löschen",
     "API": "API",
-    "DISPOSITIONS": "Bestimmungen",
+    "DISPOSITIONS": "Qualifizierungen",
     "WEBHOOKS": "WebHooks",
     "ACTIONS": "Aktionen",
     "LIST": "Liste",
     "FIDELITY": "Treue",
     "ACCEPT": "Akzeptieren",
-    "ACCEPTMETHOD": "Die Methode",
+    "ACCEPTMETHOD": "Methode akzeptieren",
     "ACCEPTURL": "URL akzeptieren",
     "REJECT": "Ablehnen",
     "REJECTMETHOD": "Methode ablehnen",
     "REJECTURL": "URL ablehnen",
-    "CLOSE": "In der Nähe",
-    "CLOSEMETHOD": "In der Nähe Methode",
-    "CLOSEURL": "Der URL",
-    "SELECTED": "Ausgewählte",
+    "CLOSE": "Schließen",
+    "CLOSEMETHOD": "Methode schließen",
+    "CLOSEURL": "URL schließen",
+    "SELECTED": "Ausgewählt",
     "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
+    "SELECT_NONE": "Nichts auswählen",
     "BACK": "Zurück",
     "OPENCHANNEL": "Offener Kanal",
-    "ID": "Id",
+    "ID": "ID",
     "TIMEOUT": "Timeout",
-    "OPENCHANNELDISPOSITIONS": "Offener Kanal Verfügungen",
-    "NO_OPENCHANNELDISPOSITION_AVAILABLE": "Keine offenen Kanal Dispositionen verfügbar",
-    "NEW_OPENCHANNELDISPOSITION": "Neue Offene Kanal inspektion",
-    "ADD_OPENCHANNELDISPOSITION": "Fügen Sie im Offenen Kanal inspektion",
-    "EDIT_OPENCHANNELDISPOSITION": "Bearbeiten Sie im Offenen Kanal inspektion",
-    "DELETE_OPENCHANNELDISPOSITION": "Löschen Sie im Offenen Kanal inspektion",
-    "NEW_OPENCHANNELQUEUE": "Neue Offene Kanal Warteschlange",
-    "NEW_OPENCHANNELACCOUNT": "Neue Open Channel Account",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
-    "ALL_TEAMS": "Alle Mannschaften",
+    "OPENCHANNELDISPOSITIONS": "Qualifizierungen offener Kanal",
+    "NO_OPENCHANNELDISPOSITION_AVAILABLE": "Keine Qualifizierungen verfügbar",
+    "NEW_OPENCHANNELDISPOSITION": "Neue Qualifizierung",
+    "ADD_OPENCHANNELDISPOSITION": "Qualifizierung offener Kanal hinzufügen",
+    "EDIT_OPENCHANNELDISPOSITION": "Qualifizierung bearbeiten",
+    "DELETE_OPENCHANNELDISPOSITION": "Qualifizierung löschen",
+    "NEW_OPENCHANNELQUEUE": "Neue Warteschlange offener Kanal",
+    "NEW_OPENCHANNELACCOUNT": "Neues Konto offener Kanal",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
+    "ALL_TEAMS": "Alle Teams",
     "SELECTED_TEAMS": "Ausgewählte Teams",
     "REPLYURI": "Antwort URL",
     "RECEIVEURI": "Erhalten URL",
     "HELP": {
-      "RECEIVEURI": "Dies ist die automatisch generierte API-String müssen Sie die Nachrichten in Ihrem offenen Kanal zu erhalten von der externen Anwendung (POST-Methode verwendet werden muss). Drücken Sie die Zwischenablage, um Sie in die Zwischenablage zu kopieren.",
-      "REPLYURI": "Dies ist die URL der Offene Kanal wird beim Senden oder Beantworten von Nachrichten",
+      "RECEIVEURI": "Automatisch generierter API-String, um die Nachrichten über den offenen Kanal zu erhalten (POST-Methode). Zum Kopieren in die Zwischenablage klicken",
+      "REPLYURI": "URL des offenen Kanals zum Senden und Empfangen von Nachrichten",
       "NAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
       "LIST": "Contact Manager Liste zu verknüpfen von Kontakten",
       "TOKEN": "Fügen Sie diese Eigenschaft als Abfragezeichenfolge in Ihrer Web-Service-URL hinzu. Weitere Informationen finden Sie im Dokument doc <a target = \"_ blank\" href = \"https://wiki.xcallymotion.com/display/XMV/New Channels Configuration Steps",
-      "MANDATORYDISPOSITION": "Zwingende Disposition",
-      "MANDATORYDISPOSITIONPAUSEID": "Pause zur Verwendung, wenn die obligatorische Disposition aktiviert ist",
-      "WELCOMEMESSAGE": "Dies ist die erste Nachricht, die an das Schütz gesendet wird"
+      "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+      "MANDATORYDISPOSITIONPAUSEID": "PausenID bei erforderlicher Qualifizierung",
+      "WELCOMEMESSAGE": "Willkommensnachricht beim Eintreffen der ersten Anfrage"
     },
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
+    "OF": "von",
     "CONTACT": "Kontakt",
-    "STARTEDAT": "Gestartet am",
+    "STARTEDAT": "Startdatum",
     "STATUS": "Status",
     "CLOSED": "Geschlossen",
-    "OPENED": "Öffnen",
+    "OPENED": "Geöffnet",
     "OPEN": "Öffnen",
     "ACCOUNT": "Konto",
     "INTERACTION": "Interaktion",
-    "INTERACTIONS": "Wechselwirkungen",
+    "INTERACTIONS": "Interaktionen",
     "ALL": "Alle",
-    "SELECT_STATUS": "Wählen Sie einen Status",
+    "SELECT_STATUS": "Status auswählen",
     "FILTER": "Filter",
     "FILTERS": "Filter",
     "CLOSEDAT": "Geschlossen",
-    "DISPOSITION": "Disposition",
-    "NOTES": "Hinweise",
-    "NO_INTERACTION_AVAILABLE": "Es sind keine Wechselwirkungen zur Verfügung",
-    "SELECT_ACCOUNT": "Wählen Sie ein Konto",
+    "DISPOSITION": "Qualifizierung",
+    "NOTES": "Anmerkungen",
+    "NO_INTERACTION_AVAILABLE": "Keine neuen Interaktionen verfügbar",
+    "SELECT_ACCOUNT": "Konto auswählen",
     "GOTOP": "Gotop",
     "EDIT_GOTOP": "Gotop bearbeiten",
-    "EDIT_CLOSE": "Bearbeiten Schließen",
-    "INFO": "Info",
+    "EDIT_CLOSE": "Bearbeitung abschließen",
+    "INFO": "Information",
     "KEY": "Schlüssel",
     "REALTIME": "Echtzeit",
     "UNKNOWN": "Unbekannt",
-    "UNREGISTERED": "Unregistrierte",
+    "UNREGISTERED": "Nicht registriert",
     "UNAVAILABLE": "Nicht verfügbar",
-    "NOT_INUSE": "Nicht in Gebrauch",
+    "NOT_INUSE": "Nicht in Verwendung",
     "REACHABLE": "Erreichbar",
-    "IN_USE": "Im Einsatz",
+    "IN_USE": "In Verwendung",
     "AGENTS": "Agenten",
     "QUEUES": "Warteschlangen",
-    "FULLNAME": "Fullname",
-    "INTERNAL": "Interne",
+    "FULLNAME": "Vollständiger Name",
+    "INTERNAL": "Intern",
     "PHONE_STATE": "Telefonstatus",
     "PHONE_STATUS": "Telefonstatus",
     "PAUSE": "Pause",
     "LOGOUT": "An-/Abmelden",
-    "AGENTADD_QUEUE": "Agent zu Offenen Kanal Warteschlange hinzufügen",
+    "AGENTADD_QUEUE": "Agenten zur Warteschlange offener Kanal hinzufügen",
     "UNPAUSE": "Pause beenden",
     "DEFAULT_PAUSE": "Standard Pause",
     "LOGGED_IN": "Angemeldet",
     "PAUSED": "Angehalten",
     "READY": "Bereit",
-    "WAITING": "Warten",
-    "VOICE": "Voice",
+    "WAITING": "Wartezustand",
+    "VOICE": "Anrufe",
     "CHAT": "Chat",
     "MAIL": "E-Mail",
     "SMS": "SMS",
     "FAX": "Fax",
-    "AGENTSADD_QUEUE": "Agenten, die Offenen Kanal Warteschlange hinzufügen",
+    "AGENTSADD_QUEUE": "Agenten zur Warteschlange offener Kanal hinzufügen",
     "NO_AGENT_ONLINE": "Kein Agent Online",
-    "GOTOREALTIME_OPENCHANNELQUEUE": "In Echtzeit, offenen Kanal Warteschlange",
-    "PARTIALPAUSE": "Lastschriftzahlung teilweise Pause",
+    "GOTOREALTIME_OPENCHANNELQUEUE": "Zum offener Kanal Echtzeitmonitoring",
+    "PARTIALPAUSE": "Teilpause",
     "BUSY": "Besetzt",
     "TIMER": "Timer",
     "IDLE": "Leerlauf",
     "CAPACITY": "Kapazität",
     "TAGS": "Tags",
-    "SPYINTERACTION": "Spy",
-    "INTERACTIONS_OPENCHANNELACCOUNT": "Zu Wechselwirkungen gehen",
-    "REFRESH_INTERACTIONS": "Aktualisieren Interaktionen",
+    "SPYINTERACTION": "Mithören",
+    "INTERACTIONS_OPENCHANNELACCOUNT": "Zu Interaktionen gehen",
+    "REFRESH_INTERACTIONS": "Interaktionen aktualisieren",
     "DELETE": "Löschen",
-    "NO_OPENCHANNELCANNEDANSWER_AVAILABLE": "Keine vordefinierten Antworten verfügbar",
-    "NEW_OPENCHANNELCANNEDANSWER": "Neue vordefinierte Antwort",
-    "ADD_OPENCHANNELCANNEDANSWER": "Vordefinierte Antwort hinzufügen",
-    "EDIT_OPENCHANNELCANNEDANSWER": "Vordefinierte Antwort bearbeiten",
-    "DELETE_OPENCHANNELCANNEDANSWER": "Vordefinierte Antwort löschen",
-    "DELIVERYREPORTURL": "Zustellungsbericht-URL",
+    "NO_OPENCHANNELCANNEDANSWER_AVAILABLE": "Keine Textvorlagen verfügbar",
+    "NEW_OPENCHANNELCANNEDANSWER": "Neue Textvorlage",
+    "ADD_OPENCHANNELCANNEDANSWER": "Textvorlage hinzufügen",
+    "EDIT_OPENCHANNELCANNEDANSWER": "Textvorlage bearbeiten",
+    "DELETE_OPENCHANNELCANNEDANSWER": "Textvorlage löschen",
+    "DELIVERYREPORTURL": "URL für Zustellungsbericht",
     "DELETE_INTERACTION": "Interaktion löschen",
-    "COMMAND": "Befehl",
+    "COMMAND": "Eingabe",
     "EDIT_SYSTEM": "System bearbeiten",
     "SYSTEM": "System",
     "VARIABLE": "Variable",
     "NOTIFICATION": "Benachrichtigung",
-    "NOTIFICATIONSHAKE": "Shake",
-    "NOTIFICATIONSOUND": "Klingen",
+    "NOTIFICATIONSHAKE": "Schütteln",
+    "NOTIFICATIONSOUND": "Klingeln",
     "NOTIFICATIONTEMPLATE": "Vorlage",
-    "INSERT_MESSAGE_HERE": "Fügen Sie hier Ihre Textnachricht ein",
+    "INSERT_MESSAGE_HERE": "Textnachricht hier eingeben",
     "WAITFORTHEASSIGNEDAGENT": "Warte auf den zugewiesenen Agenten",
-    "ADVANCED": "Fortgeschritten",
+    "ADVANCED": "Erweitert",
     "PROXY": "Proxy",
-    "TOKEN": "Zeichen",
+    "TOKEN": "Token",
     "EDIT_TAG": "Tag bearbeiten",
-    "TAG": "Etikett",
-    "AGENTADD_OPENCHANNELACCOUNT": "Fügen Sie Agent zu Openchannel Account hinzu",
-    "CANNED_ANSWER_NOT_FOUND": "Es wurden keine vordefinierten Antworten gefunden",
-    "CANNED_ANSWER_SEARCH": "Geben Sie einen Text ein, um eine vordefinierte Antwort zu suchen",
-    "MAPKEY": "Karten Schlüssel",
+    "TAG": "Tag",
+    "AGENTADD_OPENCHANNELACCOUNT": "Konto offener Kanal hinzufügen",
+    "CANNED_ANSWER_NOT_FOUND": "Keine Textvorlagen gefunden",
+    "CANNED_ANSWER_SEARCH": "Nach Textvorlagen suchen",
+    "MAPKEY": "MAP-KEY",
     "SEND": "Senden",
-    "TO": "Zu",
-    "AGENTTRANSFER": "Agent Transfer",
+    "TO": "An",
+    "AGENTTRANSFER": "Weiterleitung Agent",
     "AGENTTRANSFERTIMEOUT": "Zeitüberschreitung für Agententransfer",
-    "QUEUETRANSFER": "Warteschlangenübertragung",
-    "QUEUETRANSFERTIMEOUT": "Warteschlangenübertragungs-Timeout",
-    "TRANSFER": "Transfer",
-    "CANNEDANSWERS": "Vordefinierte Antworten",
+    "QUEUETRANSFER": "Weiterleitung Warteschlange",
+    "QUEUETRANSFERTIMEOUT": "Zeitüberschreitung für Warteschlangentransfer",
+    "TRANSFER": "Weiterleitung",
+    "CANNEDANSWERS": "Textvorlagen",
     "DOWNLOAD_INTERACTION": "Herunterladen",
-    "OPENCHANNELCANNEDANSWERS": "Vordefinierte Antworten",
-    "LOGIN_TIME": "Login-Zeit",
-    "PAUSE_TIME": "Pausenzeit",
-    "TEAMS_ASSOCIATION": "Vereinigung der Mannschaften",
-    "MANDATORYDISPOSITION": "Zwingende Disposition",
-    "MANDATORYDISPOSITIONPAUSEID": "Pause zur Verwendung, wenn die obligatorische Disposition aktiviert ist",
-    "DIALOGFLOW": "Dialogablauf",
-    "EDIT_DIALOGFLOW": "Bearbeiten Sie die Dialogflow-Konfiguration",
+    "OPENCHANNELCANNEDANSWERS": "Textvorlagen offener Kanal",
+    "LOGIN_TIME": "Zeit angemeldet",
+    "PAUSE_TIME": "Zeit in Pause",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
+    "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+    "MANDATORYDISPOSITIONPAUSEID": "Qualifizierung pausieren, sofern sonst erforderlich",
+    "DIALOGFLOW": "DialogFlow",
+    "EDIT_DIALOGFLOW": "DialogFlow bearbeiten",
     "LANGUAGE": "Sprache",
-    "WELCOMEMESSAGE": "Willkommen Messsage",
+    "WELCOMEMESSAGE": "Willkommensnachricht",
     "ACCESSKEYID": "Zugangsschlüssel-ID",
     "AMAZONLEX": "AmazonLex",
-    "BOTNAME": "Bot-Name",
-    "EDIT_AMAZONLEX": "Bearbeiten Sie die Lex-Konfiguration",
-    "LEXREGION": "Region",
-    "SECRETACCESSKEY": "Zugangsschlüssel geheim",
-    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme verfügbar",
+    "BOTNAME": "Botname",
+    "EDIT_AMAZONLEX": "Lex-Konfiguration bearbeiten",
+    "LEXREGION": "Lex Region",
+    "SECRETACCESSKEY": "Geheimer Schlüssel",
+    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme angehalten",
     "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
-    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download ohne Anhänge",
-    "DOWNLOAD_WITH_ATTACHMENTS": "Mit Anhängen herunterladen",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Herunterlagen ohne Anhänge",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Herunterlagen inkl. Anhänge",
     "LASTMESSAGE": "Letzte Nachricht",
-    "CLIENTEMAIL": "Kunden-E-Mail",
+    "CLIENTEMAIL": "Kunden E-Mail",
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Dialogflow V2 bearbeiten",
-    "PRIVATEKEY": "Privat Schlüssel",
+    "PRIVATEKEY": "Privater Schlüssel",
     "PROJECTID": "Projekt-ID",
     "ADD_NOTE": "Notiz hinzufügen",
-    "NOTE": "Hinweis"
+    "NOTE": "Notiz"
   }
 }
diff --git a/public/app/main/apps/openchannel/i18n/hu.json b/public/app/main/apps/openchannel/i18n/hu.json
new file mode 100644
index 0000000..8093eec
--- /dev/null
+++ b/public/app/main/apps/openchannel/i18n/hu.json
@@ -0,0 +1,271 @@
+{
+  "OPENCHANNEL": {
+    "EDIT_DIALOGFLOWV2": "Edit Dialogflow V2",
+    "DIALOGFLOWV2": "Dialogflow V2",
+    "PRIVATEKEY": "Private Key",
+    "CLIENTEMAIL": "Client Email",
+    "PROJECTID": "Project ID",
+    "AMAZONLEX": "AmazonLex",
+    "EDIT_AMAZONLEX": "Edit Lex configuration",
+    "ACCESSKEYID": "Access key ID",
+    "SECRETACCESSKEY": "Access key secret",
+    "LEXREGION": "Region",
+    "BOTNAME": "Bot name",
+    "WELCOMEMESSAGE": "Welcome message",
+    "DIALOGFLOW": "Dialogflow",
+    "EDIT_DIALOGFLOW": "Edit Dialogflow configuration",
+    "LANGUAGE": "Language",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "DOWNLOAD_INTERACTION": "Download",
+    "TRANSFER": "Transfer",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "TAG": "Tag",
+    "EDIT_TAG": "Edit Tag",
+    "ADVANCED": "Advanced",
+    "PROXY": "Proxy",
+    "TOKEN": "Token",
+    "ADD_NOTE": "Add note",
+    "NOTE": "Note",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "INSERT_MESSAGE_HERE": "Insert your text message here",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "SYSTEM": "System",
+    "EDIT_SYSTEM": "Edit System",
+    "COMMAND": "Command",
+    "VARIABLE": "Variable",
+    "DELETE": "Delete",
+    "CANNEDANSWERS": "Canned Answers",
+    "OPENCHANNELCANNEDANSWERS": "Canned Answers",
+    "NO_OPENCHANNELCANNEDANSWER_AVAILABLE": "No Canned Answers Available",
+    "NEW_OPENCHANNELCANNEDANSWER": "New Canned Answer",
+    "ADD_OPENCHANNELCANNEDANSWER": "Add Canned Answer",
+    "EDIT_OPENCHANNELCANNEDANSWER": "Edit",
+    "DELETE_OPENCHANNELCANNEDANSWER": "Delete",
+    "DELIVERYREPORTURL": "Delivery Report URL",
+    "TAGS": "Tags",
+    "SPYINTERACTION": "Spy",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "GOTOREALTIME_OPENCHANNELQUEUE": "Go To Realtime Open Channel Queue",
+    "PARTIALPAUSE": "Parital Pause",
+    "BUSY": "Busy",
+    "TIMER": "Timer",
+    "IDLE": "Idle",
+    "CAPACITY": "Capacity",
+    "REALTIME": "Realtime",
+    "TEXT": "Text",
+    "TIMES": "Number of times per interaction",
+    "EDIT_AUTOREPLY": "Edit Auto Reply",
+    "AUTOREPLY": "Auto Reply",
+    "NAME": "Name",
+    "OPENCHANNELQUEUES": "Open Channel Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled",
+    "ERRORS": {
+      "PROJECTID_REQUIRED": "Mandatory Field",
+      "CLIENTEMAIL_REQUIRED": "Mandatory Field",
+      "PRIVATEKEY_REQUIRED": "Mandatory Field",
+      "ACCESSKEYID_REQUIRED": "Access key ID is required",
+      "SECRETACCESSKEY_REQUIRED": "Access key secret is required",
+      "BOTNAME_REQUIRED": "Bot name is required",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "KEY_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "TEXT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "TEXT_REQUIRED": "The field text is required",
+      "NAME_REQUIRED": "Mandatory field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory field",
+      "MOTIONADDRESS_REQUIRED": "Mandatory field",
+      "MOTIONADDRESS_MUST_VALID_URL": "Wrong format",
+      "ACCEPTURL_MUST_VALID_URL": "Wrong format",
+      "TIMEOUT_REQUIRED": "Mandatory field",
+      "REJECTURL_MUST_VALID_URL": "Wrong format",
+      "CLOSEURL_MUST_VALID_URL": "Wrong format",
+      "REPLYURI_REQUIRED": "Mandatory field",
+      "REPLYURI_MUST_VALID_URL": "Wrong format",
+      "PRIORITY_REQUIRED": "Mandatory field",
+      "CONDITION_REQUIRED": "Mandatory field",
+      "TRUEPRIORITY_REQUIRED": "Mandatory field",
+      "FALSEPRIORITY_REQUIRED": "Mandatory field",
+      "AGENT_REQUIRED": "Mandatory field",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "DISPOSITION_REQUIRED": "Mandatory field",
+      "QUEUE_REQUIRED": "Mandatory field",
+      "KEY_MAX_LENGTH": "Key must have a maximum length equal to {{max}}",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field"
+    },
+    "STRATEGY": "Strategy",
+    "AGENT": "Agent",
+    "GOTO": "Goto",
+    "GOTOIF": "Gotoif",
+    "NOOP": "Noop",
+    "QUEUE": "Queue",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_GOTO": "Edit Goto",
+    "EDIT_NOOP": "Edit Noop",
+    "EDIT_GOTOIF": "Edit Gotoif",
+    "EDIT_QUEUE": "Edit Queue",
+    "CONDITION": "Condition",
+    "TRUEPRIORITY": "True Priority",
+    "FALSEPRIORITY": "False Priority",
+    "VALUE": "Value",
+    "PRIORITY": "Priority",
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "DESCRIPTION": "Description",
+    "ADD_OPENCHANNELQUEUE": "Add Open Channel Queue",
+    "EDIT_OPENCHANNELQUEUE": "Edit Open Channel Queue",
+    "DELETE_OPENCHANNELQUEUE": "Delete Open Channel Queue",
+    "PENALTY": "Penalty",
+    "TEAMADD_OPENCHANNELQUEUE": "Add Team To Open Channel Queue",
+    "AGENTADD_OPENCHANNELQUEUE": "Add Agent To Open Channel Queue",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "OPENCHANNELACCOUNTS": "Open Channel Accounts",
+    "MOTIONADDRESS": "Motion Address",
+    "ADD_OPENCHANNELACCOUNT": "Add Open Channel Account",
+    "EDIT_OPENCHANNELACCOUNT": "Edit Open Channel Account",
+    "DELETE_OPENCHANNELACCOUNT": "Delete Open Channel Account",
+    "API": "API",
+    "DISPOSITIONS": "Dispositions",
+    "WEBHOOKS": "WebHooks",
+    "ACTIONS": "Actions",
+    "LIST": "List",
+    "FIDELITY": "Fidelity",
+    "ACCEPT": "Accept",
+    "ACCEPTMETHOD": "Accept Method",
+    "ACCEPTURL": "Accept URL",
+    "REJECT": "Reject",
+    "REJECTMETHOD": "Reject Method",
+    "REJECTURL": "Reject URL",
+    "CLOSE": "Close",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "BACK": "Back",
+    "OPENCHANNEL": "Open Channel",
+    "ID": "Id",
+    "TIMEOUT": "Timeout",
+    "OPENCHANNELDISPOSITIONS": "Open Channel Dispositions",
+    "NO_OPENCHANNELDISPOSITION_AVAILABLE": "No Open Channel Dispositions available",
+    "NEW_OPENCHANNELDISPOSITION": "New Open Channel Disposition",
+    "ADD_OPENCHANNELDISPOSITION": "Add Open Channel Disposition",
+    "EDIT_OPENCHANNELDISPOSITION": "Edit Open Channel Disposition",
+    "DELETE_OPENCHANNELDISPOSITION": "Delete Open Channel Disposition",
+    "NEW_OPENCHANNELQUEUE": "New Open channel Queue",
+    "NEW_OPENCHANNELACCOUNT": "New Open channel Account",
+    "NO_AVAILABLE_INFO": "No available info",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "REPLYURI": "Reply URL",
+    "RECEIVEURI": "Receive URL",
+    "HELP": {
+      "WELCOMEMESSAGE": "This is the first response message sent to new interactions.",
+      "TOKEN": "Add this property as query string in your Web Service URL. For more details see the doc <a target=\"_blank\" href=\"https://wiki.xcallymotion.com/display/XMV/New+Channels+Configuration+Steps#NewChannelsConfigurationSteps-BuildyourownChannelservice\">here</a>",
+      "RECEIVEURI": "Auto-generated API string to be used in order to receive messages inside your open channel from the external application (using POST method). Click the clipboard button to copy it ",
+      "REPLYURI": "The URL the open channel will call when sending or replying to a message. For more details see the doc <a target=\"_blank\" href=\"https://wiki.xcallymotion.com/display/XMV/New+Channels+Configuration+Steps#NewChannelsConfigurationSteps-BuildyourownChannelservice\">here</a>",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "LIST": "Contact Manager List used to associate contacts",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause to use if mandatory disposition is enabled"
+    },
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "CONTACT": "Contact",
+    "STARTEDAT": "Started At",
+    "LASTMESSAGE": "Last message",
+    "STATUS": "Status",
+    "CLOSED": "Closed",
+    "OPENED": "Open",
+    "OPEN": "Open",
+    "ACCOUNT": "Account",
+    "INTERACTION": "Interaction",
+    "INTERACTIONS": "Interactions",
+    "ALL": "All",
+    "SELECT_STATUS": "Select a status",
+    "FILTER": "Filter",
+    "FILTERS": "Filters",
+    "CLOSEDAT": "Closed At",
+    "DISPOSITION": "Disposition",
+    "NOTES": "Notes",
+    "NO_INTERACTION_AVAILABLE": "No interactions available",
+    "SELECT_ACCOUNT": "Select an account",
+    "GOTOP": "Gotop",
+    "EDIT_GOTOP": "Edit Gotop",
+    "EDIT_CLOSE": "Edit Close",
+    "INFO": "Info",
+    "KEY": "Key",
+    "UNKNOWN": "Unknown",
+    "UNREGISTERED": "Unregistered",
+    "UNAVAILABLE": "Unavailable",
+    "NOT_INUSE": "Not in use",
+    "REACHABLE": "Reachable",
+    "IN_USE": "In use",
+    "AGENTS": "Agents",
+    "QUEUES": "Queues",
+    "FULLNAME": "Fullname",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "PAUSE": "Pause",
+    "LOGOUT": "Logout",
+    "AGENTADD_QUEUE": "Add Agent To Open Channel Queue",
+    "UNPAUSE": "End Pause",
+    "DEFAULT_PAUSE": "Default pause",
+    "LOGGED_IN": "Logged in",
+    "PAUSED": "Paused",
+    "READY": "Ready",
+    "WAITING": "Waiting",
+    "VOICE": "Voice",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "SMS",
+    "FAX": "Fax",
+    "AGENTSADD_QUEUE": "Add agents to Open Channel queue",
+    "INTERACTIONS_OPENCHANNELACCOUNT": "Go to Interactions",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "AGENTADD_OPENCHANNELACCOUNT": "Add Agent to Openchannel Account",
+    "CANNED_ANSWER_SEARCH": "Enter a text to seach a Canned Answer",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answer were found",
+    "SEND": "Send",
+    "TO": "To",
+    "MAPKEY": "Map Key",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download with attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download without attachments"
+  }
+}
diff --git a/public/app/main/apps/plugins/i18n/hu.json b/public/app/main/apps/plugins/i18n/hu.json
new file mode 100644
index 0000000..be8be0f
--- /dev/null
+++ b/public/app/main/apps/plugins/i18n/hu.json
@@ -0,0 +1,7 @@
+{
+  "PLUGINS": {
+    "PLUGINS": "Plugins",
+    "ERRORS": {},
+    "HELP": {}
+  }
+}
diff --git a/public/app/main/apps/settings/i18n/de.json b/public/app/main/apps/settings/i18n/de.json
index 9f425b0..5d71896 100644
--- a/public/app/main/apps/settings/i18n/de.json
+++ b/public/app/main/apps/settings/i18n/de.json
@@ -17,8 +17,8 @@
     "MOUNT_POINT": "Berg",
     "AVG_LOAD": "AVG Laden",
     "TOTAL": "Gesamt",
-    "USED": "Verwendet",
-    "FREE": "Kostenlos",
+    "USED": "in Verwendung",
+    "FREE": "Frei",
     "NAME": "Name",
     "STATE": "Zustand",
     "CHAT": "Chat",
diff --git a/public/app/main/apps/settings/i18n/en.json b/public/app/main/apps/settings/i18n/en.json
index aa1bc8a..a6d2db4 100644
--- a/public/app/main/apps/settings/i18n/en.json
+++ b/public/app/main/apps/settings/i18n/en.json
@@ -17,6 +17,12 @@
     "SPLITSIZEPDF": "Split report size [PDF records]",
     "SPLITSIZEXLSX": "Split report size [XLSX records]",
     "ENABLEEMAILPREVIEW": "Enable Email Preview",
+    "COPY_LICENSE": "Copy token to clipboard",
+    "DOWNLOAD_LICENSE_LOG_FILE": "Download license log file",
+    "LICENSE_LOG_FILE": "License log file",
+    "LICENSE_LOG_FILE_DOWNLOADED": "License log file downloaded!",
+    "CLIPBOARD": "Clipboard",
+    "COPIED_TO_CLIPBOARD": "Token copied to clipboard",
     "JAWS": "Jaws",
     "MOTIONBAR": "Motionbar",
     "MOTIONBARAUTOUPDATER": "Auto Updater",
@@ -28,6 +34,7 @@
     "TURN_PASSWORD": "TURN Password",
     "WEBRTC": "WebRTC",
     "CALLYSQUARE": "Cally Square",
+    "PREVIEW_RECALLME_REMINDER_INTERVAL": "Preview Recallme Reminder Interval",
     "ENABLED": "Enabled",
     "DISABLED": "Disabled",
     "UNLIMITED_CHANNELS": "Unlimited Channels",
@@ -200,6 +207,20 @@
     "SMS_INTERACTIONS_RELOAD_TIMEOUT": "SMS interactions reload timeout",
     "WHATSAPP_INTERACTIONS_RELOAD_TIMEOUT": "WhatsApp Connector interactions reload timeout",
     "STOP_RECORDING_ON_VOICE_CALL_TRANSFER": "Stop recording on voice call transfer",
+    "DISABLED_COOKIE": "Cookies banner",
+    "AD_SSO_ENABLED": "Active Directory SSO Enabled",
+    "CLOUD_PROVIDERS": "Cloud Providers",
+    "APPLICATION_ID": "Application Id",
+    "TENANT_ID": "Tenant Id",
+    "CLIENT_SECRET": "Client Secret",
+    "NEW_CLIENT_SECRET": "New Client Secret",
+    "REDIRECT_URI": "Redirect URI",
+    "REMOTE_URI": "Remote URI",
+    "AUTHENTICATE": "Authenticate",
+    "AUTHENTICATE_TO_MICROSOFT_IDENTITY_PLATFORM": "Authenticate to Microsoft Identity Platform",
+    "MICROSOFT_AUTHENTICATION_SUCCESS": "Authentication to the Microsoft Identity Platform completed successfully",
+    "MICROSOFT_AUTHENTICATION_FAIL": "Something went wrong while authenticating to the Microsoft Identity Platform",
+    "UPDATE_CLIENT_SECRET": "Update Client Secret",
     "HELP": {
       "DEFAULTSCREENRECORDINGPATH": "Enter the path where to store screen recording files on the Agent computer (leave empty for default Video Folder path)",
       "RTLSUPPORT": "Enables the RTL Support for Arabic, Persian and Hebrew languages",
@@ -214,11 +235,14 @@
       "LOGINMAILFREQUENCY": "Please remember to restart the EMAIL service each time this parameter has been changed",
       "USERNAME": "Username",
       "PASSWORD": "Password",
+      "PREVIEW_RECALLME_REMINDER_INTERVAL": "Time interval in minutes before which notification will be sent to agent informing him about preview recall to be made",
       "ENFORCE_PASSWORD_HISTORY": "Enables the validation against previously used passwords",
       "PASSWORD_HISTORY_LIMIT": "Number of last used unique passwords to check",
       "PRIVACY_POLICY": "Number of characters that will be replaced with an asterisk (*) (0 = all characters)",
       "SEARCH_ON_ENTER_KEY": "Start searching only after the agent hits the Enter key",
-      "INTERACTIONS_RELOAD_TIMEOUT": "Time interval in seconds after which interactions are reloaded (0 = real-time update)"
+      "INTERACTIONS_RELOAD_TIMEOUT": "Time interval in seconds after which interactions are reloaded (0 = real-time update)",
+      "CLIENT_SECRET": "The secret will no longer be visible once the configuration is saved. Store it safely if you want to use it elsewhere.",
+      "LIMIT_TABS": "Maximum number of open tabs reached"
     },
     "ERRORS": {
       "CHATTIMEOUT_REQUIRED": "Mandatory field",
@@ -239,6 +263,7 @@
       "PASSWORD_REQUIRED": "Mandatory field",
       "SMTP_HOST_REQUIRED": "Mandatory field",
       "SMTP_PORT_REQUIRED": "Mandatory field",
+      "PREVIEW_RECALLME_REMINDER_INTERVAL_REQUIRED": "Mandatory field",
       "MIN_INTERNAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
       "MIN_MAILBOX_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
       "PAGE_TITLE_REQUIRED": "Mandatory field",
@@ -260,7 +285,23 @@
       "TRANSCRIBEACCOUNT_REQUIRED": "Mandatory field",
       "SENTIMENTREGION_REQUIRED": "Mandatory field",
       "SENTIMENTACCOUNT_REQUIRED": "Mandatory field",
-      "USERNAME_REQUIRED": "Mandatory field"
+      "USERNAME_REQUIRED": "Mandatory field",
+      "FIELD_REQUIRED": "Mandatory field",
+      "WRONG_FORMAT": "Wrong format"
+    },
+    "NOTIFICATIONS": {
+      "MICROSOFT_AUTHENTICATION_SUCCESS": "Authentication to the Microsoft Identity Platform completed successfully",
+      "MICROSOFT_AUTHENTICATION_FAIL": "Something went wrong while authenticating to the Microsoft Identity Platform",
+      "CLOUD_PROVIDER_CREATED_SUCCESS_TITLE": "Cloud Provider successfully created",
+      "CLOUD_PROVIDER_SAVED_SUCCESS_TITLE": "Cloud Provider successfully saved",
+      "CLOUD_PROVIDER_DELETE_TITLE": "Are you sure want to delete the cloud provider?",
+      "CLOUD_PROVIDER_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "CLOUD_PROVIDER_DELETED_SUCCESS_TITLE": "Cloud Provider successfully deleted",
+      "CLOUD_PROVIDERS_DELETE_TITLE": "Are you sure want to delete the selected cloud providers?",
+      "CLOUD_PROVIDERS_DELETE_MESSAGE": "{{ total }} cloud providers will be deleted",
+      "CLOUD_PROVIDERS_DELETED_SUCCESS_TITLE": "Cloud Providers successfully deleted",
+      "SMTP_SAVED_SUCCESS_TITLE": "SMTP configuration successfully saved",
+      "CLOUD_PROVIDER_SECRET_UPDATE_SUCCESS_TITLE": "Client Secret successfully updated"
     }
   }
 }
diff --git a/public/app/main/apps/settings/i18n/hu.json b/public/app/main/apps/settings/i18n/hu.json
new file mode 100644
index 0000000..aa1bc8a
--- /dev/null
+++ b/public/app/main/apps/settings/i18n/hu.json
@@ -0,0 +1,266 @@
+{
+  "SETTINGS": {
+    "RTLSUPPORT": "RTL Support",
+    "PREFERRED": "Preferred Logo",
+    "DEFAULT_PREFERRED": "Default Preferred Logo",
+    "FAVICON": "Favicon",
+    "DEFAULT_FAVICON": "Default Favicon",
+    "MOTIONBARREMEMBERME": "Remember Me",
+    "CHATTIMEOUT": "Chat closing interaction timeout",
+    "VIRTUAL": "Chat",
+    "VOICE": "Voice",
+    "SESSIONS": "Sessions",
+    "ADDONS": "Add-ons",
+    "REPORT": "Report",
+    "SPLIT": "Split report",
+    "SPLITSIZECSV": "Split report size [CSV records]",
+    "SPLITSIZEPDF": "Split report size [PDF records]",
+    "SPLITSIZEXLSX": "Split report size [XLSX records]",
+    "ENABLEEMAILPREVIEW": "Enable Email Preview",
+    "JAWS": "Jaws",
+    "MOTIONBAR": "Motionbar",
+    "MOTIONBARAUTOUPDATER": "Auto Updater",
+    "MOTIONBARAUTOUPDATERURL": "Auto Updater URL",
+    "SMTP_SSL": "SMTP SSL",
+    "CALL_RECORDING_ENCRYPTION": "Voice Recording Encryption",
+    "TURNADDR": "TURN Address",
+    "TURN_USERNAME": "TURN Username",
+    "TURN_PASSWORD": "TURN Password",
+    "WEBRTC": "WebRTC",
+    "CALLYSQUARE": "Cally Square",
+    "ENABLED": "Enabled",
+    "DISABLED": "Disabled",
+    "UNLIMITED_CHANNELS": "Unlimited Channels",
+    "RELOAD": "Reload",
+    "VERIFY": "Verify",
+    "INTERFACE": "Interface",
+    "UPDATING": "Updating",
+    "REMOTE_VERSION": "Remote Version",
+    "NO_NEW_VERSION_AVAILABLE": "No new version available",
+    "TOP_N_PROCESSES": "Top {{value}} processes",
+    "SYSTEM": "System",
+    "FILE_SYSTEM": "File System",
+    "PROCESSES": "Processes",
+    "MOUNT_POINT": "Mount",
+    "AVG_LOAD": "AVG Load",
+    "TOTAL": "Total",
+    "USED": "Used",
+    "FREE": "Free",
+    "NAME": "Name",
+    "STATE": "State",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "MESSAGING": "Sms",
+    "WHATSAPP": "WhatsApp Connector",
+    "FAX": "Fax",
+    "OPENCHANNEL": "Open Channel",
+    "AGENTS": "Agents",
+    "USERS": "Users",
+    "TELEPHONES": "Telephones",
+    "STAFF": "Staff",
+    "CHANNELS": "Channels",
+    "MODULES": "Modules",
+    "CM": "Contacts Manager",
+    "DIALER": "Dialer",
+    "JSCRIPTY": "Jscripty",
+    "CUSTOM": "Customization",
+    "VIDEO": "Video",
+    "SCREENRECORDING": "Screen Recording",
+    "UPDATE": "Update",
+    "OTHERS": "Others",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "SMTP": "SMTP",
+    "NETWORKS": "Networks",
+    "UPDATES": "Updates",
+    "LICENSE": "License",
+    "ID": "Id",
+    "MIN_INTERNAL": "Min Internal",
+    "MIN_MAILBOX": "Min Mailbox",
+    "INSTALLED_AT": "Installed At",
+    "SEARCH_FOR_ANYONE": "Search",
+    "EDIT_GENERAL": "Edit General",
+    "SECURE_PASSWORD": "Secure Password",
+    "LOGO": "Logo",
+    "DEFAULT_LOGO": "Default Logo",
+    "DEFAULT_LOGIN_LOGO": "Default Login Logo",
+    "WHITELABEL": "White Label",
+    "DEFAULT_HEADER_WHITELABEL": "Default Header White Label",
+    "HEADER_WHITELABEL": "Header White Label",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "SMTP_SERVICE": "Service",
+    "SMTP_HOST": "Host",
+    "SMTP_USERNAME": "Username",
+    "DESCRIPTION": "Description",
+    "SMTP_PASSWORD": "Password",
+    "SMTP_PORT": "Port",
+    "SMTP_SECURE": "Secure",
+    "TYPE": "Type",
+    "ADDRESS": "Address",
+    "USERNAME": "Username",
+    "NEW_NETWORK": "New Network",
+    "ADD_NETWORK": "Add Network",
+    "IMAPGENERALSETTINGS": "IMAP",
+    "LOGINMAILFREQUENCY": "Login Mail Frequency (sec)",
+    "DEFAULTSCREENRECORDINGPATH": "Screen Recording path",
+    "APPZONE": "App Zone",
+    "EDIT_NETWORK": "Edit Network",
+    "DELETE_NETWORK": "Delete Network",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "EXPIRATION_DATE": "Expiration Date",
+    "REQUEST_LICENSE": "Request License",
+    "EMAIL": "Email",
+    "SEND": "Send",
+    "PLAN": "Plan",
+    "MONTH_TO_MONTH": "Month to month",
+    "MOTION_PROCESS_MANAGEMENT": "Motion Process Management",
+    "USEFUL_COMMANDS": "Useful Commands",
+    "COMMAND": "Command",
+    "PM2_LIST": "List all processes",
+    "PM2_START": "Start a process by id or name",
+    "PM2_STOP": "Stop a process by id or name or insert 'all' to stop all the active processes",
+    "PM2_RESTART": "Restart a process by id or name",
+    "PM2_LOGS": "Stream all processes log files, unless a specific process id or name is provided",
+    "PASSWORD": "Password",
+    "NO_AVAILABLE_INFO": "No available info",
+    "STUNADDR": "STUN Address",
+    "CHANGELOG": "Changelog",
+    "CURRENT_VERSION": "Current version",
+    "CUSTOMIZATIONS": "Customizations",
+    "LOCALNETADDRESS": "Localnet Address",
+    "NEW_VERSION": "New Version",
+    "TRIAL_VERSION": "Trial Version",
+    "TOKEN": "Token",
+    "NEW_TOKEN_DETECTED": "New Token Detected",
+    "EXPIRATION_GRAY_PERIOD": "Gray Period Expiration",
+    "NEW_TOKEN": "New Token",
+    "PRICES": "Prices",
+    "UPDATE_LICENSE": "Update License",
+    "LOGOLOGIN": "Login Logo",
+    "EXPIRATION_REASON": "Expiration Reason",
+    "GLOBAL": "Global",
+    "SMTP_AUTHENTICATION": "Authentication",
+    "LICENSE_REQUEST_SENT": "Thank you! The Licensing Team will check your account asap in order to approve your request: you will receive an email when the changes become effective. Please refer to [email-masked] for further informations.",
+    "ACCOUNTNAME": "Account Name",
+    "EMAILADDRESS": "Email Address",
+    "EXPIRATION_REASON_MESSAGE_DISABLED": "Your license has been disabled.",
+    "EXPIRATION_REASON_MESSAGE_CHANGED": "Your machine unique id has been updated due to a change to your system.",
+    "EXPIRATION_CHANGED_ADVISE": "Contact xCALLY Motion License Team sending both your old and your new uuid.",
+    "OLD_TOKEN": "Old Token",
+    "SEND_EMAIL_TO": "Send Email to",
+    "JIRA_ERROR_MESSAGE": "Error during license request. Please contact our license team at [email-masked] with your request",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "PAGE_TITLE": "Page Title",
+    "DEFAULT_PAGE_TITLE": "Default Page Title",
+    "PERPETUAL": "Perpetual",
+    "SECURITY_SUITE": "Security Suite",
+    "ANNUALLY": "Annually",
+    "AGENTOMNIDESKTOPINTERFACE": "Agent Omni Desktop Interface",
+    "MESSAGESALIGNMENT": "Messages Alignment",
+    "ENTER_LICENSE": "Enter your license",
+    "UPDATE_LICENSE_MANUALLY": "Do you want to update your license manually?",
+    "SECURITY": "Security",
+    "ALLOWEDLOGINATTEMPTS": "Allowed login attempts before locking the user/agent",
+    "BLOCKDURATION": "Minutes to wait before automatic unlock",
+    "AI": "A.I. Tools",
+    "AITOOLS": "A.I. Tools",
+    "SERVICE": "Service",
+    "NEW_CLOUDPROVIDER": "New Account",
+    "ADD_CLOUDPROVIDER": "Add Account",
+    "DELETE": "Delete",
+    "SECRETACCESSKEY": "Secret Access Key",
+    "ACCESSKEY": "Access Key ID",
+    "EDIT_CLOUDPROVIDER": "Edit Account",
+    "DELETE_CLOUDPROVIDER": "Delete Account",
+    "LANGUAGE": "Language",
+    "BUCKET": "Bucket",
+    "TRANSCRIBE": "Transcribe",
+    "TRANSCRIBEREGION": "Transcribe Region",
+    "TRANSCRIBEACCOUNT": "Transcribe Account",
+    "SENTIMENTANALYSIS": "Sentiment Analysis",
+    "SENTIMENTREGION": "Sentiment Analysis Region",
+    "SENTIMENTACCOUNT": "Sentiment Analysis Account",
+    "SSO": "SSO",
+    "GOOGLE_SSO_ENABLED": "Google SSO Enabled",
+    "ENFORCE_PASSWORD_HISTORY": "Enforce Password History",
+    "PASSWORD_HISTORY_LIMIT": "Password History Limit",
+    "PRIVACY_POLICY_EMAIL": "Privacy Policy for Email Addresses",
+    "PRIVACY_POLICY_NAME": "Privacy Policy for Names",
+    "PRIVACY_POLICY_NUMBER": "Privacy Policy for Numbers",
+    "SEARCH_ON_ENTER_KEY": "Search on Enter key",
+    "CHAT_INTERACTIONS_RELOAD_TIMEOUT": "Chat interactions reload timeout",
+    "MAIL_INTERACTIONS_RELOAD_TIMEOUT": "Email interactions reload timeout",
+    "OPENCHANNEL_INTERACTIONS_RELOAD_TIMEOUT": "Open Channel interactions reload timeout",
+    "SMS_INTERACTIONS_RELOAD_TIMEOUT": "SMS interactions reload timeout",
+    "WHATSAPP_INTERACTIONS_RELOAD_TIMEOUT": "WhatsApp Connector interactions reload timeout",
+    "STOP_RECORDING_ON_VOICE_CALL_TRANSFER": "Stop recording on voice call transfer",
+    "HELP": {
+      "DEFAULTSCREENRECORDINGPATH": "Enter the path where to store screen recording files on the Agent computer (leave empty for default Video Folder path)",
+      "RTLSUPPORT": "Enables the RTL Support for Arabic, Persian and Hebrew languages",
+      "ADDRESS": "External (public) ip address",
+      "LOCALNETADDRESS": "Local ip address/subnet",
+      "SMTP_SECURE": "If true, the connection to the server will use TLS",
+      "SMTP_USERNAME": "Username used for authentication",
+      "SMTP_PASSWORD": "Password used for authentication",
+      "EMAILADDRESS": "The message origin Email address (from)",
+      "SECURITY_SUITE": "Enables the secure password format, the mandatory password reset after the first login and the password expiration after 90 days",
+      "MOTIONBARREMEMBERME": "Enable/Disable the Remember Me feature in Motion Phonebar",
+      "LOGINMAILFREQUENCY": "Please remember to restart the EMAIL service each time this parameter has been changed",
+      "USERNAME": "Username",
+      "PASSWORD": "Password",
+      "ENFORCE_PASSWORD_HISTORY": "Enables the validation against previously used passwords",
+      "PASSWORD_HISTORY_LIMIT": "Number of last used unique passwords to check",
+      "PRIVACY_POLICY": "Number of characters that will be replaced with an asterisk (*) (0 = all characters)",
+      "SEARCH_ON_ENTER_KEY": "Start searching only after the agent hits the Enter key",
+      "INTERACTIONS_RELOAD_TIMEOUT": "Time interval in seconds after which interactions are reloaded (0 = real-time update)"
+    },
+    "ERRORS": {
+      "CHATTIMEOUT_REQUIRED": "Mandatory field",
+      "CHATTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MOTIONBARAUTOUPDATERURL_MUST_VALID_URL": "Wrong format",
+      "MOTIONBARAUTOUPDATERURL_REQUIRED": "Mandatory field",
+      "ADDRESS_REQUIRED": "Mandatory field",
+      "MIN_INTERNAL_REQUIRED": "Mandatory field",
+      "MIN_MAILBOX_REQUIRED": "Mandatory field",
+      "NAME_REQUIRED": "Mandatory field",
+      "HEADER_WHITELABEL_REQUIRED": "Mandatory field",
+      "LOCALNETADDRESS_REQUIRED": "Mandatory field",
+      "LOCALNETADDRESS_MUST_VALID_PATTERN": "Wrong format",
+      "ADDRESS_MUST_VALID_PATTERN": "Wrong format",
+      "ACCOUNTNAME_REQUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "SMTP_USERNAME_REQUIRED": "Mandatory field",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "SMTP_HOST_REQUIRED": "Mandatory field",
+      "SMTP_PORT_REQUIRED": "Mandatory field",
+      "MIN_INTERNAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MIN_MAILBOX_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PAGE_TITLE_REQUIRED": "Mandatory field",
+      "EMAIL_REQUIRED": "Mandatory field",
+      "PLAN_REQUIRED": "Mandatory field",
+      "LICENSE_REQUIRED": "Mandatory field",
+      "LOGINMAILFREQUENCY_REQUIRED": "Mandatory field",
+      "LOGINMAILFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "ALLOWEDLOGINATTEMPTS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "BLOCKDURATION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "ALLOWEDLOGINATTEMPTS_REQUIRED": "Mandatory field",
+      "BLOCKDURATION_REQUIRED": "Mandatory field",
+      "SERVICE_REQUIRED": "Mandatory field",
+      "SECRETACCESSKEY_REQUIRED": "Mandatory field",
+      "ACCESSKEY_REQUIRED": "Mandatory field",
+      "LANGUAGE_REQUIRED": "Mandatory field",
+      "BUCKET_REQUIRED": "Mandatory field",
+      "TRANSCRIBEREGION_REQUIRED": "Mandatory field",
+      "TRANSCRIBEACCOUNT_REQUIRED": "Mandatory field",
+      "SENTIMENTREGION_REQUIRED": "Mandatory field",
+      "SENTIMENTACCOUNT_REQUIRED": "Mandatory field",
+      "USERNAME_REQUIRED": "Mandatory field"
+    }
+  }
+}
diff --git a/public/app/main/apps/settings/i18n/it.json b/public/app/main/apps/settings/i18n/it.json
index 7db0aa7..affd242 100644
--- a/public/app/main/apps/settings/i18n/it.json
+++ b/public/app/main/apps/settings/i18n/it.json
@@ -136,7 +136,7 @@
     "NO_NEW_VERSION_AVAILABLE": "Nessuna nuova versione disponibile",
     "TRIAL_VERSION": "Versione di prova",
     "RELOAD": "Ricaricare",
-    "VERIFY": "Verificare che",
+    "VERIFY": "Verifica",
     "GLOBAL": "Globale",
     "SMTP_AUTHENTICATION": "Autenticazione",
     "LICENSE_REQUEST_SENT": "Grazie! Il team di licenza controllerà il tuo account al più presto in modo da approvare la tua richiesta: riceverai una email quando i cambiamenti saranno effettivi. Puoi rivolgerti a [email-masked] per qualsiasi ulteriore informazione",
@@ -200,6 +200,19 @@
     "SMS_INTERACTIONS_RELOAD_TIMEOUT": "Timeout di aggiornamento delle interazioni SMS",
     "WHATSAPP_INTERACTIONS_RELOAD_TIMEOUT": "Timeout di aggiornamento delle interazioni WhatsApp Connector",
     "STOP_RECORDING_ON_VOICE_CALL_TRANSFER": "Interrompi la registrazione al trasferimento della chiamata",
+    "CLOUD_PROVIDERS": "Cloud Providers",
+    "APPLICATION_ID": "Id dell'applicazione",
+    "TENANT_ID": "Id del tenant",
+    "CLIENT_SECRET": "Segreto dell'applicazione",
+    "NEW_CLIENT_SECRET": "Nuovo segreto dell'applicazione",
+    "REDIRECT_URI": "Indirizzo di risposta",
+    "REMOTE_URI": "Indirizzo remoto",
+    "AUTHENTICATE": "Esegui Autenticazione",
+    "AUTHENTICATE_TO_MICROSOFT_IDENTITY_PLATFORM": "Autenticazione a Microsoft Identity Platform",
+    "MICROSOFT_AUTHENTICATION_SUCCESS": "Autenticazione a Microsoft Identity Platform completata con successo",
+    "MICROSOFT_AUTHENTICATION_FAIL": "Si è verificato un errore durante l'autenticazione a Microsoft Identity Platform",
+    "UPDATE_CLIENT_SECRET": "Aggiorna segreto dell'applicazione",
+    "DISABLED_COOKIE": "Banner dei cookies",
     "HELP": {
       "ADDRESS": "Indirizzo della rete",
       "LOCALNETADDRESS": "Indirizzo IP/Subnet mask",
@@ -213,12 +226,15 @@
       "LOGINMAILFREQUENCY": "Si prega di riavviare il servizio EMAIL sul server dopo la modifica",
       "DEFAULTSCREENRECORDINGPATH": "Immettere il percorso in cui archiviare i file di registrazione dello schermo sul computer dell'agente (lasciare vuoto per il percorso della cartella video predefinita)",
       "PASSWORD": "Parola d'ordine",
+      "PREVIEW_RECALLME_REMINDER_INTERVAL": "Time interval in minutes before which notification will be sent to agent informing him about preview recall to be made",
       "USERNAME": "Nome utente",
       "ENFORCE_PASSWORD_HISTORY": "Abilita la validazione rispetto alle password utilizzate in precedenza",
       "PASSWORD_HISTORY_LIMIT": "Numero delle ultime password univoche utilizzate per la validazione",
       "PRIVACY_POLICY": "Numero di caratteri che verranno mascherati con un asterisco (*) (0 = tutti i caratteri)",
       "SEARCH_ON_ENTER_KEY": "Avvia la ricerca soltanto quando l'agente preme il tasto Invio",
-      "INTERACTIONS_RELOAD_TIMEOUT": "Intervallo di tempo espresso in secondi dopo cui vengono ricaricate le interazioni (0 = aggiornamento real-time)"
+      "INTERACTIONS_RELOAD_TIMEOUT": "Intervallo di tempo espresso in secondi dopo cui vengono ricaricate le interazioni (0 = aggiornamento real-time)",
+      "CLIENT_SECRET": "Il segreto non sarà più visibile una votla salvata la configurazione. Conservalo in un posto sicuro se vuoi usarlo altrove.",
+      "LIMIT_TABS": "Numero massimo di tab aperti raggiunto"
     },
     "ERRORS": {
       "CHATTIMEOUT_REQUIRED": "Campo obbligatorio",
@@ -230,13 +246,14 @@
       "HEADER_WHITELABEL_REQUIRED": "Campo obbligatorio",
       "LOCALNETADDRESS_REQUIRED": "Campo obbligatorio",
       "LOCALNETADDRESS_MUST_VALID_PATTERN": "Il campo deve avere un formato valido",
-      "ADDRESS_MUST_VALID_PATTERN": "IIl campo deve avere un formato valido",
+      "ADDRESS_MUST_VALID_PATTERN": "Il campo deve avere un formato valido",
       "ACCOUNTNAME_REQUIRED": "Campo obbligatorio",
       "EMAIL_MUST_VALID": "Il campo deve avere un formato valido",
       "SMTP_USERNAME_REQUIRED": "Campo obbligatorio",
       "PASSWORD_REQUIRED": "Campo obbligatorio",
       "SMTP_HOST_REQUIRED": "Campo obbligatorio",
       "SMTP_PORT_REQUIRED": "Campo obbligatorio",
+      "PREVIEW_RECALLME_REMINDER_INTERVAL_REQUIRED": "Campo obbligatorio",
       "MIN_INTERNAL_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Il valore introdotto deve essere superiore o uguale a",
       "MIN_MAILBOX_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Il valore introdotto deve essere superiore o uguale a",
       "PAGE_TITLE_REQUIRED": "Campo obbligatorio",
@@ -260,7 +277,23 @@
       "SENTIMENTREGION_REQUIRED": "Campo obbligatorio",
       "TRANSCRIBEACCOUNT_REQUIRED": "Campo obbligatorio",
       "TRANSCRIBEREGION_REQUIRED": "Campo obbligatorio",
-      "USERNAME_REQUIRED": "Campo obbligatorio"
+      "USERNAME_REQUIRED": "Campo obbligatorio",
+      "FIELD_REQUIRED": "Campo obbligatorio",
+      "WRONG_FORMAT": "Il campo deve avere un formato valido"
+    },
+    "NOTIFICATIONS": {
+      "MICROSOFT_AUTHENTICATION_SUCCESS": "Autenticazione a Microsoft Identity Platform completata con successo",
+      "MICROSOFT_AUTHENTICATION_FAIL": "Si è verificato un errore durante l'autenticazione a Microsoft Identity Platform",
+      "CLOUD_PROVIDER_CREATED_SUCCESS_TITLE": "Cloud Provider creato con successo",
+      "CLOUD_PROVIDER_SAVED_SUCCESS_TITLE": "Cloud Provider salvato con successo",
+      "CLOUD_PROVIDER_DELETE_TITLE": "Sei sicuro di voler eliminare il cloud provider?",
+      "CLOUD_PROVIDER_DELETE_MESSAGE": "{{ name }} verrà rimosso",
+      "CLOUD_PROVIDER_DELETED_SUCCESS_TITLE": "Cloud Provider rimosso con successo",
+      "CLOUD_PROVIDERS_DELETE_TITLE": "Sei sicuro di voler eliminare i cloud providers selezionati?",
+      "CLOUD_PROVIDERS_DELETE_MESSAGE": "{{ total }} cloud providers verranno rimossi",
+      "CLOUD_PROVIDERS_DELETED_SUCCESS_TITLE": "Cloud Providers rimossi con successo",
+      "SMTP_SAVED_SUCCESS_TITLE": "Configurazione SMTP salvata con successo",
+      "CLOUD_PROVIDER_SECRET_UPDATE_SUCCESS_TITLE": "Segreto dell'applicazione aggiornato con successo"
     }
   }
 }
diff --git a/public/app/main/apps/sms/i18n/hu.json b/public/app/main/apps/sms/i18n/hu.json
new file mode 100644
index 0000000..797230c
--- /dev/null
+++ b/public/app/main/apps/sms/i18n/hu.json
@@ -0,0 +1,297 @@
+{
+  "SMS": {
+    "EDIT_DIALOGFLOWV2": "Edit Dialogflow V2",
+    "DIALOGFLOWV2": "Dialogflow V2",
+    "PRIVATEKEY": "Private Key",
+    "CLIENTEMAIL": "Client Email",
+    "PROJECTID": "Project ID",
+    "AMAZONLEX": "AmazonLex",
+    "EDIT_AMAZONLEX": "Edit Lex configuration",
+    "ACCESSKEYID": "Access key ID",
+    "SECRETACCESSKEY": "Access key secret",
+    "LEXREGION": "Region",
+    "BOTNAME": "Bot name",
+    "WELCOMEMESSAGE": "Welcome message",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "DOWNLOAD_INTERACTION": "Download",
+    "TRANSFER": "Transfer",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "TAG": "Tag",
+    "EDIT_TAG": "Edit Tag",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "SYSTEM": "System",
+    "EDIT_SYSTEM": "Edit System",
+    "COMMAND": "Command",
+    "VARIABLE": "Variable",
+    "AUTHID": "Auth ID",
+    "NO_SMSDISPOSITIONS_AVAILABLE": "No Sms Disposition Available",
+    "CANNEDANSWERS": "Canned Answers",
+    "SMSCANNEDANSWERS": "Canned Answers",
+    "NO_SMSCANNEDANSWER_AVAILABLE": "No Canned Answers Available",
+    "NEW_SMSCANNEDANSWER": "New Canned Answer",
+    "ADD_SMSCANNEDANSWER": "Add Canned Answer",
+    "EDIT_SMSCANNEDANSWER": "Edit",
+    "DELETE_SMSCANNEDANSWER": "Delete",
+    "DELIVERYREPORTURL": "Delivery Report URL",
+    "DELETE": "Delete",
+    "SENDERSTRING": "Sender String",
+    "DELIVERYREPORT": "Delivery Report",
+    "METHOD": "Method",
+    "ADD_NOTE": "Add note",
+    "NOTE": "Note",
+    "SPYINTERACTION": "Spy",
+    "AUTOREPLY": "Auto Reply",
+    "EDIT_AUTOREPLY": "Edit Auto Reply",
+    "TIMES": "Number of times per interaction",
+    "TEXT": "Text",
+    "INSERT_MESSAGE_HERE": "Insert your text message here",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
+    "CANNED_ANSWER_SEARCH": "Enter a text to search a Canned Answer",
+    "SEND": "Send",
+    "TO": "To",
+    "MESSAGE": "Message",
+    "TAGS": "Tags",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "GOTOREALTIME_SMSQUEUE": "Go To Realtime Sms Queue",
+    "PARTIALPAUSE": "Parital Pause",
+    "BUSY": "Busy",
+    "TIMER": "Timer",
+    "IDLE": "Idle",
+    "CAPACITY": "Capacity",
+    "PROXY": "Proxy",
+    "ADVANCED": "Advanced",
+    "MOTIONPROXY": "Proxy Or Motion Domain",
+    "REALTIME": "Realtime",
+    "KEY": "Key",
+    "NAME": "Name",
+    "SMSQUEUES": "SMS Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "STRATEGY": "Strategy",
+    "BASEURL": "Base URL",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled",
+    "ERRORS": {
+      "PROJECTID_REQUIRED": "Mandatory Field",
+      "CLIENTEMAIL_REQUIRED": "Mandatory Field",
+      "PRIVATEKEY_REQUIRED": "Mandatory Field",
+      "ACCESSKEYID_REQUIRED": "Access key ID is required",
+      "SECRETACCESSKEY_REQUIRED": "Access key secret is required",
+      "BOTNAME_REQUIRED": "Bot name is required",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "AGENT_TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "AUTHID_REQUIRED": "Mandatory Field",
+      "TEXT_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "TEXT_REQUIRED": "Mandatory Field",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "SENDERSTRING_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "SENDERSTRING_MUST_VALID_PATTERN": "Wrong format",
+      "METHOD_REQUIRED": "Mandatory Field",
+      "MOTIONPROXY_REQUIRED": "Mandatory Field",
+      "MOTIONPROXY_MUST_VALID_URL": "Wrong format",
+      "KEY_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "KEY_REQUIRED": "Mandatory Field",
+      "NAME_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory Field",
+      "PHONE_REQUIRED": "Mandatory Field",
+      "SID_REQUIRED": "Mandatory Field",
+      "TOKEN_REQUIRED": "Mandatory Field",
+      "USERNAME_REQUIRED": "Mandatory Field",
+      "PASSWORD_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_REQUIRED": "Mandatory Field",
+      "MOTIONADDRESS_MUST_VALID_URL": "Wrong format",
+      "ACCEPTURL_MUST_VALID_URL": "Wrong format",
+      "TIMEOUT_REQUIRED": "Mandatory Field",
+      "REJECTURL_MUST_VALID_URL": "Wrong format",
+      "CLOSEURL_MUST_VALID_URL": "Wrong format",
+      "TYPE_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "PRIORITY_REQUIRED": "Mandatory Field",
+      "CONDITION_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_REQUIRED": "Mandatory Field",
+      "FALSEPRIORITY_REQUIRED": "Mandatory Field",
+      "AGENT_REQUIRED": "Mandatory Field",
+      "QUEUE_REQUIRED": "Mandatory Field",
+      "DISPOSITION_REQUIRED": "Mandatory Field",
+      "ACCOUNTSID_REQUIRED": "Mandatory Field",
+      "AUTHTOKEN_REQUIRED": "Mandatory Field",
+      "BASEURL_REQUIRED": "Mandatory Field",
+      "APIKEY_REQUIRED": "Mandatory Field",
+      "APPLICATIONID_REQUIRED": "Mandatory Field",
+      "ACCOUNTID_REQUIRED": "Mandatory Field",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field"
+    },
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "DESCRIPTION": "Description",
+    "ADD_SMSQUEUE": "Add SMS Queue",
+    "EDIT_SMSQUEUE": "Edit SMS Queue",
+    "DELETE_SMSQUEUE": "Delete SMS Queue",
+    "SETTINGS": "Settings",
+    "GENERAL": "General",
+    "CREATED_AT": "Created At",
+    "SAVE": "Save",
+    "SMSACCOUNTS": "SMS Accounts",
+    "TYPE": "Type",
+    "PHONE": "Phone",
+    "SID": "SID",
+    "TOKEN": "Token",
+    "SMSTYPE": "SMS Type",
+    "USERNAME": "Username",
+    "PASSWORD": "Password",
+    "MOTIONADDRESS": "Motion Address",
+    "ADD_SMSACCOUNT": "Add SMS Account",
+    "EDIT_SMSACCOUNT": "Edit SMS Account",
+    "DELETE_SMSACCOUNT": "Delete SMS Account",
+    "LIST": "List",
+    "FIDELITY": "Fidelity",
+    "API": "API",
+    "DISPOSITIONS": "Dispositions",
+    "WEBHOOKS": "WebHooks",
+    "ACTIONS": "Actions",
+    "ACCEPT": "Accept",
+    "ACCEPTMETHOD": "Accept Method",
+    "ACCEPTURL": "Accept URL",
+    "REJECT": "Reject",
+    "REJECTMETHOD": "Reject Method",
+    "REJECTURL": "Reject URL",
+    "CLOSE": "Close",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "BACK": "Back",
+    "SMS": "SMS",
+    "ID": "Id",
+    "APIKEY": "ApiKey",
+    "APPLICATIONID": "Application ID",
+    "ACCOUNTID": "Account ID",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "SMSDISPOSITIONS": "SMS Dispositions",
+    "NO_SMSDISPOSITION_AVAILABLE": "No SMS Dispositions available",
+    "NEW_SMSDISPOSITION": "New SMS Disposition",
+    "ADD_SMSDISPOSITION": "Add SMS Disposition",
+    "EDIT_SMSDISPOSITION": "Edit SMS Disposition",
+    "DELETE_SMSDISPOSITION": "Delete SMS Disposition",
+    "NEW_SMSQUEUE": "New SMS Queue",
+    "NEW_SMSACCOUNT": "New SMS Account",
+    "NO_AVAILABLE_INFO": "No available info",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "DIALOGFLOW": "DialogFlow",
+    "EDIT_DIALOGFLOW": "Edit DialogFlow configuration",
+    "LANGUAGE": "Language",
+    "HELP": {
+      "WELCOMEMESSAGE": "This is the first response message sent to new interactions",
+      "MOTIONPROXY": "The field must have the following format: <protocol>://<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "LIST": "Contact Manager list used to associate contacts",
+      "RECEIVEURL": "This is the auto-generated API string you need to use to receive the messages inside your account from your SMS provider (POST method must be used): click the clipboard button to copy it",
+      "DELIVERYREPORTURL": "This is the auto-generated API string you need to use to receive the delivery report of sent messages from your SMS provider (POST method must be used): click the clipboard button to copy it",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled"
+    },
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "TEAMADD_SMSQUEUE": "Add Team To SMS Queue",
+    "AGENTADD_SMSQUEUE": "Add Agent To SMS Queue",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "RECEIVEURL": "Receive URL",
+    "INTERACTION": "Interaction",
+    "INTERACTIONS": "Interactions",
+    "NO_INTERACTION_AVAILABLE": "No interactions available",
+    "CONTACT": "Contact",
+    "STARTEDAT": "Started At",
+    "LASTMESSAGE": "Last message",
+    "AGENT": "Agent",
+    "CLOSEDAT": "Closed At",
+    "DISPOSITION": "Disposition",
+    "NOTES": "Notes",
+    "GOTO": "Goto",
+    "GOTOIF": "Gotoif",
+    "NOOP": "Noop",
+    "QUEUE": "Queue",
+    "TIMEOUT": "Timeout",
+    "VALUE": "Value",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_GOTO": "Edit Goto",
+    "EDIT_NOOP": "Edit Noop",
+    "EDIT_GOTOIF": "Edit Gotoif",
+    "EDIT_QUEUE": "Edit Queue",
+    "CONDITION": "Condition",
+    "TRUEPRIORITY": "True Priority",
+    "FALSEPRIORITY": "False Priority",
+    "PRIORITY": "Priority",
+    "GOTOP": "Gotop",
+    "EDIT_GOTOP": "Edit Gotop",
+    "EDIT_CLOSE": "Edit Close",
+    "FILTER": "Filter",
+    "SELECT_STATUS": "Select a status",
+    "ALL": "All",
+    "SELECT_ACCOUNT": "Select an account",
+    "OPENED": "Open",
+    "CLOSED": "Closed",
+    "STATUS": "Status",
+    "ACCOUNT": "Account",
+    "OPEN": "Open",
+    "INFO": "Info",
+    "ACCOUNTSID": "Account SID",
+    "AUTHTOKEN": "Auth Token",
+    "UNKNOWN": "Unknown",
+    "UNREGISTERED": "Unregistered",
+    "UNAVAILABLE": "Unavailable",
+    "NOT_INUSE": "Not in use",
+    "REACHABLE": "Reachable",
+    "IN_USE": "In use",
+    "AGENTS": "Agents",
+    "QUEUES": "Queues",
+    "FULLNAME": "Fullname",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "PAUSE": "Pause",
+    "LOGOUT": "Logout",
+    "AGENTADD_QUEUE": "Add Agent To SMS Queue",
+    "UNPAUSE": "End Pause",
+    "DEFAULT_PAUSE": "Default pause",
+    "LOGGED_IN": "Logged in",
+    "PAUSED": "Paused",
+    "READY": "Ready",
+    "WAITING": "Waiting",
+    "VOICE": "Voice",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "OPENCHANNEL": "Open channel",
+    "FAX": "Fax",
+    "AGENTSADD_QUEUE": "Add agents to SMS queue",
+    "INTERACTIONS_SMSACCOUNT": "Go to Interactions",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "AGENTADD_SMSACCOUNT": "Add Agent to SMS Account",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "DOWNLOAD_WITH_ATTACHMENT": "Download with attachment",
+    "DOWNLOAD_WITHOUT_ATTACHMENT": "Download without attachment"
+  }
+}
diff --git a/public/app/main/apps/staff/i18n/ar.json b/public/app/main/apps/staff/i18n/ar.json
index 932e20c..3faefaf 100644
--- a/public/app/main/apps/staff/i18n/ar.json
+++ b/public/app/main/apps/staff/i18n/ar.json
@@ -126,13 +126,13 @@
     "AGENTADD_TEAM": "إضافة ممثل خدمة إلى فريق",
     "ALLOWCODECS": "السماح بالاكواد",
     "ALL_MODULES_AVAILABLE": "جميع الوحدات المتاحة",
-    "ALL_QUEUES_CHAT_INBOUND": " جميع قوائم الدردشة الواردة",
-    "ALL_QUEUES_FAX_INBOUND": "جميع قوائم انتظار الفاكس الواردة",
-    "ALL_QUEUES_MAIL_INBOUND": "كل قوائم البريد الإلكتروني الوارد",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "جميع قوائم انتظار القنوات المفتوحة الواردة",
-    "ALL_QUEUES_SMS_INBOUND": "جميع قوائم الرسائل القصيرة الواردة",
-    "ALL_QUEUES_VOICE_INBOUND": "كل قوائم انتظار الصوت الواردة",
-    "ALL_QUEUES_VOICE_OUTBOUND": "جميع قوائم انتظار المكالمات الصادرة",
+    "ALL_CHAT_QUEUES": " جميع قوائم الدردشة الواردة",
+    "ALL_FAX_QUEUES": "جميع قوائم انتظار الفاكس الواردة",
+    "ALL_MAIL_QUEUES": "كل قوائم البريد الإلكتروني الوارد",
+    "ALL_OPENCHANNEL_QUEUES": "جميع قوائم انتظار القنوات المفتوحة الواردة",
+    "ALL_SMS_QUEUES": "جميع قوائم الرسائل القصيرة الواردة",
+    "ALL_VOICE_QUEUES": "كل قوائم انتظار الصوت الواردة",
+    "ALL_QUEUE_CAMPAIGNS": "جميع قوائم انتظار المكالمات الصادرة",
     "ALL_TEAMS": "جميع الفرق",
     "AUTOANSWER": "رد ألي",
     "AUTOINTERNAL": "توليد تلقائي للرقم الداخلي",
@@ -184,13 +184,13 @@
     "PERMISSIONS": "أذونات",
     "PERSONAL_INFO": "معلومات شخصية",
     "PICKUPGROUP": "مجموعة الرد على المكالمات",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الدردشةالواردة",
-    "QUEUEADD_AGENT_FAX_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الفاكس الواردة",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "إضافة ممثل خدمة إلى قوائم البريد الإلكتروني الوارد",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "إضافة ممثل خدمة لفتح قائمة انتظار القنوات الواردة",
-    "QUEUEADD_AGENT_SMS_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار SMS",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الصوت الوارد",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "إضافة ممثل خدمة لحملات المكالمات الصادرة",
+    "ADD_AGENT_TO_CHAT_QUEUES": "إضافة ممثل خدمة إلى قوائم انتظار الدردشةالواردة",
+    "ADD_AGENT_TO_FAX_QUEUES": "إضافة ممثل خدمة إلى قوائم انتظار الفاكس الواردة",
+    "ADD_AGENT_TO_MAIL_QUEUES": "إضافة ممثل خدمة إلى قوائم البريد الإلكتروني الوارد",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "إضافة ممثل خدمة لفتح قائمة انتظار القنوات الواردة",
+    "ADD_AGENT_TO_SMS_QUEUES": "إضافة ممثل خدمة إلى قوائم انتظار SMS",
+    "ADD_AGENT_TO_VOICE_QUEUES": "إضافة ممثل خدمة إلى قوائم انتظار الصوت الوارد",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "إضافة ممثل خدمة لحملات المكالمات الصادرة",
     "QUEUEADD_USER_CHAT_INBOUND": "إضافة مستخدم إلى قوائم الدردشة",
     "QUEUEADD_USER_FAX_INBOUND": "إضافة مستخدم إلى قوائم انتظار الفاكس",
     "QUEUEADD_USER_MAIL_INBOUND": "إضافة مستخدم إلى قوائم البريد الإلكتروني",
@@ -203,13 +203,13 @@
     "ROLE": "وظيفة",
     "ROWSPERPAGE": "صفوف لكل صفحة",
     "SELECTED_AGENTS": "ممثل خدمة_مختار",
-    "SELECTED_QUEUES_CHAT_INBOUND": "قوائم انتظار الدردشة المحددة",
-    "SELECTED_QUEUES_FAX_INBOUND": "قوائم انتظار الفاكس المحددة",
-    "SELECTED_QUEUES_MAIL_INBOUND": "قوائم انتظار البريد الإلكتروني المحددة",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "قوائم محددة فتح القنوات المفتوحة",
-    "SELECTED_QUEUES_SMS_INBOUND": "قوائم انتظار الرسائل القصيرة المختارة",
-    "SELECTED_QUEUES_VOICE_INBOUND": "قوائم الانتظار الصوتية المحددة",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "حملات قائمة الانتظار المحددة",
+    "SELECTED_CHAT_QUEUES": "قوائم انتظار الدردشة المحددة",
+    "SELECTED_FAX_QUEUES": "قوائم انتظار الفاكس المحددة",
+    "SELECTED_MAIL_QUEUES": "قوائم انتظار البريد الإلكتروني المحددة",
+    "SELECTED_OPENCHANNEL_QUEUES": "قوائم محددة فتح القنوات المفتوحة",
+    "SELECTED_SMS_QUEUES": "قوائم انتظار الرسائل القصيرة المختارة",
+    "SELECTED_VOICE_QUEUES": "قوائم الانتظار الصوتية المحددة",
+    "SELECTED_QUEUE_CAMPAIGNS": "حملات قائمة الانتظار المحددة",
     "SELECTED_TEAMS": "فرق مختارة",
     "SETTINGS": "إعدادات",
     "SHOWWEBCONTROL": "ادارة عرض الويب",
@@ -339,12 +339,12 @@
     "BLOCKED": "مقفل",
     "DISABLED": "المعطلة",
     "REGENERATE": "تجديد",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "جميع قوائم انتظار WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "جميع قوائم انتظار WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "جميع حسابات WhatsApp",
     "ALL_WHATSAPPQUEUES": "جميع قوائم انتظار Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "إضافة عامل إلى قوائم انتظار WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "إضافة عامل إلى قوائم انتظار WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "إضافة المستخدم إلى قوائم انتظار WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "قوائم انتظار WhatsApp المحددة",
+    "SELECTED_WHATSAPP_QUEUES": "قوائم انتظار WhatsApp المحددة",
     "SELECTED_WHATSAPPACCOUNTS": "حسابات WhatsApp المحددة",
     "SELECTED_WHATSAPPQUEUES": "قوائم انتظار WhatsApp المحددة",
     "USERADD_WHATSAPPACCOUNTS": "أضف حساب WhatsApp إلى المستخدم",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "جلسات Jscripty",
     "OMNICHANNEL_INTERACTIONS": "تفاعلات Omnichannel",
     "SCREEN_RECORDINGS": "تسجيلات الشاشة",
-    "VOICE_RECORDINGS": "التسجيلات الصوتية"
+    "VOICE_RECORDINGS": "التسجيلات الصوتية",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "تجاهل حالة انقطاع الوكيل لمكالمات المعاينة",
+    "SELECT_RECALLME_CAMPAIGN": "حدد استدعاء حملة",
+    "ALL_QUEUES_CHAT_INBOUND": " جميع قوائم الدردشة الواردة",
+    "ALL_QUEUES_FAX_INBOUND": "جميع قوائم انتظار الفاكس الواردة",
+    "ALL_QUEUES_MAIL_INBOUND": "كل قوائم البريد الإلكتروني الوارد",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "جميع قوائم انتظار القنوات المفتوحة الواردة",
+    "ALL_QUEUES_SMS_INBOUND": "جميع قوائم الرسائل القصيرة الواردة",
+    "ALL_QUEUES_VOICE_INBOUND": "كل قوائم انتظار الصوت الواردة",
+    "ALL_QUEUES_VOICE_OUTBOUND": "جميع قوائم انتظار المكالمات الصادرة",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الدردشةالواردة",
+    "QUEUEADD_AGENT_FAX_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الفاكس الواردة",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "إضافة ممثل خدمة إلى قوائم البريد الإلكتروني الوارد",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "إضافة ممثل خدمة لفتح قائمة انتظار القنوات الواردة",
+    "QUEUEADD_AGENT_SMS_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار SMS",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "إضافة ممثل خدمة إلى قوائم انتظار الصوت الوارد",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "إضافة ممثل خدمة لحملات المكالمات الصادرة",
+    "SELECTED_QUEUES_CHAT_INBOUND": "قوائم انتظار الدردشة المحددة",
+    "SELECTED_QUEUES_FAX_INBOUND": "قوائم انتظار الفاكس المحددة",
+    "SELECTED_QUEUES_MAIL_INBOUND": "قوائم انتظار البريد الإلكتروني المحددة",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "قوائم محددة فتح القنوات المفتوحة",
+    "SELECTED_QUEUES_SMS_INBOUND": "قوائم انتظار الرسائل القصيرة المختارة",
+    "SELECTED_QUEUES_VOICE_INBOUND": "قوائم الانتظار الصوتية المحددة",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "حملات قائمة الانتظار المحددة",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "جميع قوائم انتظار WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "إضافة عامل إلى قوائم انتظار WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "قوائم انتظار WhatsApp المحددة"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/cs.json b/public/app/main/apps/staff/i18n/cs.json
index a276dc9..8c6322c 100644
--- a/public/app/main/apps/staff/i18n/cs.json
+++ b/public/app/main/apps/staff/i18n/cs.json
@@ -109,7 +109,7 @@
       "TRANSPORT": "Set the default transports in order of preference",
       "HOST": "How to find the client - IP or host name. If you want the phone to register itself, use the keyword dynamic instead of Host IP",
       "NAT": "Changes the behaviour of Asterisk for clients behind a firewall. If any of the comma-separated options is 'no', Asterisk will ignore other settings and set nat=no",
-      "SIPEXPIRES": "Default: 120",
+      "SIPEXPIRES": "Default: 160",
       "SIPPORT": "Default: 5060",
       "TYPE": "Determines the SIP role within asterisk. User: used to authenticate incoming - Peer: for outgoing calls - Friend: covers both characteristics of the above",
       "CHATCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
@@ -195,13 +195,13 @@
     "ALL_MODULES_AVAILABLE": "All modules available",
     "CALLGROUP": "Call Group",
     "PICKUPGROUP": "Pickup Group",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Add Agent to Queue Campaigns",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Add Agent to Voice Queues",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Add Agent to Chat Queues",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Add Agent to Email Queues",
+    "ADD_AGENT_TO_SMS_QUEUES": "Add Agent to SMS Queues",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Add Agent to Open Channel Queues",
+    "ADD_AGENT_TO_FAX_QUEUES": "Add Agent to Fax Queues",
     "QUEUEADD_USER_VOICE_INBOUND": "Add User to Voice Queues",
     "QUEUEADD_USER_CHAT_INBOUND": "Add User to Chat Queues",
     "QUEUEADD_USER_MAIL_INBOUND": "Add User to Email Queues",
@@ -211,20 +211,20 @@
     "ALL_TEAMS": "All Teams",
     "SELECTED_TEAMS": "Selected Teams",
     "SELECTED_AGENTS": "Selected Agents",
-    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
-    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
-    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
-    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
-    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
-    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
-    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
-    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues",
+    "ALL_QUEUE_CAMPAIGNS": "All Queue Campaigns",
+    "SELECTED_QUEUE_CAMPAIGNS": "Selected Queue Campaigns",
+    "ALL_VOICE_QUEUES": "All Voice Queues",
+    "SELECTED_VOICE_QUEUES": "Selected Voice Queues",
+    "ALL_CHAT_QUEUES": "All Chat Queues",
+    "SELECTED_CHAT_QUEUES": "Selected Chat Queues",
+    "ALL_MAIL_QUEUES": "All Email Queues",
+    "SELECTED_MAIL_QUEUES": "Selected Email Queues",
+    "ALL_SMS_QUEUES": "All SMS Queues",
+    "SELECTED_SMS_QUEUES": "Selected SMS Queues",
+    "ALL_OPENCHANNEL_QUEUES": "All Open Channel Queues",
+    "SELECTED_OPENCHANNEL_QUEUES": "Selected Open Channel Queues",
+    "ALL_FAX_QUEUES": "All Fax Queues",
+    "SELECTED_FAX_QUEUES": "Selected Fax Queues",
     "VOICEMAIL": "Voicemail",
     "SHOWWEBCONTROL": "Typology",
     "PAGE": "Page",
@@ -293,7 +293,7 @@
     "ALL_OPENCHANNELACCOUNTS": "All Open Channel Accounts",
     "SELECTED_OPENCHANNELACCOUNTS": "Selected Open Channel Accounts",
     "ADD_USERPROFILE": "Přidat uživatelský profil",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Všechny fronty WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Všechny fronty WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Všechny účty WhatsApp",
     "ALL_WHATSAPPQUEUES": "Všechny fronty Whataspp",
     "APIKEY": "Klíč API",
@@ -331,7 +331,7 @@
     "PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE": "Neoprávněné jednání",
     "PERMISSIONS_WARNING_CLOSE": "Máte neuložené změny. Opravdu chcete ukončit bez uložení?",
     "PERMISSIONS_WARNING_ENABLE_ALL": "Všechny {{sectionName}} subsekce a jejich zdroje budou povoleny. Jste si jistý, že chcete pokračovat?",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Přidejte agenta do front WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Přidejte agenta do front WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Přidat uživatele do front WhatsApp",
     "QUEUES_ASSOCIATION": "{{channel}} Asociace front",
     "READ_PERMISSION": "Číst",
@@ -339,7 +339,7 @@
     "REMOVE": "Odstranit",
     "REPORT_TYPE": "Typ přehledu",
     "SECTIONS": "Sekce",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Vybrané fronty WhatsApp",
+    "SELECTED_WHATSAPP_QUEUES": "Vybrané fronty WhatsApp",
     "SELECTED_WHATSAPPACCOUNTS": "Vybrané účty WhatsApp",
     "SELECTED_WHATSAPPQUEUES": "Vybrané fronty WhatsApp",
     "SUMMARY": "souhrn",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty Sessions",
     "OMNICHANNEL_INTERACTIONS": "Omnikanálové interakce",
     "SCREEN_RECORDINGS": "Záznamy z obrazovky",
-    "VOICE_RECORDINGS": "Hlasové nahrávky"
+    "VOICE_RECORDINGS": "Hlasové nahrávky",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorovat stav přerušení agenta pro náhledová volání",
+    "SELECT_RECALLME_CAMPAIGN": "Vyberte kampaň Zavolejte mi",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
+    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
+    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
+    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
+    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
+    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
+    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
+    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Všechny fronty WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Přidejte agenta do front WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Vybrané fronty WhatsApp"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/da.json b/public/app/main/apps/staff/i18n/da.json
index b52970f..006da2e 100644
--- a/public/app/main/apps/staff/i18n/da.json
+++ b/public/app/main/apps/staff/i18n/da.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Opsætter transporter. Rækkefølgen bestemmer den primære standard transport.",
       "HOST": "Find den client - IP eller hostname. Hvis du vil have telefonen til at registrere sig, skal du bruge nøgleordet dynamisk i stedet for en IP adresse.",
       "NAT": "Ændrer adfærden hos stjerne for klienter bag en firewall.Hvis en kommasepareret muligheder er 'nej', Stjerne vil ignorere alle indstillinger og sæt nat=no.",
-      "SIPEXPIRES": "Standard: 120",
+      "SIPEXPIRES": "Standard: 160",
       "SIPPORT": "Standard: 5160",
       "TYPE": "Bestemmer SIP rolle i stjerne. Bruger: bruges til at autentificere indgående - Peer: til udgående opkald - Ven: dækker både beskrivelse af ovenstående.",
       "CHATCAPACITY": "Nul betyder ubegrænset.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Alle moduler er tilgængelige",
     "CALLGROUP": "Gruppenummer",
     "PICKUPGROUP": "Opkaldshentningsgruppe",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Tilføj til kø Agent kampagner",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Tilføj Agent til Voice køer",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Tilføj Agent til Chat køer",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Tilføj Agent til Postkøer",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Tilføj Agent til SMS KØER",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Tilføj Agent åbne kanal køer",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Tilføj Agent til Faxkøer",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Tilføj til kø Agent kampagner",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Tilføj Agent til Voice køer",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Tilføj Agent til Chat køer",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Tilføj Agent til Postkøer",
+    "ADD_AGENT_TO_SMS_QUEUES": "Tilføj Agent til SMS KØER",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Tilføj Agent åbne kanal køer",
+    "ADD_AGENT_TO_FAX_QUEUES": "Tilføj Agent til Faxkøer",
     "QUEUEADD_USER_VOICE_INBOUND": "Tilføj brugeren til Voice køer",
     "QUEUEADD_USER_CHAT_INBOUND": "Tilføje en bruger til Chat køer",
     "QUEUEADD_USER_MAIL_INBOUND": "Tilføj brugeren til Postkøer",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Alle hold",
     "SELECTED_TEAMS": "Udvalgte Teams",
     "SELECTED_AGENTS": "Udvalgte agenter",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Kø kampagner",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Udvalgte Kampagner kø",
-    "ALL_QUEUES_VOICE_INBOUND": "Alle Voice køer",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Valgt Voice køer",
-    "ALL_QUEUES_CHAT_INBOUND": "Alle Chat køer",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Udvalgte Chat køer",
-    "ALL_QUEUES_MAIL_INBOUND": "Alle Postkøer",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Udvalgte Postkøer",
-    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-køer",
-    "SELECTED_QUEUES_SMS_INBOUND": "Udvalgte SMS KØER",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle åbne kanal køer",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valgte en åben kanal køer",
-    "ALL_QUEUES_FAX_INBOUND": "Alle Faxkøer",
-    "SELECTED_QUEUES_FAX_INBOUND": "Udvalgte Faxkøer",
+    "ALL_QUEUE_CAMPAIGNS": "Alle Kø kampagner",
+    "SELECTED_QUEUE_CAMPAIGNS": "Udvalgte Kampagner kø",
+    "ALL_VOICE_QUEUES": "Alle Voice køer",
+    "SELECTED_VOICE_QUEUES": "Valgt Voice køer",
+    "ALL_CHAT_QUEUES": "Alle Chat køer",
+    "SELECTED_CHAT_QUEUES": "Udvalgte Chat køer",
+    "ALL_MAIL_QUEUES": "Alle Postkøer",
+    "SELECTED_MAIL_QUEUES": "Udvalgte Postkøer",
+    "ALL_SMS_QUEUES": "Alle SMS-køer",
+    "SELECTED_SMS_QUEUES": "Udvalgte SMS KØER",
+    "ALL_OPENCHANNEL_QUEUES": "Alle åbne kanal køer",
+    "SELECTED_OPENCHANNEL_QUEUES": "Valgte en åben kanal køer",
+    "ALL_FAX_QUEUES": "Alle Faxkøer",
+    "SELECTED_FAX_QUEUES": "Udvalgte Faxkøer",
     "VOICEMAIL": "Telefonsvarer",
     "SHOWWEBCONTROL": "Vis Web Control",
     "PAGE": "Page",
@@ -339,12 +339,12 @@
     "BLOCKED": "Låst",
     "DISABLED": "Deaktiveret",
     "REGENERATE": "Regenerer",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-køer",
+    "ALL_WHATSAPP_QUEUES": "Alle WhatsApp-køer",
     "ALL_WHATSAPPACCOUNTS": "Alle WhatsApp-konti",
     "ALL_WHATSAPPQUEUES": "Alle Whataspp-køer",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Føj agent til WhatsApp-køer",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Føj agent til WhatsApp-køer",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Føj bruger til WhatsApp-køer",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valgte WhatsApp-køer",
+    "SELECTED_WHATSAPP_QUEUES": "Valgte WhatsApp-køer",
     "SELECTED_WHATSAPPACCOUNTS": "Valgte WhatsApp-konti",
     "SELECTED_WHATSAPPQUEUES": "Valgte WhatsApp-køer",
     "USERADD_WHATSAPPACCOUNTS": "Føj WhatsApp-konto til brugeren",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty-sessioner",
     "OMNICHANNEL_INTERACTIONS": "Omnichannel-interaktioner",
     "SCREEN_RECORDINGS": "Skærmoptagelser",
-    "VOICE_RECORDINGS": "Stemmeoptagelser"
+    "VOICE_RECORDINGS": "Stemmeoptagelser",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorer agentpausestatus for forhåndsvisning af opkald",
+    "SELECT_RECALLME_CAMPAIGN": "Vælg Recall Me Campaign",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Tilføj til kø Agent kampagner",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Tilføj Agent til Voice køer",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Tilføj Agent til Chat køer",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Tilføj Agent til Postkøer",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Tilføj Agent til SMS KØER",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Tilføj Agent åbne kanal køer",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Tilføj Agent til Faxkøer",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Kø kampagner",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Udvalgte Kampagner kø",
+    "ALL_QUEUES_VOICE_INBOUND": "Alle Voice køer",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Valgt Voice køer",
+    "ALL_QUEUES_CHAT_INBOUND": "Alle Chat køer",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Udvalgte Chat køer",
+    "ALL_QUEUES_MAIL_INBOUND": "Alle Postkøer",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Udvalgte Postkøer",
+    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-køer",
+    "SELECTED_QUEUES_SMS_INBOUND": "Udvalgte SMS KØER",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle åbne kanal køer",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valgte en åben kanal køer",
+    "ALL_QUEUES_FAX_INBOUND": "Alle Faxkøer",
+    "SELECTED_QUEUES_FAX_INBOUND": "Udvalgte Faxkøer",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-køer",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Føj agent til WhatsApp-køer",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valgte WhatsApp-køer"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/de.json b/public/app/main/apps/staff/i18n/de.json
index b5e8a7a..55127d8 100644
--- a/public/app/main/apps/staff/i18n/de.json
+++ b/public/app/main/apps/staff/i18n/de.json
@@ -1,264 +1,264 @@
 {
   "STAFF": {
     "CONTEXT": "Kontext",
-    "RINGINUSE": "Ring im Einsatz",
+    "RINGINUSE": "Innerhalb Verteilungsgrupppe",
     "USERS": "Benutzer",
     "AGENTS": "Agenten",
-    "TOGGLE_SIDENAV": "Um sidenav",
-    "SEARCH_FOR_ANYONE": "Suche für Jedermann",
+    "TOGGLE_SIDENAV": "Navigationsleiste umschalten",
+    "SEARCH_FOR_ANYONE": "Suche",
     "BACK": "Zurück",
-    "MULTI_SELECT_TOGGLE": "Wählen Sie toggle multi",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
-    "SELECTED": "Ausgewählte",
+    "MULTI_SELECT_TOGGLE": "Mehrfachauswahl ja/nein",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
+    "SELECTED": "Ausgewählt",
     "DELETE_SELECTED": "Auswahl löschen",
     "EXPORT_SELECTED": "Auswahl exportieren",
     "ALL_USERS": "Alle Benutzer",
     "ALL_AGENTS": "Alle Agenten",
     "SORT": "Sortieren",
     "NAME": "Name",
-    "FULLNAME": "Voller Name",
+    "FULLNAME": "Vollständiger Name",
     "A_TO_Z": "(A bis Z)",
     "Z_TO_A": "(Z bis A)",
     "MORE": "Mehr",
     "DELETE_USER": "Benutzer löschen",
     "EDIT_USER": "Benutzer bearbeiten",
-    "DELETE_AGENT": "Bedienplatz löschen",
-    "EDIT_AGENT": "Agent bearbeiten",
+    "DELETE_AGENT": "Agenten löschen",
+    "EDIT_AGENT": "Agenten bearbeiten",
     "DELETE": "Löschen",
     "SAVE": "Speichern",
     "ADD_USER": "Benutzer hinzufügen",
     "ADD_AGENT": "AGENT HINZUFÜGEN",
-    "NO_RESULTS": "Keine Ergebnisse.",
+    "NO_RESULTS": "Keine Ergebnisse",
     "CLOSE_DIALOG": "Dialog schließen",
-    "NAME_REQUIRED": "Name (erforderlich).",
+    "NAME_REQUIRED": "Name (erforderlich)",
     "USERNAME": "Benutzername",
     "SHOW_ALL_FIELDS": "Alle Felder anzeigen",
     "PHONE_NUMBER": "Telefonnummer",
     "EMAIL": "E-Mail",
     "PASSWORD": "Passwort",
     "ERRORS": {
-      "FULLNAME_REQUIRED": "Der Fullname ist erforderlich",
-      "USERNAME_REQUIRED": "Der Benutzername ist erforderlich",
-      "EMAIL_REQUIRED": "Die E-Mail ist erforderlich",
-      "PASSWORD_REQUIRED": "Das Kennwort ist erforderlich",
-      "CONFIRM_NOT_MATCH": "Die Kennwörter stimmen nicht überein.",
-      "EMAIL_MUST_VALID": "Die e-Mail muss in einem gültigen Format",
-      "ACCOUNTNAME_REQUIRED": "Der Account ist erforderlich.",
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "HOST_REQUIRED": "Der Host wird benötigt",
-      "CHATCAPACITY_REQUIRED": "Die Kapazität ist erforderlich",
-      "MAILCAPACITY_REQUIRED": "Die E-Mail Kapazität erforderlich ist",
-      "FAXCAPACITY_REQUIRED": "Die Kapazität ist erforderlich",
-      "SMSCAPACITY_REQUIRED": "Die SMS-Kapazität erforderlich ist",
-      "OPENCHANNELCAPACITY_REQUIRED": "Der Offene Kanal Kapazität erforderlich ist",
-      "SIPEXPIRES_REQUIRED": "Der SIP-Ablauf ist erforderlich",
-      "SIPPORT_REQUIRED": "Die SIP-Port erforderlich.",
-      "UNCONDITIONALNUMBER_REQUIRED": "Die Zielrufnummer ist erforderlich",
-      "NOREPLYNUMBER_REQUIRED": "Die Nummer ist keine Antwort erforderlich",
-      "BUSYNUMBER_REQUIRED": "Die besetzt ist erforderlich",
-      "USERNAME_MUST_VALID_PATTERN": "Der Benutzername muss gültige {{regex}}.",
-      "REMOTECONTROLPORT_REQUIRED": "Die Fernbedienung Anschluss erforderlich",
-      "CHATCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Chat Kapazität muss größer als oder gleich",
-      "MAILCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die E-Mail Kapazität muss größer als oder gleich",
-      "FAXCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Das Fax Kapazität muss größer als oder gleich",
-      "OPENCHANNELCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der offene Kanal Kapazität muss größer als oder gleich",
-      "AUTOANSWERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer als oder gleich",
+      "FULLNAME_REQUIRED": "Vollständiger Name ist erforderlich",
+      "USERNAME_REQUIRED": "Benutzername ist erforderlich",
+      "EMAIL_REQUIRED": "E-Mail ist erforderlich",
+      "PASSWORD_REQUIRED": "Passwort ist erforderlich",
+      "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein",
+      "EMAIL_MUST_VALID": "E-Mail Format ungültig",
+      "ACCOUNTNAME_REQUIRED": "Konto ist erforderlich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "HOST_REQUIRED": "Host ist erforderlich",
+      "CHATCAPACITY_REQUIRED": "Kapazität Chat ist erforderlich",
+      "MAILCAPACITY_REQUIRED": "Kapazität E-Msil ist erforderlich",
+      "FAXCAPACITY_REQUIRED": "Kapazität Fax ist erforderlich",
+      "SMSCAPACITY_REQUIRED": "Kapazität SMS ist erforderlich",
+      "OPENCHANNELCAPACITY_REQUIRED": "Kapazität offener Kanal ist erforderlich",
+      "SIPEXPIRES_REQUIRED": "SIP-Ablaufdatum ist erforderlich",
+      "SIPPORT_REQUIRED": "SIP-Port ist erforderlich",
+      "UNCONDITIONALNUMBER_REQUIRED": "Zielrufnummer ist erforderlich",
+      "NOREPLYNUMBER_REQUIRED": "Nummer bei keiner Antwort ist erforderlich",
+      "BUSYNUMBER_REQUIRED": "Nummer bei Besetzt ist erforderlich",
+      "USERNAME_MUST_VALID_PATTERN": "Benutzername ungültig {{regex}}.",
+      "REMOTECONTROLPORT_REQUIRED": "Port für Remote ist erforderlich",
+      "CHATCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Kapazität Chat muss größer oder gleich sein als",
+      "MAILCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Kapazität E-Mail muss größer oder gleich sein als",
+      "FAXCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Kapazität Fax muss größer oder gleich sein als",
+      "OPENCHANNELCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Kapazität offener Kanal muss größer oder gleich sein als",
+      "AUTOANSWERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "AUTOANSWERDELAY_REQUIRED": "Pflichtfeld",
       "MONITOREXTENSION_REQUIRED": "Pflichtfeld",
       "ENCRYPTION": "SRTP (Secure Realtime Protocol) Verschlüsselung",
       "DTLSCERTFILE_REQUIRED": "Pflichtfeld",
       "DTLSPRIVATEKEY_REQUIRED": "Pflichtfeld",
-      "SECURE_PASSWORD_PATTERN": "Das Passwort muss mindestens 8 Zeichen lang sein und 1 Kleinbuchstabe, 1 Großbuchstabe, 1 Zahl und 1 Sonderzeichen haben ~! @",
+      "SECURE_PASSWORD_PATTERN": "Das Passwort muss mindestens 8 Zeichen lang sein und 1 Kleinbuchstaben, 1 Großbuchstaben, 1 Zahl und 1 Sonderzeichen enthalten",
       "ALLOWCODECS_REQUIRED": "Pflichtfeld",
       "CRUDPERMISSIONS_REQUIRED": "Pflichtfeld",
       "USERPROFILE_REQUIRED": "Pflichtfeld",
-      "PASSWORD_OLDPASSWORD_MATCH": "Das neue Passwort muss sich vom vorherigen Passwort unterscheiden",
+      "PASSWORD_OLDPASSWORD_MATCH": "Neues und altes Passwort dürfen nicht gleich sein",
       "CONFIRM_REQUIRED": "Pflichtfeld",
       "WHATSAPPCAPACITY_REQUIRED": "Pflichtfeld"
     },
     "ACCOUNT": "Konto",
-    "VOICE": "Voice",
+    "VOICE": "Anrufe",
     "CREATED_AT": "Erstellt am",
     "ROLE": "Rolle",
-    "PERSONAL_INFO": "Persönliche Infos",
+    "PERSONAL_INFO": "Persönliche Informationen",
     "DESCRIPTION": "Beschreibung",
-    "CHANGE_AVATAR": "Avatar ändern.",
+    "CHANGE_AVATAR": "Avatar ändern",
     "GENERAL": "Allgemein",
-    "INTERNAL": "Interne",
-    "TRANSPORT": "Verkehr",
+    "INTERNAL": "Intern",
+    "TRANSPORT": "Transport",
     "ALLOWCODECS": "Codecs erlaubt",
     "HELP": {
       "ALLOWCODECS": "Erlaubt Codecs in der Reihenfolge ihrer Präferenz",
       "TRANSPORT": "Festlegen der Standardeinstellungen für Transporte. Die Reihenfolge bestimmt den primären Standard.",
-      "HOST": "Wie finden Sie die Client-IP oder den Host-Namen. Wenn Sie möchten, dass das Telefon zu registrieren, verwenden Sie das Schlüsselwort Dynamic anstelle von Host-IP.",
-      "NAT": "Ändert das Verhalten von Sternchen für Clients hinter einer Firewall.Wenn der Komma-getrennten Optionen ist \"Nein\", Asterisk ignoriert alle anderen Einstellungen und die nat=No.",
-      "SIPEXPIRES": "Standardeinstellung: 120",
+      "HOST": "Wie finden Sie die Client-IP oder den Host-Namen um das Telefon zu registrieren, verwenden Sie das Schlüsselwort Dynamic anstelle von Host-IP.",
+      "NAT": "Ändert das Verhalten von Sternchen für Clients hinter einer Firewall. Wenn der Komma-getrennten Optionen ist \"Nein\", Asterisk ignoriert alle anderen Einstellungen und die nat=No.",
+      "SIPEXPIRES": "Standardeinstellung: 160",
       "SIPPORT": "Standardeinstellung: 5160",
-      "TYPE": "Legt das SIP-Rolle innerhalb der Sternchen. User: Wird verwendet, um die Authentifizierung für eingehende - Peer: für ausgehende Anrufe - Freund: Deckt sowohl die Eigenschaften der oben genannten.",
-      "CHATCAPACITY": "Null bedeutet unbegrenzt.",
-      "MAILCAPACITY": "Null bedeutet unbegrenzt.",
-      "FAXCAPACITY": "Null bedeutet unbegrenzt.",
-      "SMSCAPACITY": "Null bedeutet unbegrenzt.",
-      "OPENCHANNELCAPACITY": "Null bedeutet unbegrenzt.",
-      "CALLGROUP": "Legt der Agent callgroup",
-      "PICKUPGROUP": "Definiert die Gruppen in denen der Agent Anrufe annehmen können",
+      "TYPE": "Legt das SIP-Rolle innerhalb der Sternchen. User: eingehende Authentifizierung - Peer: für ausgehende Anrufe - Freund: Deckt beide Eigenschaften",
+      "CHATCAPACITY": "0 für unbegrenzt",
+      "MAILCAPACITY": "0 für unbegrenzt",
+      "FAXCAPACITY": "0 für unbegrenzt",
+      "SMSCAPACITY": "0 für unbegrenzt",
+      "OPENCHANNELCAPACITY": "0 für unbegrenzt",
+      "CALLGROUP": "Anrufgruppe",
+      "PICKUPGROUP": "Übernahmegruppe",
       "USERNAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
       "ENCRYPTION": "SRTP (Secure Realtime Protocol) Verschlüsselung",
       "LAST_PASSWORD_RESET_AT": "Letztes Datum und Uhrzeit, zu der das Passwort geändert wurde. Wenn die Allgemeinen Einstellungen für Secure Suite aktiviert sind, läuft das Passwort nach 90 Tagen ab.",
       "DTLSCERTFILE": "Verknüpfen Sie mit dem gültigen TLS-Zertifikat (.crt-Datei). Standardwert: '/etc/pki/tls/certs/motion.crt'.",
       "DTLSPRIVATEKEY": "Verknüpfen Sie mit dem privaten Schlüssel des Zertifikats (.key-Datei). Standardwert: '/etc/pki/tls/private/motion.key'.",
       "SAVE_PERMISSIONS": "Jeder Abschnitt, der ausstehende Änderungen enthält, wird gespeichert",
-      "CUSTOM_DASHBOARDS_PERMISSIONS": "Berechtigungen für benutzerdefinierte Dashboards werden im Modul Tools verwaltet",
+      "CUSTOM_DASHBOARDS_PERMISSIONS": "Berechtigungen für benutzerdefinierte Dashboards werden im Werkzeuge-Modul verwaltet",
       "APIKEY": "Verwenden Sie die Schaltfläche \"API-Schlüsselmanager\" in der Symbolleiste, um diesen Schlüssel zu verwalten",
-      "ENABLEAUTOMATICSCREENRECORDING": "Die Funktionalität ist nur für Sprachkanäle verfügbar",
-      "BLOCKED": "Zugriff sperren / entsperren",
-      "DISABLED": "Zum Deaktivieren auswählen / Zum Reaktivieren deaktivieren",
-      "WHATSAPPCAPACITY": "Maximale Anzahl gleichzeitiger Kanalinteraktionen pro Agent (0 = unbegrenzt)",
+      "ENABLEAUTOMATICSCREENRECORDING": "Funktionalität ist nur für Sprachkanäle verfügbar",
+      "BLOCKED": "Zugriff sperren/entsperren",
+      "DISABLED": "Auswählen zum Aktivieren",
+      "WHATSAPPCAPACITY": "Maximale Anzahl gleichzeitiger Whatsapp-Interaktionen pro Agent (0 = unbegrenzt)",
       "MASK_SENSITIVE_DATA": "Maskieren Sie vertrauliche Daten in der gesamten Anwendung (z. B. Telefonnummern und E-Mail-Adressen).",
       "WSS_PORT": "Standard: 8089"
     },
-    "NEW_PASSWORD": "Neues Kennwort",
+    "NEW_PASSWORD": "Neues Passwort",
     "CONFIRM_PASSWORD": "Passwort bestätigen",
     "CHANGE_PASSWORD": "Passwort ändern",
-    "CHANGEPASSWORD_AGENT": "Passwort ändern",
-    "CHANGEPASSWORD_USER": "Passwort ändern",
-    "CHANGEPASSWORD_TELEPHONE": "Passwort ändern",
-    "LOGININPAUSE": "Geben Sie Ihren Benutzernamen und Ihr Passwort In der Pause",
+    "CHANGEPASSWORD_AGENT": "Agent",
+    "CHANGEPASSWORD_USER": "Nutzer",
+    "CHANGEPASSWORD_TELEPHONE": "Telefon",
+    "LOGININPAUSE": "Pause nach Anmelden",
     "HOST": "Host",
     "NAT": "NAT",
-    "CHANSPY": "ChanSpy",
+    "CHANSPY": "Listen-In",
     "OTHER_CHANNELS": "Andere Kanäle",
-    "CHATCAPACITY": "Chat Kapazität",
-    "MAILCAPACITY": "E-Kapazität",
-    "FAXCAPACITY": "Fax Kapazität",
-    "SMSCAPACITY": "Sms-Kapazität",
-    "OPENCHANNELCAPACITY": "Offener Kanal Kapazität",
+    "CHATCAPACITY": "Kapazität Chats",
+    "MAILCAPACITY": "Kapazität E-Mail",
+    "FAXCAPACITY": "Kapazität Fax",
+    "SMSCAPACITY": "Kapazität SMSW",
+    "OPENCHANNELCAPACITY": "Kapazität offener Kanal",
     "MOTIONBAR": "Motion Bar",
     "SETTINGS": "Einstellungen",
-    "AUTOANSWER": "\"Autom. Antwort\"",
+    "AUTOANSWER": "Auto-Antwort",
     "ENABLESETTINGS": "Einstellungen aktivieren",
     "CALL_FORWARDING": "Anrufweiterleitung",
-    "UNCONDITIONAL": "Unbedingte",
-    "UNCONDITIONALNUMBER": "Uneingeschränkte Anzahl",
-    "NOREPLY": "Keine Antwort",
-    "NOREPLYNUMBER": "\"Keine Antwort\"-Nummer",
-    "BUSY": "Besetzt",
-    "BUSYNUMBER": "Nummer besetzt",
-    "REMOTE_CONTROL": "Fernbedienung",
-    "REMOTECONTROL": "Fernbedienung",
-    "REMOTECONTROLPORT": "Fernbedienung",
+    "UNCONDITIONAL": "Generell",
+    "UNCONDITIONALNUMBER": "Nummer Weiterleitung generell",
+    "NOREPLY": "Bei keiner Antwort",
+    "NOREPLYNUMBER": "Nummer Weiterleitung keine Antwort",
+    "BUSY": "Bei Besetzt",
+    "BUSYNUMBER": "Nummer Weiterleitung Besetzt",
+    "REMOTE_CONTROL": "Remote-Nebenstelle",
+    "REMOTECONTROL": "Remote-Nebenstelle",
+    "REMOTECONTROLPORT": "Port Remote-Nebenstelle",
     "SIP": "SIP",
-    "SIPEXPIRES": "SIP läuft [sec]",
+    "SIPEXPIRES": "SIP-Ablaufdatum",
     "SIPPORT": "SIP-Port",
-    "PENALTY": "Strafe",
+    "PENALTY": "Verzögerung",
     "ACCOUNTNAME": "Account Name",
     "ADD_TELEPHONE": "Telefon hinzufügen",
     "EDIT_TELEPHONE": "Telefon bearbeiten",
     "DELETE_TELEPHONE": "Telefon löschen",
     "TEAMS": "Teams",
     "DELETE_TEAM": "Team löschen",
-    "AGENTADD_TEAM": "Hinzufügen von Agenten zu einer Gruppe",
-    "EDIT_TEAM": "Team bearbeiten.",
+    "AGENTADD_TEAM": "Agenten zu einem Team hinzufügen",
+    "EDIT_TEAM": "Team bearbeiten",
     "TYPE": "Typ",
-    "TELEPHONES": "Telefone",
-    "CALLERID": "Die Anrufer-ID",
-    "ENABLERECORDING": "Aktivieren der Aufzeichnung",
+    "TELEPHONES": "Endgeräte",
+    "CALLERID": "Anrufer-ID",
+    "ENABLERECORDING": "Aufzeichnung aktiv",
     "STAFF": "Personal",
-    "ID": "Id",
+    "ID": "ID",
     "NEW_USER": "Neuer Benutzer",
     "NEW_AGENT": "Neuer Agent",
     "NEW_TELEPHONE": "Neues Telefon",
     "NEW_TEAM": "Neues Team",
     "ADD_TEAM": "Team hinzufügen",
-    "JOIN_QUEUE": "Melden Sie Warteschlange",
+    "JOIN_QUEUE": "In Warteschlange beitreten",
     "CAPACITY": "Kapazität",
     "AUTOINTERNAL": "Interne Nummer automatisch generieren",
-    "ADD_AGENT_TO_TEAM": "Hinzufügen von Agenten zu einer Gruppe",
-    "TEAMADD_AGENT": "Agent zu Gruppe hinzufügen",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
+    "ADD_AGENT_TO_TEAM": "Agenten zum Team hinzufügen",
+    "TEAMADD_AGENT": "Zum Team hinzufügen",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
     "PERMISSIONS": "Berechtigungen",
-    "ADD_AGENT_TO_QUEUE": "Agent zur Warteschlange hinzufügen",
+    "ADD_AGENT_TO_QUEUE": "Agenten zur Warteschlange hinzufügen",
     "ALL_MODULES_AVAILABLE": "Alle Module verfügbar",
-    "CALLGROUP": "Gruppenruf",
+    "CALLGROUP": "Gruppenanruf",
     "PICKUPGROUP": "Übernahmegruppe",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agent in der Warteschlange Kampagnen hinzufügen",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Agent Voice Warteschlangen hinzufügen",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Agent zu chatten Warteschlangen hinzufügen",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Agent Mail Warteschlangen hinzufügen",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Agent sms-Warteschlangen hinzufügen",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Agent zu offenen Kanal Warteschlangen hinzufügen",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Agent fax Warteschlangen hinzufügen",
-    "QUEUEADD_USER_VOICE_INBOUND": "Benutzer stimme Warteschlangen hinzufügen",
-    "QUEUEADD_USER_CHAT_INBOUND": "Benutzer zu chatten Warteschlangen hinzufügen",
-    "QUEUEADD_USER_MAIL_INBOUND": "Benutzer Mail Warteschlangen hinzufügen",
-    "QUEUEADD_USER_SMS_INBOUND": "Benutzer von SMS-Warteschlangen hinzufügen",
-    "QUEUEADD_USER_OPENCHANNEL_INBOUND": "Benutzer zum offenen Kanal Warteschlangen hinzufügen",
-    "QUEUEADD_USER_FAX_INBOUND": "Benutzer fax Warteschlangen hinzufügen",
-    "ALL_TEAMS": "Alle Mannschaften",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Agenten hinzufügen - ausgehende Anrufe",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Agenten hinzufügen - eingehende Anrufe",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Agenten hinzufügen - Chat-Warteschlangen",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Agenten hinzufügen - E-Mail-Warteschlangen",
+    "ADD_AGENT_TO_SMS_QUEUES": "Agenten hinzufügen - SMS-Warteschlangen",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Agenten hinzufügen - offener Kanal-Warteschlangen",
+    "ADD_AGENT_TO_FAX_QUEUES": "Agenten hinzufügen - Fax-Warteschlangen",
+    "QUEUEADD_USER_VOICE_INBOUND": "Nutzer hinzufügen - eingehende Anrufe",
+    "QUEUEADD_USER_CHAT_INBOUND": "Nutzer hinzufügen - eingehende Chats",
+    "QUEUEADD_USER_MAIL_INBOUND": "Nutzer hinzufügen - eingehende E-Mails",
+    "QUEUEADD_USER_SMS_INBOUND": "Nutzer hinzufügen - eingehende SMS",
+    "QUEUEADD_USER_OPENCHANNEL_INBOUND": "Nutzer hinzufügen - eingehender offener Kanal",
+    "QUEUEADD_USER_FAX_INBOUND": "Nutzer hinzufügen - eingehende Faxe",
+    "ALL_TEAMS": "Alle Teams",
     "SELECTED_TEAMS": "Ausgewählte Teams",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Queue Kampagnen",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Ausgewählte Warteschlange Kampagnen",
-    "ALL_QUEUES_VOICE_INBOUND": "Alle Warteschlangen",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Ausgewählte Voice Warteschlangen",
-    "ALL_QUEUES_CHAT_INBOUND": "Alle Chat Warteschlangen",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Ausgewählte Chat-warteschlangen",
-    "ALL_QUEUES_MAIL_INBOUND": "Alle E-Mail-Warteschlangen",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Ausgewählte Mail Warteschlangen",
-    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-Warteschlangen",
-    "SELECTED_QUEUES_SMS_INBOUND": "Ausgewählte SMS-Warteschlangen",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle offenen Kanal Warteschlangen",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Ausgewählten Offenen Kanal Warteschlangen",
-    "ALL_QUEUES_FAX_INBOUND": "Alle Fax Warteschlangen",
-    "SELECTED_QUEUES_FAX_INBOUND": "Ausgewählte Fax Warteschlangen",
+    "ALL_QUEUE_CAMPAIGNS": "Alle Warteschlangen - ausgehende Anrufe",
+    "SELECTED_QUEUE_CAMPAIGNS": "Gewählte Warteschlangen - ausgehende Anrufe",
+    "ALL_VOICE_QUEUES": "Alle Warteschlangen - eingehende Anrufe",
+    "SELECTED_VOICE_QUEUES": "Ausgewählte Warteschlangen - eingehende Anrufe",
+    "ALL_CHAT_QUEUES": "Alle Warteschlangen - Chat",
+    "SELECTED_CHAT_QUEUES": "Ausgewählte Warteschlangen - Chat",
+    "ALL_MAIL_QUEUES": "Alle Warteschlangen - E-Mail",
+    "SELECTED_MAIL_QUEUES": "Ausgewählte Warteschlangen - E-Mail",
+    "ALL_SMS_QUEUES": "Alle Warteschlangen - SMS",
+    "SELECTED_SMS_QUEUES": "Ausgewählte Warteschlangen - SMS",
+    "ALL_OPENCHANNEL_QUEUES": "Alle Warteschlangen - offener Kanal",
+    "SELECTED_OPENCHANNEL_QUEUES": "Ausgewählte Warteschlangen - offener Kanal",
+    "ALL_FAX_QUEUES": "Alle Warteschlangen - Fax",
+    "SELECTED_FAX_QUEUES": "Ausgewählte Warteschlangen - Fax",
     "VOICEMAIL": "Voicemail",
-    "SHOWWEBCONTROL": "Anzeigen Web Control",
+    "SHOWWEBCONTROL": "WebControl anzeigen",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
+    "OF": "von",
     "CALLFORWARDING": "Anrufweiterleitung",
-    "DND": "Während der Pause nicht stören",
-    "UNANSWEREDCALLBADGE": "Zeige unbeantwortete Anruf Abzeichen",
-    "ENABLEDTMFTONE": "Dtmf-Töne aktivieren",
-    "AUTOANSWERDELAY": "Auto Antwortverzögerung",
+    "DND": "Nicht stören",
+    "UNANSWEREDCALLBADGE": "Badge unbeantwortete Anrufe",
+    "ENABLEDTMFTONE": "DMFT-Töne aktivieren",
+    "AUTOANSWERDELAY": "Automatische Antwort nach",
     "ENCRYPTION": "Verschlüsselung",
     "CHANNELS": "Kanäle",
     "CHAT": "Chat",
-    "SMS": "Sms",
+    "SMS": "SMS",
     "OPENCHANNEL": "Offener Kanal",
     "FAX": "Fax",
-    "QUEUEADD_USER_VOICE_OUTBOUND": "Benutzer in Warteschlange Kampagnen hinzufügen",
-    "MONITOREXTENSION": "Anrufe an die Nebenstelle des Benutzers aufzeichnen",
+    "QUEUEADD_USER_VOICE_OUTBOUND": "Nutzer zu Warteschlange für eingehende Anrufe hinzufügen",
+    "MONITOREXTENSION": "Nebenstelle des Nutzers aufzeichnen",
     "NO_PASSWORD_CHANGE": "Keine Passwortänderung",
     "SECURITY_SUITE": "Sicherheitssuite",
-    "LAST_PASSWORD_RESET_AT": "Letzte Passwort zurücksetzen um",
-    "SIP_WEBRTC": "Schluck",
-    "SETTINGS_WEBRTC": "die Einstellungen",
+    "LAST_PASSWORD_RESET_AT": "Passwort zuletzt zurückgesetzt am:",
+    "SIP_WEBRTC": "SIP/WebRTC",
+    "SETTINGS_WEBRTC": "Einstellungen",
     "WEBRTC": "WebRTC",
     "DTLSCERTFILE": "TLS-Zertifikat",
-    "DTLSPRIVATEKEY": "Der private Schlüssel des TLS-Zertifikats",
-    "EDITPERMISSIONS": "Bearbeiten von Berechtigungen",
-    "READANDEDIT": "Lesen, Bearbeiten",
-    "READANDEDITANDDELETE": "Lesen, Bearbeiten, Löschen",
-    "GENERAL_PERMISSIONS": "Allgemeines",
-    "ENABLEMESSENGER": "Aktivieren Sie den internen Messenger",
-    "OUTBOUNDPROXY": "Oubound-Proxy",
+    "DTLSPRIVATEKEY": "Privater Schlüssel des TLS-Zertifikats",
+    "EDITPERMISSIONS": "Berechtigungen verwalten",
+    "READANDEDIT": "Lesen und Bearbeiten",
+    "READANDEDITANDDELETE": "Lesen, Bearbeiten und Löschen",
+    "GENERAL_PERMISSIONS": "Allgemein",
+    "ENABLEMESSENGER": "Internen Messenger aktivieren",
+    "OUTBOUNDPROXY": "Outbound-Proxy",
     "PHONE": "Telefon",
     "MOBILE": "Handy, Mobiltelefon",
     "ALIAS": "Alias",
     "ENABLEJAWSINTEGRATION": "Jaws-Integration aktivieren",
     "PREFIXREQUIRED": "Präfix erforderlich",
-    "ENABLEVIDEORECORDING": "Aktiviere Videoaufnahme",
+    "ENABLEVIDEORECORDING": "Videoaufzeichnung aktivieren",
     "OLD_PASSWORD": "Altes Passwort",
     "ALL_CHATQUEUES": "Alle Chat-Warteschlangen",
     "ALL_CHATWEBSITES": "Alle Chat-Websites",
     "ALL_FAXACCOUNTS": "Alle Faxkonten",
-    "ALL_FAXQUEUES": "Alle Faxwarteschlangen",
+    "ALL_FAXQUEUES": "Alle Fax-Warteschlangen",
     "ALL_MAILACCOUNTS": "Alle E-Mail-Konten",
     "ALL_MAILQUEUES": "Alle E-Mail-Warteschlangen",
-    "ALL_OPENCHANNELACCOUNTS": "Alle offenen Channel-Konten",
-    "ALL_OPENCHANNELQUEUES": "Alle offenen Kanalwarteschlangen",
+    "ALL_OPENCHANNELACCOUNTS": "Alle offener Kanal-Konten",
+    "ALL_OPENCHANNELQUEUES": "Alle offener Kanal-Warteschlangen",
     "ALL_PROJECTS": "Alle Cally Square-Projekte",
     "ALL_QUEUECAMPAIGNS": "Alle Queue-Kampagnen",
     "ALL_SMSACCOUNTS": "Alle SMS-Konten",
@@ -268,32 +268,32 @@
     "SELECTED_CHATQUEUES": "Ausgewählte E-Mail-Warteschlangen",
     "SELECTED_CHATWEBSITES": "Ausgewählte Chat-Websites",
     "SELECTED_FAXACCOUNTS": "Ausgewählte Faxkonten",
-    "SELECTED_FAXQUEUES": "Ausgewählte Faxwarteschlangen",
+    "SELECTED_FAXQUEUES": "Ausgewählte Fax-Warteschlangen",
     "SELECTED_MAILACCOUNTS": "Ausgewählte E-Mail-Konten",
     "SELECTED_MAILQUEUES": "Ausgewählte Chat-Warteschlangen",
-    "SELECTED_OPENCHANNELACCOUNTS": "Ausgewählte offene Channel-Konten",
-    "SELECTED_OPENCHANNELQUEUES": "Ausgewählte offene Kanalwarteschlangen",
+    "SELECTED_OPENCHANNELACCOUNTS": "Ausgewählte offener Kanal-Konten",
+    "SELECTED_OPENCHANNELQUEUES": "Ausgewählte offene Kanal-Warteschlangen",
     "SELECTED_PROJECTS": "Ausgewählte Projekte von Cally Square",
     "SELECTED_QUEUECAMPAIGNS": "Ausgewählte Queue-Kampagnen",
     "SELECTED_SMSACCOUNTS": "Ausgewählte SMS-Konten",
     "SELECTED_SMSQUEUES": "Ausgewählte SMS-Warteschlangen",
-    "SELECTED_VOICEQUEUES": "Ausgewählte Sprachwarteschlangen",
+    "SELECTED_VOICEQUEUES": "Ausgewählte Anruf-Warteschlangen",
     "USERADD_CHATQUEUES": "Chat-Warteschlange zum Benutzer hinzufügen",
     "USERADD_CHATWEBSITES": "Chat-Website zum Benutzer hinzufügen",
     "USERADD_FAXACCOUNTS": "Faxkonto zum Benutzer hinzufügen",
-    "USERADD_FAXQUEUES": "Faxwarteschlange zum Benutzer hinzufügen",
+    "USERADD_FAXQUEUES": "Fax-Warteschlange zum Benutzer hinzufügen",
     "USERADD_MAILACCOUNTS": "E-Mail-Konto zum Benutzer hinzufügen",
     "USERADD_MAILQUEUES": "E-Mail-Warteschlange zum Benutzer hinzufügen",
-    "USERADD_OPENCHANNELACCOUNTS": "Open Channel-Konto zum Benutzer hinzufügen",
-    "USERADD_OPENCHANNELQUEUES": "Open Channel-Warteschlange zum Benutzer hinzufügen",
+    "USERADD_OPENCHANNELACCOUNTS": "Offener Kanal-Konto zum Benutzer hinzufügen",
+    "USERADD_OPENCHANNELQUEUES": "Offener Kanal-Warteschlange zum Benutzer hinzufügen",
     "USERADD_PROJECTS": "Cally Square-Projekt zum Benutzer hinzufügen",
     "USERADD_QUEUECAMPAIGNS": "Queue-Kampagne zum Benutzer hinzufügen",
     "USERADD_SMSACCOUNTS": "SMS-Konto zum Benutzer hinzufügen",
     "USERADD_SMSQUEUES": "SMS-Warteschlange zum Benutzer hinzufügen",
-    "USERADD_VOICEQUEUES": "Sprachwarteschlange zum Benutzer hinzufügen",
-    "HOTDESK": "Heißer Schreibtisch",
+    "USERADD_VOICEQUEUES": "Anruf-Warteschlange zum Benutzer hinzufügen",
+    "HOTDESK": "Wechselnder Arbeitsplatz",
     "ADD_USERPROFILE": "Benutzerprofil hinzufügen",
-    "CANCEL": "Stornieren",
+    "CANCEL": "Abbrechen",
     "CLONE_USERPROFILE": "Benutzerprofil klonen",
     "CLOSE": "Schließen",
     "CONFIRM": "Bestätigen",
@@ -314,53 +314,79 @@
     "PERMISSIONS_SELECTED_RESOURCES": "Ausgewählte Ressourcen",
     "PERMISSIONS_SELECT_REPORT_TYPE": "Wählen Sie den Berichtstyp",
     "PERMISSIONS_SELECT_SECTION": "Wählen Sie einen Abschnitt aus",
-    "PERMISSIONS_UNAUTHORIZED_REDIRECT_MESSAGE": "Sie dürfen nicht auf den ausgewählten Bereich zugreifen",
+    "PERMISSIONS_UNAUTHORIZED_REDIRECT_MESSAGE": "Kein Zugriff auf den ausgewählten Bereich",
     "PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE": "Unbefugte Handlung",
-    "PERMISSIONS_WARNING_CLOSE": "Du hast nicht gespeicherte Änderungen. Möchten Sie den Vorgang wirklich ohne Speichern beenden?",
+    "PERMISSIONS_WARNING_CLOSE": "Es wurden Änderungen nicht gespeichert. Fortfahren?",
     "PERMISSIONS_WARNING_ENABLE_ALL": "Alle {{sectionName}} Unterabschnitte und ihre Ressourcen werden aktiviert. Sind Sie sicher, dass Sie fortfahren möchten?",
-    "QUEUES_ASSOCIATION": "{{channel}} Queues Association",
+    "QUEUES_ASSOCIATION": "{{channel}} Warteschlangen-Zuweisung",
     "READ_PERMISSION": "Lesen",
     "REPORT_TYPE": "Berichtstyp",
     "SECTIONS": "Abschnitte",
     "SUMMARY": "Zusammenfassung",
-    "TEAMS_ASSOCIATION": "Vereinigung der Mannschaften",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
     "USERPROFILE": "Benutzerprofil",
     "USERPROFILES": "Benutzerprofil",
-    "PERMISSIONS_UNAUTHORIZED_CREATION_MESSAGE": "Sie dürfen die Ressource nicht erstellen",
-    "VIDEOSUPPORT": "Video-Unterstützung",
+    "PERMISSIONS_UNAUTHORIZED_CREATION_MESSAGE": "Keine Berechtigung zum Erstellen der Ressource",
+    "VIDEOSUPPORT": "Unterstützt Video",
     "APIKEY": "API-Schlüssel",
     "APIKEYMANAGER_USER": "API Key Manager",
-    "GENERATE": "(Regenerieren",
+    "GENERATE": "Erneut generieren",
     "MANAGE_API_KEY": "API-Schlüsselmanager",
-    "REMOVE": "Löschen",
-    "ENABLEAUTOMATICSCREENRECORDING": "Aktivieren Sie die automatische Bildschirmaufnahme",
-    "ENABLESCREENRECORDINGBYAGENT": "Aktivieren Sie die Bildschirmaufzeichnung nach Agent",
-    "ENABLEVIDEOECORDING": "Videoaufnahme aktivieren",
+    "REMOVE": "Entfernen",
+    "ENABLEAUTOMATICSCREENRECORDING": "Automatische Bildschirmaufzeichnung aktivieren",
+    "ENABLESCREENRECORDINGBYAGENT": "Bildschirmaufzeichnung durch Agenten aktivieren",
+    "ENABLEVIDEOECORDING": "Videoaufzeichnung aktivieren",
     "BLOCKED": "Gesperrt",
     "DISABLED": "Deaktiviert",
-    "REGENERATE": "Regenerieren",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-Warteschlangen",
+    "REGENERATE": "Erneut generieren",
+    "ALL_WHATSAPP_QUEUES": "Alle WhatsApp-Warteschlangen",
     "ALL_WHATSAPPACCOUNTS": "Alle WhatsApp-Konten",
     "ALL_WHATSAPPQUEUES": "Alle Whataspp-Warteschlangen",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Agent zu WhatsApp-Warteschlangen hinzufügen",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Agenten zu WhatsApp-Warteschlangen hinzufügen",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Benutzer zu WhatsApp-Warteschlangen hinzufügen",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Ausgewählte WhatsApp-Warteschlangen",
+    "SELECTED_WHATSAPP_QUEUES": "Ausgewählte WhatsApp-Warteschlangen",
     "SELECTED_WHATSAPPACCOUNTS": "Ausgewählte WhatsApp-Konten",
     "SELECTED_WHATSAPPQUEUES": "Ausgewählte WhatsApp-Warteschlangen",
     "USERADD_WHATSAPPACCOUNTS": "WhatsApp-Konto zum Benutzer hinzufügen",
-    "USERADD_WHATSAPPQUEUES": "Fügen Sie dem Benutzer die Whataspp-Warteschlange hinzu",
+    "USERADD_WHATSAPPQUEUES": "Whataspp-Warteschlange dem Benutzer hinzufügen",
     "WHATSAPP": "WhatsApp Connector",
-    "WHATSAPPCAPACITY": "WhatsApp Connector-Kapazität",
+    "WHATSAPPCAPACITY": "Kapazität Whatsapp",
     "MASK_SENSITIVE_DATA": "Sensitive Daten maskieren",
     "WSS_PORT": "WSS-Port",
     "ATTACHMENTS": "Anhänge",
     "CALLYSQUARE_RECORDINGS": "Cally Square-Aufnahmen",
-    "CONTACT_MANAGER_LISTS": "Kontaktmanagerlisten",
+    "CONTACT_MANAGER_LISTS": "Kontaktmanager Listen",
     "DOWNLOADS": "Downloads",
     "DOWNLOAD_PERMISSIONS": "Download-Berechtigungen",
     "JSCRIPTY_SESSIONS": "Jscripty-Sitzungen",
     "OMNICHANNEL_INTERACTIONS": "Omnichannel-Interaktionen",
-    "SCREEN_RECORDINGS": "Bildschirmaufnahmen",
-    "VOICE_RECORDINGS": "Sprachaufnahmen"
+    "SCREEN_RECORDINGS": "Bildschirmaufzeichnungen",
+    "VOICE_RECORDINGS": "Sprachaufzeichnungen",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorieren Sie den Unterbrechungsstatus des Agenten für Vorschauanrufe",
+    "SELECT_RECALLME_CAMPAIGN": "Wählen Sie „Recall Me“-Kampagne",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agenten hinzufügen - ausgehende Anrufe",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Agenten hinzufügen - eingehende Anrufe",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Agenten hinzufügen - Chat-Warteschlangen",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Agenten hinzufügen - E-Mail-Warteschlangen",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Agenten hinzufügen - SMS-Warteschlangen",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Agenten hinzufügen - offener Kanal-Warteschlangen",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Agenten hinzufügen - Fax-Warteschlangen",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Warteschlangen - ausgehende Anrufe",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Gewählte Warteschlangen - ausgehende Anrufe",
+    "ALL_QUEUES_VOICE_INBOUND": "Alle Warteschlangen - eingehende Anrufe",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Ausgewählte Warteschlangen - eingehende Anrufe",
+    "ALL_QUEUES_CHAT_INBOUND": "Alle Warteschlangen - Chat",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Ausgewählte Warteschlangen - Chat",
+    "ALL_QUEUES_MAIL_INBOUND": "Alle Warteschlangen - E-Mail",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Ausgewählte Warteschlangen - E-Mail",
+    "ALL_QUEUES_SMS_INBOUND": "Alle Warteschlangen - SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Ausgewählte Warteschlangen - SMS",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle Warteschlangen - offener Kanal",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Ausgewählte Warteschlangen - offener Kanal",
+    "ALL_QUEUES_FAX_INBOUND": "Alle Warteschlangen - Fax",
+    "SELECTED_QUEUES_FAX_INBOUND": "Ausgewählte Warteschlangen - Fax",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-Warteschlangen",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Agenten zu WhatsApp-Warteschlangen hinzufügen",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Ausgewählte WhatsApp-Warteschlangen"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/en.json b/public/app/main/apps/staff/i18n/en.json
index 556f7a7..2d3a980 100644
--- a/public/app/main/apps/staff/i18n/en.json
+++ b/public/app/main/apps/staff/i18n/en.json
@@ -112,6 +112,8 @@
     "ALLOWCODECS": "Allowed Codecs",
     "DISABLED": "Deactivated",
     "BLOCKED": "Locked",
+    "AD_SSO_ENABLED": "Active Directory SSO",
+    "AUTHENTICATION": "Authentication",
     "HELP": {
       "DISABLED": "select to deactivate / unselect to reactivate",
       "BLOCKED": "Lock / Unlock access",
@@ -123,7 +125,7 @@
       "TRANSPORT": "Set the default transports in order of preference",
       "HOST": "How to find the client - IP or host name. If you want the phone to register itself, use the keyword dynamic instead of Host IP",
       "NAT": "Changes the behaviour of Asterisk for clients behind a firewall. If any of the comma-separated options is 'no', Asterisk will ignore other settings and set nat=no",
-      "SIPEXPIRES": "Default: 120",
+      "SIPEXPIRES": "Default: 160",
       "SIPPORT": "Default: 5160",
       "TYPE": "Determines the SIP role within asterisk. User: used to authenticate incoming - Peer: for outgoing calls - Friend: covers both characteristics of the above",
       "CHATCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
@@ -140,7 +142,8 @@
       "CUSTOM_DASHBOARDS_PERMISSIONS": "Custom Dashboards permissions are managed in the Tools module",
       "ENABLEAUTOMATICSCREENRECORDING": "The functionality is available only for voice channel",
       "MASK_SENSITIVE_DATA": "Mask any sensitive data throughout the application (e.g. phone numbers and email addresses)",
-      "WSS_PORT": "Default: 8089"
+      "WSS_PORT": "Default: 8089",
+      "AD_SSO_ENABLED": "Login in with your Active Directory credentials"
     },
     "NEW_PASSWORD": "New Password",
     "CONFIRM_PASSWORD": "Confirm Password",
@@ -207,14 +210,14 @@
     "ALL_MODULES_AVAILABLE": "All modules available",
     "CALLGROUP": "Call Group",
     "PICKUPGROUP": "Pickup Group",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Add Agent to WhatsApp Queues",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Add Agent to Queue Campaigns",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Add Agent to Voice Queues",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Add Agent to Chat Queues",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Add Agent to Email Queues",
+    "ADD_AGENT_TO_SMS_QUEUES": "Add Agent to SMS Queues",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Add Agent to WhatsApp Queues",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Add Agent to Open Channel Queues",
+    "ADD_AGENT_TO_FAX_QUEUES": "Add Agent to Fax Queues",
     "QUEUEADD_USER_VOICE_INBOUND": "Add User to Voice Queues",
     "QUEUEADD_USER_CHAT_INBOUND": "Add User to Chat Queues",
     "QUEUEADD_USER_MAIL_INBOUND": "Add User to Email Queues",
@@ -225,22 +228,22 @@
     "ALL_TEAMS": "All Teams",
     "SELECTED_TEAMS": "Selected Teams",
     "SELECTED_AGENTS": "Selected Agents",
-    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
-    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
-    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
-    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
-    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
-    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "All WhatsApp Queues",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Selected WhatsApp Queues",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
-    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
-    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues",
+    "ALL_QUEUE_CAMPAIGNS": "All Queue Campaigns",
+    "SELECTED_QUEUE_CAMPAIGNS": "Selected Queue Campaigns",
+    "ALL_VOICE_QUEUES": "All Voice Queues",
+    "SELECTED_VOICE_QUEUES": "Selected Voice Queues",
+    "ALL_CHAT_QUEUES": "All Chat Queues",
+    "SELECTED_CHAT_QUEUES": "Selected Chat Queues",
+    "ALL_MAIL_QUEUES": "All Email Queues",
+    "SELECTED_MAIL_QUEUES": "Selected Email Queues",
+    "ALL_SMS_QUEUES": "All SMS Queues",
+    "SELECTED_SMS_QUEUES": "Selected SMS Queues",
+    "ALL_WHATSAPP_QUEUES": "All WhatsApp Queues",
+    "SELECTED_WHATSAPP_QUEUES": "Selected WhatsApp Queues",
+    "ALL_OPENCHANNEL_QUEUES": "All Open Channel Queues",
+    "SELECTED_OPENCHANNEL_QUEUES": "Selected Open Channel Queues",
+    "ALL_FAX_QUEUES": "All Fax Queues",
+    "SELECTED_FAX_QUEUES": "Selected Fax Queues",
     "VOICEMAIL": "Voicemail",
     "SHOWWEBCONTROL": "Typology",
     "PAGE": "Page",
@@ -368,6 +371,32 @@
     "SCREEN_RECORDINGS": "Screen Recordings",
     "JSCRIPTY_SESSIONS": "Jscripty Sessions",
     "CONTACT_MANAGER_LISTS": "Contact Manager Lists",
-    "CALLYSQUARE_RECORDINGS": "Cally Square Recordings"
+    "CALLYSQUARE_RECORDINGS": "Cally Square Recordings",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignore agent break status for preview calls",
+    "SELECT_RECALLME_CAMPAIGN": "Select Recall Me Campaign",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Add Agent to WhatsApp Queues",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
+    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
+    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
+    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
+    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
+    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "All WhatsApp Queues",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Selected WhatsApp Queues",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
+    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
+    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/es.json b/public/app/main/apps/staff/i18n/es.json
index 42b1c9b..31e543c 100644
--- a/public/app/main/apps/staff/i18n/es.json
+++ b/public/app/main/apps/staff/i18n/es.json
@@ -14,7 +14,7 @@
       "NAT": "Cambia el comportamiento de Asterisk para clientes detrás de un firewall. Si alguna de las opciones separadas por comas es 'no', Asterisk ignorará otras configuraciones y configurará nat = no",
       "OPENCHANNELCAPACITY": "Número máximo de interacciones de canal simultáneas por agente (0 = ilimitado)",
       "PICKUPGROUP": "Los grupos en los que el agente puede capturar llamadas",
-      "SIPEXPIRES": "Valor predeterminado: 120",
+      "SIPEXPIRES": "Valor predeterminado: 160",
       "SIPPORT": "Por defecto: 5160",
       "SMSCAPACITY": "Número máximo de interacciones de canal simultáneas por agente (0 = ilimitado)",
       "TRANSPORT": "Establezca los transportes predeterminados en orden de preferencia",
@@ -84,12 +84,12 @@
     "ALLOWCODECS": "Códecs permitidos",
     "ALL_AGENTS": "Todos los agentes",
     "ALL_MODULES_AVAILABLE": "Todos los módulos disponibles",
-    "ALL_QUEUES_CHAT_INBOUND": "Todas las colas de chat",
-    "ALL_QUEUES_FAX_INBOUND": "Todas las colas de fax",
-    "ALL_QUEUES_MAIL_INBOUND": "Todas Las Colas de Correo Electrónico",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas las colas de canales abiertos",
-    "ALL_QUEUES_SMS_INBOUND": "Todas las Colas de SMS",
-    "ALL_QUEUES_VOICE_INBOUND": "Todas las colas de voz",
+    "ALL_CHAT_QUEUES": "Todas las colas de chat",
+    "ALL_FAX_QUEUES": "Todas las colas de fax",
+    "ALL_MAIL_QUEUES": "Todas Las Colas de Correo Electrónico",
+    "ALL_OPENCHANNEL_QUEUES": "Todas las colas de canales abiertos",
+    "ALL_SMS_QUEUES": "Todas las Colas de SMS",
+    "ALL_VOICE_QUEUES": "Todas las colas de voz",
     "ALL_QUEUES_VOICE_OUTBOUND": "Todas Las Colas de Campañas",
     "ALL_TEAMS": "Todos los equipos",
     "ALL_USERS": "Todos los usuarios",
@@ -183,13 +183,13 @@
     "PHONE": "Teléfono",
     "PHONE_NUMBER": "Número de teléfono",
     "PICKUPGROUP": "Grupo de captura",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Agregar Agente a Cola de Chat",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Agregar Agente a Cola de FAX",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Agregar Agente a Cola de Correo Electrónico",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Agregar Agente a Cola de Canales Abiertos",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Agregar agente a cola SMS",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Agregar Agente a cola de voz",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agregar Agente a Colas de Campañas",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Agregar Agente a Cola de Chat",
+    "ADD_AGENT_TO_FAX_QUEUES": "Agregar Agente a Cola de FAX",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Agregar Agente a Cola de Correo Electrónico",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Agregar Agente a Cola de Canales Abiertos",
+    "ADD_AGENT_TO_SMS_QUEUES": "Agregar agente a cola SMS",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Agregar Agente a cola de voz",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Agregar Agente a Colas de Campañas",
     "QUEUEADD_USER_CHAT_INBOUND": "Agregar Usuario a Cola de Chat",
     "QUEUEADD_USER_FAX_INBOUND": "Agregar Usuario a Cola de Fax",
     "QUEUEADD_USER_MAIL_INBOUND": "Agregar Usuario a Cola de Correo Electrónico",
@@ -210,13 +210,13 @@
     "SECURITY_SUITE": "Suite de seguridad",
     "SELECTED": "Seleccionado",
     "SELECTED_AGENTS": "Agentes seleccionados",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Colas de Chat seleccionadas",
-    "SELECTED_QUEUES_FAX_INBOUND": "Colas de Fax seleccionadas",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Colas de Correo Electrónico seleccionadas",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Colas de Canal Abierto seleccionadas",
-    "SELECTED_QUEUES_SMS_INBOUND": "Colas SMS seleccionadas",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Colas de voz seleccionadas",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campañas de cola seleccionadas",
+    "SELECTED_CHAT_QUEUES": "Colas de Chat seleccionadas",
+    "SELECTED_FAX_QUEUES": "Colas de Fax seleccionadas",
+    "SELECTED_MAIL_QUEUES": "Colas de Correo Electrónico seleccionadas",
+    "SELECTED_OPENCHANNEL_QUEUES": "Colas de Canal Abierto seleccionadas",
+    "SELECTED_SMS_QUEUES": "Colas SMS seleccionadas",
+    "SELECTED_VOICE_QUEUES": "Colas de voz seleccionadas",
+    "SELECTED_QUEUE_CAMPAIGNS": "Campañas de cola seleccionadas",
     "SELECTED_TEAMS": "Equipos seleccionados",
     "SELECT_ALL": "Seleccionar Todo",
     "SELECT_NONE": "No Seleccionar",
@@ -339,12 +339,12 @@
     "BLOCKED": "Bloqueado",
     "DISABLED": "Deshabilitado",
     "REGENERATE": "Regenerado",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas las colas de WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Todas las colas de WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Todas las cuentas de WhatsApp",
     "ALL_WHATSAPPQUEUES": "Todas las colas de Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Agregar agente a las colas de WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Agregar agente a las colas de WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Agregar usuario a las colas de WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Colas de WhatsApp seleccionadas",
+    "SELECTED_WHATSAPP_QUEUES": "Colas de WhatsApp seleccionadas",
     "SELECTED_WHATSAPPACCOUNTS": "Cuentas de WhatsApp seleccionadas",
     "SELECTED_WHATSAPPQUEUES": "Colas de WhatsApp seleccionadas",
     "USERADD_WHATSAPPACCOUNTS": "Agregar cuenta de WhatsApp al usuario",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sesiones de Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Interacciones omnicanal",
     "SCREEN_RECORDINGS": "Grabaciones de pantalla",
-    "VOICE_RECORDINGS": "Grabaciones de voz"
+    "VOICE_RECORDINGS": "Grabaciones de voz",
+    "ALL_QUEUE_CAMPAIGNS": "Todas las campañas en cola",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorar el estado de interrupción del agente para las llamadas de vista previa",
+    "SELECT_RECALLME_CAMPAIGN": "Seleccione la campaña Recall Me",
+    "ALL_QUEUES_CHAT_INBOUND": "Todas las colas de chat",
+    "ALL_QUEUES_FAX_INBOUND": "Todas las colas de fax",
+    "ALL_QUEUES_MAIL_INBOUND": "Todas Las Colas de Correo Electrónico",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas las colas de canales abiertos",
+    "ALL_QUEUES_SMS_INBOUND": "Todas las Colas de SMS",
+    "ALL_QUEUES_VOICE_INBOUND": "Todas las colas de voz",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Agregar Agente a Cola de Chat",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Agregar Agente a Cola de FAX",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Agregar Agente a Cola de Correo Electrónico",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Agregar Agente a Cola de Canales Abiertos",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Agregar agente a cola SMS",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Agregar Agente a cola de voz",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agregar Agente a Colas de Campañas",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Colas de Chat seleccionadas",
+    "SELECTED_QUEUES_FAX_INBOUND": "Colas de Fax seleccionadas",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Colas de Correo Electrónico seleccionadas",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Colas de Canal Abierto seleccionadas",
+    "SELECTED_QUEUES_SMS_INBOUND": "Colas SMS seleccionadas",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Colas de voz seleccionadas",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campañas de cola seleccionadas",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas las colas de WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Agregar agente a las colas de WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Colas de WhatsApp seleccionadas"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/et.json b/public/app/main/apps/staff/i18n/et.json
index 0c1d40c..0172d39 100644
--- a/public/app/main/apps/staff/i18n/et.json
+++ b/public/app/main/apps/staff/i18n/et.json
@@ -109,7 +109,7 @@
       "TRANSPORT": "Set the default transports in order of preference",
       "HOST": "How to find the client - IP or host name. If you want the phone to register itself, use the keyword dynamic instead of Host IP",
       "NAT": "Changes the behaviour of Asterisk for clients behind a firewall. If any of the comma-separated options is 'no', Asterisk will ignore other settings and set nat=no",
-      "SIPEXPIRES": "Default: 120",
+      "SIPEXPIRES": "Default: 160",
       "SIPPORT": "Default: 5060",
       "TYPE": "Determines the SIP role within asterisk. User: used to authenticate incoming - Peer: for outgoing calls - Friend: covers both characteristics of the above",
       "CHATCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
@@ -195,13 +195,13 @@
     "ALL_MODULES_AVAILABLE": "All modules available",
     "CALLGROUP": "Call Group",
     "PICKUPGROUP": "Pickup Group",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Add Agent to Queue Campaigns",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Add Agent to Voice Queues",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Add Agent to Chat Queues",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Add Agent to Email Queues",
+    "ADD_AGENT_TO_SMS_QUEUES": "Add Agent to SMS Queues",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Add Agent to Open Channel Queues",
+    "ADD_AGENT_TO_FAX_QUEUES": "Add Agent to Fax Queues",
     "QUEUEADD_USER_VOICE_INBOUND": "Add User to Voice Queues",
     "QUEUEADD_USER_CHAT_INBOUND": "Add User to Chat Queues",
     "QUEUEADD_USER_MAIL_INBOUND": "Add User to Email Queues",
@@ -211,20 +211,20 @@
     "ALL_TEAMS": "All Teams",
     "SELECTED_TEAMS": "Selected Teams",
     "SELECTED_AGENTS": "Selected Agents",
-    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
-    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
-    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
-    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
-    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
-    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
-    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
-    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues",
+    "ALL_QUEUE_CAMPAIGNS": "All Queue Campaigns",
+    "SELECTED_QUEUE_CAMPAIGNS": "Selected Queue Campaigns",
+    "ALL_VOICE_QUEUES": "All Voice Queues",
+    "SELECTED_VOICE_QUEUES": "Selected Voice Queues",
+    "ALL_CHAT_QUEUES": "All Chat Queues",
+    "SELECTED_CHAT_QUEUES": "Selected Chat Queues",
+    "ALL_MAIL_QUEUES": "All Email Queues",
+    "SELECTED_MAIL_QUEUES": "Selected Email Queues",
+    "ALL_SMS_QUEUES": "All SMS Queues",
+    "SELECTED_SMS_QUEUES": "Selected SMS Queues",
+    "ALL_OPENCHANNEL_QUEUES": "All Open Channel Queues",
+    "SELECTED_OPENCHANNEL_QUEUES": "Selected Open Channel Queues",
+    "ALL_FAX_QUEUES": "All Fax Queues",
+    "SELECTED_FAX_QUEUES": "Selected Fax Queues",
     "VOICEMAIL": "Voicemail",
     "SHOWWEBCONTROL": "Typology",
     "PAGE": "Page",
@@ -293,7 +293,7 @@
     "ALL_OPENCHANNELACCOUNTS": "All Open Channel Accounts",
     "SELECTED_OPENCHANNELACCOUNTS": "Selected Open Channel Accounts",
     "ADD_USERPROFILE": "Lisage kasutaja profiil",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Kõik WhatsApi järjekorrad",
+    "ALL_WHATSAPP_QUEUES": "Kõik WhatsApi järjekorrad",
     "ALL_WHATSAPPACCOUNTS": "Kõik WhatsApi kontod",
     "ALL_WHATSAPPQUEUES": "Kõik Whataspi järjekorrad",
     "APIKEY": "API-võti",
@@ -331,7 +331,7 @@
     "PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE": "Volitamata tegevus",
     "PERMISSIONS_WARNING_CLOSE": "Teil on salvestamata muudatusi. Kas soovite kindlasti väljuda salvestamata?",
     "PERMISSIONS_WARNING_ENABLE_ALL": "Kõik {{sectionName}} alajaotised ja nende ressursid lubatakse. Kas soovite kindlasti jätkata?",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lisage agent WhatsApp'i järjekorda",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Lisage agent WhatsApp'i järjekorda",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Lisage kasutaja WhatsApp'i järjekorda",
     "QUEUES_ASSOCIATION": "{{channel}} Järjekordade liit",
     "READ_PERMISSION": "Loe",
@@ -339,7 +339,7 @@
     "REMOVE": "Eemalda",
     "REPORT_TYPE": "Aruande tüüp",
     "SECTIONS": "Sektsioonid",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valitud WhatsApi järjekorrad",
+    "SELECTED_WHATSAPP_QUEUES": "Valitud WhatsApi järjekorrad",
     "SELECTED_WHATSAPPACCOUNTS": "Valitud WhatsApi kontod",
     "SELECTED_WHATSAPPQUEUES": "Valitud WhatsApi järjekorrad",
     "SUMMARY": "Kokkuvõte",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty seansid",
     "OMNICHANNEL_INTERACTIONS": "Omikanalilised koostoimed",
     "SCREEN_RECORDINGS": "Ekraanisalvestused",
-    "VOICE_RECORDINGS": "Helisalvestised"
+    "VOICE_RECORDINGS": "Helisalvestised",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Eelvaatekõnede puhul ignoreerige agendi katkestuse olekut",
+    "SELECT_RECALLME_CAMPAIGN": "Valige Meenuta mind kampaania",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Agent to Queue Campaigns",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Agent to Voice Queues",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Agent to Chat Queues",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Agent to Email Queues",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Add Agent to SMS Queues",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent to Open Channel Queues",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Add Agent to Fax Queues",
+    "ALL_QUEUES_VOICE_OUTBOUND": "All Queue Campaigns",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Selected Queue Campaigns",
+    "ALL_QUEUES_VOICE_INBOUND": "All Voice Queues",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Selected Voice Queues",
+    "ALL_QUEUES_CHAT_INBOUND": "All Chat Queues",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Selected Chat Queues",
+    "ALL_QUEUES_MAIL_INBOUND": "All Email Queues",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Selected Email Queues",
+    "ALL_QUEUES_SMS_INBOUND": "All SMS Queues",
+    "SELECTED_QUEUES_SMS_INBOUND": "Selected SMS Queues",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "All Open Channel Queues",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selected Open Channel Queues",
+    "ALL_QUEUES_FAX_INBOUND": "All Fax Queues",
+    "SELECTED_QUEUES_FAX_INBOUND": "Selected Fax Queues",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Kõik WhatsApi järjekorrad",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lisage agent WhatsApp'i järjekorda",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valitud WhatsApi järjekorrad"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/fa.json b/public/app/main/apps/staff/i18n/fa.json
index 3b58309..789d5ef 100644
--- a/public/app/main/apps/staff/i18n/fa.json
+++ b/public/app/main/apps/staff/i18n/fa.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "تنظیم پیش فرض را در خلسه است. نظام حمل و نقل پیش فرض اولیه را تعیین می کند.",
       "HOST": "چطور موکل - پيدا کردن IP یا نام میزبان است. اگر می خواهید شماره تلفن خود را ثبت کرده و برای استفاده از واژه كليدى به جای آدرس IP میزبان پویا.",
       "NAT": "تغییرات در رفتار Asterisk برای مراجعان در پشت یک دیوار آتش است.اگر یکی از گزینه ها از جمله جدا شده است خیر، Asterisk تنظیمات دیگری را ناديده گرفته خواهد شد و 3-1=تنظیم خیر.",
-      "SIPEXPIRES": "فرض: 120",
+      "SIPEXPIRES": "فرض: 160",
       "SIPPORT": "فرض: 5160",
       "TYPE": "نقش تعيين كننده در داخل نوشيدني asterisk است. کاربر تایید اعتبار ورودی استفاده می شود: - برای تماس های خروجی کمبودى: دوست: - هر دو خصوصیات پوشش بالاتر است.",
       "CHATCAPACITY": "صفر به معناى نامحدود است.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "تمام ماژول ها موجود است",
     "CALLGROUP": "گروه تماس",
     "PICKUPGROUP": "گروه جمع آوری",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "عامل به صف مبارزات خود را اضافه کنید",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "عامل صفهای طولانی به صدا اضافه کنید",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "افزودن عنصر به صفهای طولانی چت روم",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "عامل صفهای طولانی به پست اضافه کنید",
-    "QUEUEADD_AGENT_SMS_INBOUND": "افزودن به صفهای طولانی عامل SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "عامل اضافه کنید تا کانال باز صفها",
-    "QUEUEADD_AGENT_FAX_INBOUND": "عامل صفهای طولانی به فكس را اضافه کنید",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "عامل به صف مبارزات خود را اضافه کنید",
+    "ADD_AGENT_TO_VOICE_QUEUES": "عامل صفهای طولانی به صدا اضافه کنید",
+    "ADD_AGENT_TO_CHAT_QUEUES": "افزودن عنصر به صفهای طولانی چت روم",
+    "ADD_AGENT_TO_MAIL_QUEUES": "عامل صفهای طولانی به پست اضافه کنید",
+    "ADD_AGENT_TO_SMS_QUEUES": "افزودن به صفهای طولانی عامل SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "عامل اضافه کنید تا کانال باز صفها",
+    "ADD_AGENT_TO_FAX_QUEUES": "عامل صفهای طولانی به فكس را اضافه کنید",
     "QUEUEADD_USER_VOICE_INBOUND": "افزودن صدا به صفهای طولانی کاربر",
     "QUEUEADD_USER_CHAT_INBOUND": "افزودن به صفهای طولانی چت کاربر",
     "QUEUEADD_USER_MAIL_INBOUND": "افزودن به صفهای طولانی پست کاربر",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "همه تیم ها",
     "SELECTED_TEAMS": "تيم هاي برگزيده",
     "SELECTED_AGENTS": "عوامل انتخاب شده",
-    "ALL_QUEUES_VOICE_OUTBOUND": "همه صف مبارزات",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "توی صف مبارزات انتخابی",
-    "ALL_QUEUES_VOICE_INBOUND": "صدای همه صفها",
-    "SELECTED_QUEUES_VOICE_INBOUND": "صفهای طولانی صدای انتخاب شده",
-    "ALL_QUEUES_CHAT_INBOUND": "همه صفها چت روم",
-    "SELECTED_QUEUES_CHAT_INBOUND": "صفهای طولانی چت روم انتخاب می شود",
-    "ALL_QUEUES_MAIL_INBOUND": "همه صفها پستی",
-    "SELECTED_QUEUES_MAIL_INBOUND": "صفهای طولانی پیدا کرده انتخاب می شود",
-    "ALL_QUEUES_SMS_INBOUND": "همه صفها SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "صفهای طولانی انتخاب SMS",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "همه صفها کانال باز",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "صفهای طولانی انتخاب کانال را باز کنید",
-    "ALL_QUEUES_FAX_INBOUND": "همه صفها فكس",
-    "SELECTED_QUEUES_FAX_INBOUND": "صفهای طولانی فكس انتخاب می شود",
+    "ALL_QUEUE_CAMPAIGNS": "همه صف مبارزات",
+    "SELECTED_QUEUE_CAMPAIGNS": "توی صف مبارزات انتخابی",
+    "ALL_VOICE_QUEUES": "صدای همه صفها",
+    "SELECTED_VOICE_QUEUES": "صفهای طولانی صدای انتخاب شده",
+    "ALL_CHAT_QUEUES": "همه صفها چت روم",
+    "SELECTED_CHAT_QUEUES": "صفهای طولانی چت روم انتخاب می شود",
+    "ALL_MAIL_QUEUES": "همه صفها پستی",
+    "SELECTED_MAIL_QUEUES": "صفهای طولانی پیدا کرده انتخاب می شود",
+    "ALL_SMS_QUEUES": "همه صفها SMS",
+    "SELECTED_SMS_QUEUES": "صفهای طولانی انتخاب SMS",
+    "ALL_OPENCHANNEL_QUEUES": "همه صفها کانال باز",
+    "SELECTED_OPENCHANNEL_QUEUES": "صفهای طولانی انتخاب کانال را باز کنید",
+    "ALL_FAX_QUEUES": "همه صفها فكس",
+    "SELECTED_FAX_QUEUES": "صفهای طولانی فكس انتخاب می شود",
     "VOICEMAIL": "پست صوتی",
     "SHOWWEBCONTROL": "نمایش کنترل وب",
     "PAGE": "صفحه",
@@ -339,12 +339,12 @@
     "BLOCKED": "قفل شده",
     "DISABLED": "غیرفعال شده است",
     "REGENERATE": "بازسازی",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "همه صف های WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "همه صف های WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "همه حساب های WhatsApp",
     "ALL_WHATSAPPQUEUES": "تمام صف های Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "عامل را به صف های WhatsApp اضافه کنید",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "عامل را به صف های WhatsApp اضافه کنید",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "کاربر را به صف های WhatsApp اضافه کنید",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "صف های WhatsApp انتخاب شده است",
+    "SELECTED_WHATSAPP_QUEUES": "صف های WhatsApp انتخاب شده است",
     "SELECTED_WHATSAPPACCOUNTS": "حساب های واتس اپ انتخاب شده است",
     "SELECTED_WHATSAPPQUEUES": "صف های WhatsApp انتخاب شده است",
     "USERADD_WHATSAPPACCOUNTS": "حساب WhatsApp را به کاربر اضافه کنید",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "جلسات Jscripty",
     "OMNICHANNEL_INTERACTIONS": "تعاملات Omnichannel",
     "SCREEN_RECORDINGS": "ضبط صفحه",
-    "VOICE_RECORDINGS": "ضبط صدا"
+    "VOICE_RECORDINGS": "ضبط صدا",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "برای پیش‌نمایش تماس‌ها، وضعیت شکست نماینده را نادیده بگیرید",
+    "SELECT_RECALLME_CAMPAIGN": "کمپین Recall Me را انتخاب کنید",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "عامل به صف مبارزات خود را اضافه کنید",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "عامل صفهای طولانی به صدا اضافه کنید",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "افزودن عنصر به صفهای طولانی چت روم",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "عامل صفهای طولانی به پست اضافه کنید",
+    "QUEUEADD_AGENT_SMS_INBOUND": "افزودن به صفهای طولانی عامل SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "عامل اضافه کنید تا کانال باز صفها",
+    "QUEUEADD_AGENT_FAX_INBOUND": "عامل صفهای طولانی به فكس را اضافه کنید",
+    "ALL_QUEUES_VOICE_OUTBOUND": "همه صف مبارزات",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "توی صف مبارزات انتخابی",
+    "ALL_QUEUES_VOICE_INBOUND": "صدای همه صفها",
+    "SELECTED_QUEUES_VOICE_INBOUND": "صفهای طولانی صدای انتخاب شده",
+    "ALL_QUEUES_CHAT_INBOUND": "همه صفها چت روم",
+    "SELECTED_QUEUES_CHAT_INBOUND": "صفهای طولانی چت روم انتخاب می شود",
+    "ALL_QUEUES_MAIL_INBOUND": "همه صفها پستی",
+    "SELECTED_QUEUES_MAIL_INBOUND": "صفهای طولانی پیدا کرده انتخاب می شود",
+    "ALL_QUEUES_SMS_INBOUND": "همه صفها SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "صفهای طولانی انتخاب SMS",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "همه صفها کانال باز",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "صفهای طولانی انتخاب کانال را باز کنید",
+    "ALL_QUEUES_FAX_INBOUND": "همه صفها فكس",
+    "SELECTED_QUEUES_FAX_INBOUND": "صفهای طولانی فكس انتخاب می شود",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "همه صف های WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "عامل را به صف های WhatsApp اضافه کنید",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "صف های WhatsApp انتخاب شده است"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/fi.json b/public/app/main/apps/staff/i18n/fi.json
index 69b363b..8760d34 100644
--- a/public/app/main/apps/staff/i18n/fi.json
+++ b/public/app/main/apps/staff/i18n/fi.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Aseta oletusarvoinen kuljetukset. Järjestys määrittää ensisijaisen oletus kuljetuksen ajaksi.",
       "HOST": "Miten asiakas - IP-osoite tai isäntänimi. Jos haluat, että puhelin rekisteröivät itsensä, käytä avainsanaa dynaaminen sen sijaan ovat IP-osoite.",
       "NAT": "Muuttaa käyttäytymistä tähti asiakkaille palomuurin takana.Jos jokin pilkulla erotettuja valinnat on \"ei\", tähti ohittaa kaikki muut asetukset ja määritä nat=no.",
-      "SIPEXPIRES": "Oletus: 120",
+      "SIPEXPIRES": "Oletus: 160",
       "SIPPORT": "Oletus: 5160",
       "TYPE": "Määrittää SIP-asema tähdellä. Käyttäjä: varmentamisessa käytettävät saapuneet - Peer: lähtevät puhelut - ystävä: kattaa molemmat ominaisuudet.",
       "CHATCAPACITY": "Nolla tarkoittaa rajaton.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Kaikki moduulit saatavilla",
     "CALLGROUP": "Call -ryhmän",
     "PICKUPGROUP": "Poimintaryhmääsi kuuluvassa alanumerossa.",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Lisää Edustajan jonoon kampanjoita",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Lisää agentin Voice jonot",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Lisää agentin Chat jonot",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Lisää agentin Mail jonot",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Lisää agentin SMS jonot",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Lisää agentin avoimen kanavan jonot",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Lisää agentin faksi jonot",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Lisää Edustajan jonoon kampanjoita",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Lisää agentin Voice jonot",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Lisää agentin Chat jonot",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Lisää agentin Mail jonot",
+    "ADD_AGENT_TO_SMS_QUEUES": "Lisää agentin SMS jonot",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Lisää agentin avoimen kanavan jonot",
+    "ADD_AGENT_TO_FAX_QUEUES": "Lisää agentin faksi jonot",
     "QUEUEADD_USER_VOICE_INBOUND": "Lisää käyttäjä Voice jonot",
     "QUEUEADD_USER_CHAT_INBOUND": "Lisää käyttäjä Chat jonot",
     "QUEUEADD_USER_MAIL_INBOUND": "Lisää käyttäjä Mail jonot",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Kaikki joukkueet",
     "SELECTED_TEAMS": "Valittu työryhmille",
     "SELECTED_AGENTS": "Valitut edustajat",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Kaikki jonoon kampanjoita",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valitun jonon kampanjoita",
-    "ALL_QUEUES_VOICE_INBOUND": "Kaikki Voice jonot",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Valittu ääni jonot",
-    "ALL_QUEUES_CHAT_INBOUND": "Kaikki Chat jonot",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Valitun Chat jonot",
-    "ALL_QUEUES_MAIL_INBOUND": "Kaikki posti jonot",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Valittuna olevan jonot",
-    "ALL_QUEUES_SMS_INBOUND": "Kaikkiin tekstiviestilaatikoihin jonot",
-    "SELECTED_QUEUES_SMS_INBOUND": "Valittu SMS jonot",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Kaikki avoimen kanavan jonot",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valittu avoimen kanavan jonot",
-    "ALL_QUEUES_FAX_INBOUND": "Kaikki faksi jonot",
-    "SELECTED_QUEUES_FAX_INBOUND": "Valittu Fax jonot",
+    "ALL_QUEUE_CAMPAIGNS": "Kaikki jonoon kampanjoita",
+    "SELECTED_QUEUE_CAMPAIGNS": "Valitun jonon kampanjoita",
+    "ALL_VOICE_QUEUES": "Kaikki Voice jonot",
+    "SELECTED_VOICE_QUEUES": "Valittu ääni jonot",
+    "ALL_CHAT_QUEUES": "Kaikki Chat jonot",
+    "SELECTED_CHAT_QUEUES": "Valitun Chat jonot",
+    "ALL_MAIL_QUEUES": "Kaikki posti jonot",
+    "SELECTED_MAIL_QUEUES": "Valittuna olevan jonot",
+    "ALL_SMS_QUEUES": "Kaikkiin tekstiviestilaatikoihin jonot",
+    "SELECTED_SMS_QUEUES": "Valittu SMS jonot",
+    "ALL_OPENCHANNEL_QUEUES": "Kaikki avoimen kanavan jonot",
+    "SELECTED_OPENCHANNEL_QUEUES": "Valittu avoimen kanavan jonot",
+    "ALL_FAX_QUEUES": "Kaikki faksi jonot",
+    "SELECTED_FAX_QUEUES": "Valittu Fax jonot",
     "VOICEMAIL": "Vastaaja",
     "SHOWWEBCONTROL": "Näytä Web-ohjaus",
     "PAGE": "Sivu",
@@ -339,12 +339,12 @@
     "BLOCKED": "kiinni",
     "DISABLED": "deaktivoitu",
     "REGENERATE": "uudistua",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Kaikki WhatsApp-jonot",
+    "ALL_WHATSAPP_QUEUES": "Kaikki WhatsApp-jonot",
     "ALL_WHATSAPPACCOUNTS": "Kaikki WhatsApp-tilit",
     "ALL_WHATSAPPQUEUES": "Kaikki Whataspp -jonot",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lisää agentti WhatsApp-jonoihin",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Lisää agentti WhatsApp-jonoihin",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Lisää käyttäjä WhatsApp-jonoihin",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valitut WhatsApp -jonot",
+    "SELECTED_WHATSAPP_QUEUES": "Valitut WhatsApp -jonot",
     "SELECTED_WHATSAPPACCOUNTS": "Valitut WhatsApp-tilit",
     "SELECTED_WHATSAPPQUEUES": "Valitut WhatsApp -jonot",
     "USERADD_WHATSAPPACCOUNTS": "Lisää WhatsApp-tili käyttäjälle",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty-istunnot",
     "OMNICHANNEL_INTERACTIONS": "Omikanavaiset vuorovaikutukset",
     "SCREEN_RECORDINGS": "Näytön nauhoitukset",
-    "VOICE_RECORDINGS": "Äänitallenteet"
+    "VOICE_RECORDINGS": "Äänitallenteet",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ohita agenttikatkon tila esikatselukutsuissa",
+    "SELECT_RECALLME_CAMPAIGN": "Valitse Muista minut -kampanja",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Lisää Edustajan jonoon kampanjoita",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Lisää agentin Voice jonot",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Lisää agentin Chat jonot",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Lisää agentin Mail jonot",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Lisää agentin SMS jonot",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Lisää agentin avoimen kanavan jonot",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Lisää agentin faksi jonot",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Kaikki jonoon kampanjoita",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valitun jonon kampanjoita",
+    "ALL_QUEUES_VOICE_INBOUND": "Kaikki Voice jonot",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Valittu ääni jonot",
+    "ALL_QUEUES_CHAT_INBOUND": "Kaikki Chat jonot",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Valitun Chat jonot",
+    "ALL_QUEUES_MAIL_INBOUND": "Kaikki posti jonot",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Valittuna olevan jonot",
+    "ALL_QUEUES_SMS_INBOUND": "Kaikkiin tekstiviestilaatikoihin jonot",
+    "SELECTED_QUEUES_SMS_INBOUND": "Valittu SMS jonot",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Kaikki avoimen kanavan jonot",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valittu avoimen kanavan jonot",
+    "ALL_QUEUES_FAX_INBOUND": "Kaikki faksi jonot",
+    "SELECTED_QUEUES_FAX_INBOUND": "Valittu Fax jonot",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Kaikki WhatsApp-jonot",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lisää agentti WhatsApp-jonoihin",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valitut WhatsApp -jonot"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/fr.json b/public/app/main/apps/staff/i18n/fr.json
index ca9fb29..4a8092b 100644
--- a/public/app/main/apps/staff/i18n/fr.json
+++ b/public/app/main/apps/staff/i18n/fr.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Définir la valeur par défaut de transports. L'ordre détermine le transport par défaut.",
       "HOST": "Comment trouver le client - IP ou nom d'hôte. Si vous voulez que le téléphone s'inscrire lui-même, utilisez le mot-clé au lieu d'adresse IP dynamique.",
       "NAT": "Change le comportement de Asterisk pour les clients derrière un pare-feu.Si l'une des options séparées par des virgules est 'non', l'astérisque permet de ne pas tenir compte des autres paramètres et définissez le nat =no.",
-      "SIPEXPIRES": "Par défaut : 120",
+      "SIPEXPIRES": "Par défaut : 160",
       "SIPPORT": "Par défaut : 5160",
       "TYPE": "Détermine le rôle SIP au sein de Asterisk. Utilisateur : utilisé pour authentifier les - : par les pairs pour les appels sortants - AMI : couvre à la fois les caractéristiques de la ci-dessus.",
       "CHATCAPACITY": "0 signifie illimité.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Tous les modules disponibles",
     "CALLGROUP": "Groupe d'appel",
     "PICKUPGROUP": "Groupe d'interception",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Ajouter l'agent à la file d'attente Motion Bull",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Ajouter l'agent à la file d'attente voix",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Ajouter l'agent à la file d'attente discussion Chat",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Ajouter l'agent à la file d'attente Mail",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Ajouter l'agent à la file d'attente SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Ajouter l'agent à la file d'attente Openchannel",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Ajouter l'agent à la file d'attente Fax",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Ajouter l'agent à la file d'attente Motion Bull",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Ajouter l'agent à la file d'attente voix",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Ajouter l'agent à la file d'attente discussion Chat",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Ajouter l'agent à la file d'attente Mail",
+    "ADD_AGENT_TO_SMS_QUEUES": "Ajouter l'agent à la file d'attente SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Ajouter l'agent à la file d'attente Openchannel",
+    "ADD_AGENT_TO_FAX_QUEUES": "Ajouter l'agent à la file d'attente Fax",
     "QUEUEADD_USER_VOICE_INBOUND": "Ajouter un utilisateur à la file d'attente voix",
     "QUEUEADD_USER_CHAT_INBOUND": "Ajouter un utilisateur à la file d'attente chat",
     "QUEUEADD_USER_MAIL_INBOUND": "Ajouter un utilisateur à la file d'attente mail",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Toutes les équipes",
     "SELECTED_TEAMS": "Equipe(s) sélectionnée(s)",
     "SELECTED_AGENTS": "Agent(s) sélectionné(s)",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Toutes les campagnes Motion Bull",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campagne(s) Motion Bull sélectionnée(s)",
-    "ALL_QUEUES_VOICE_INBOUND": "Toutes les files d'attente voix",
-    "SELECTED_QUEUES_VOICE_INBOUND": "File(s) d'attente voix sélectionnée(s)",
-    "ALL_QUEUES_CHAT_INBOUND": "Toutes les files d'attentes Chat",
-    "SELECTED_QUEUES_CHAT_INBOUND": "File(s) d'attente Chat selectionnée(s)",
-    "ALL_QUEUES_MAIL_INBOUND": "Toutes les files d'attentes Mail",
-    "SELECTED_QUEUES_MAIL_INBOUND": "File(s) d'attente Mail sélectionnée(s)",
-    "ALL_QUEUES_SMS_INBOUND": "Toutes les files d'attentes SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "File(s) d'attente SMS sélectionnée(s)",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Toutes les files d'attente Openchannel",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Files d'attente ",
-    "ALL_QUEUES_FAX_INBOUND": "Toutes les files d'attente Fax",
-    "SELECTED_QUEUES_FAX_INBOUND": "File(s) d'attente Fax sélectionnée(s)",
+    "ALL_QUEUE_CAMPAIGNS": "Toutes les campagnes Motion Bull",
+    "SELECTED_QUEUE_CAMPAIGNS": "Campagne(s) Motion Bull sélectionnée(s)",
+    "ALL_VOICE_QUEUES": "Toutes les files d'attente voix",
+    "SELECTED_VOICE_QUEUES": "File(s) d'attente voix sélectionnée(s)",
+    "ALL_CHAT_QUEUES": "Toutes les files d'attentes Chat",
+    "SELECTED_CHAT_QUEUES": "File(s) d'attente Chat selectionnée(s)",
+    "ALL_MAIL_QUEUES": "Toutes les files d'attentes Mail",
+    "SELECTED_MAIL_QUEUES": "File(s) d'attente Mail sélectionnée(s)",
+    "ALL_SMS_QUEUES": "Toutes les files d'attentes SMS",
+    "SELECTED_SMS_QUEUES": "File(s) d'attente SMS sélectionnée(s)",
+    "ALL_OPENCHANNEL_QUEUES": "Toutes les files d'attente Openchannel",
+    "SELECTED_OPENCHANNEL_QUEUES": "Files d'attente ",
+    "ALL_FAX_QUEUES": "Toutes les files d'attente Fax",
+    "SELECTED_FAX_QUEUES": "File(s) d'attente Fax sélectionnée(s)",
     "VOICEMAIL": "Messagerie vocale",
     "SHOWWEBCONTROL": "Type de connexion :",
     "PAGE": "Page",
@@ -339,12 +339,12 @@
     "BLOCKED": "Fermé à clé",
     "DISABLED": "Désactivée",
     "REGENERATE": "Régénérer",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Toutes les files d'attente WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Toutes les files d'attente WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Tous les comptes WhatsApp",
     "ALL_WHATSAPPQUEUES": "Toutes les files d'attente Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Ajouter un agent aux files d'attente WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Ajouter un agent aux files d'attente WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Ajouter un utilisateur aux files d'attente WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Files d'attente WhatsApp sélectionnées",
+    "SELECTED_WHATSAPP_QUEUES": "Files d'attente WhatsApp sélectionnées",
     "SELECTED_WHATSAPPACCOUNTS": "Comptes WhatsApp sélectionnés",
     "SELECTED_WHATSAPPQUEUES": "Files d'attente WhatsApp sélectionnées",
     "USERADD_WHATSAPPACCOUNTS": "Ajouter un compte WhatsApp à l'utilisateur",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sessions de script",
     "OMNICHANNEL_INTERACTIONS": "Interactions omnicanales",
     "SCREEN_RECORDINGS": "Enregistrements d'écran",
-    "VOICE_RECORDINGS": "Enregistrements vocaux"
+    "VOICE_RECORDINGS": "Enregistrements vocaux",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorer l'état de pause de l'agent pour les appels de prévisualisation",
+    "SELECT_RECALLME_CAMPAIGN": "Sélectionnez la campagne Rappelez-moi",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Ajouter l'agent à la file d'attente Motion Bull",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Ajouter l'agent à la file d'attente voix",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Ajouter l'agent à la file d'attente discussion Chat",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Ajouter l'agent à la file d'attente Mail",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Ajouter l'agent à la file d'attente SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Ajouter l'agent à la file d'attente Openchannel",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Ajouter l'agent à la file d'attente Fax",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Toutes les campagnes Motion Bull",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campagne(s) Motion Bull sélectionnée(s)",
+    "ALL_QUEUES_VOICE_INBOUND": "Toutes les files d'attente voix",
+    "SELECTED_QUEUES_VOICE_INBOUND": "File(s) d'attente voix sélectionnée(s)",
+    "ALL_QUEUES_CHAT_INBOUND": "Toutes les files d'attentes Chat",
+    "SELECTED_QUEUES_CHAT_INBOUND": "File(s) d'attente Chat selectionnée(s)",
+    "ALL_QUEUES_MAIL_INBOUND": "Toutes les files d'attentes Mail",
+    "SELECTED_QUEUES_MAIL_INBOUND": "File(s) d'attente Mail sélectionnée(s)",
+    "ALL_QUEUES_SMS_INBOUND": "Toutes les files d'attentes SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "File(s) d'attente SMS sélectionnée(s)",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Toutes les files d'attente Openchannel",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Files d'attente ",
+    "ALL_QUEUES_FAX_INBOUND": "Toutes les files d'attente Fax",
+    "SELECTED_QUEUES_FAX_INBOUND": "File(s) d'attente Fax sélectionnée(s)",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Toutes les files d'attente WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Ajouter un agent aux files d'attente WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Files d'attente WhatsApp sélectionnées"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/he.json b/public/app/main/apps/staff/i18n/he.json
index d01f90d..2ee69e6 100644
--- a/public/app/main/apps/staff/i18n/he.json
+++ b/public/app/main/apps/staff/i18n/he.json
@@ -109,7 +109,7 @@
       "TRANSPORT": "הגדר העברות ברירת מחדל לפי סדר העדיפות",
       "HOST": "איתור כתובת IP או שם מארח של הלקוח: כדי שהטלפון ירשום את עצמו, השתמש במילת המפתח 'דינמית' במקום ב'כתובת ה-IP של המארח'",
       "NAT": "משנה את ההתנהגות של Asterisk עבור לקוחות מאחורי חומת אש. אם אחת מהאפשרויות המופרדות בפסיקים היא 'לא', Asterisk יתעלם מכל ההגדרות האחרות ויחיל nat=no.",
-      "SIPEXPIRES": "ברירת מחדל: 120",
+      "SIPEXPIRES": "ברירת מחדל: 160",
       "SIPPORT": "ברירת מחדל: 5160",
       "TYPE": "קובע את תפקיד ה-SIP בעזרת Asterisk. משתמש: לאישור שיחות נכנסות – עמית: לשיחות יוצאות – חבר: כולל מאפיינים של שיחות נכנסות וגם יוצאות.",
       "CHATCAPACITY": "המספר המרבי של אינטראקציות ערוץ מקבילות לנציג (0=בלתי מוגבל)",
@@ -195,13 +195,13 @@
     "ALL_MODULES_AVAILABLE": "כל המודולים זמינים",
     "CALLGROUP": "קבוצת שיחה",
     "PICKUPGROUP": "בחירת קבוצה",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "הוספתף נציג למבצעי תורים",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "הוספת נציג לתורי קול",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "הוספת נציג לתורי צ'אט",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "הוספת נציג לתורי דוא\"ל",
-    "QUEUEADD_AGENT_SMS_INBOUND": "הוספת נציג לתורי מסרונים",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "הוספת נציג לתורי ערוצים פתוחים",
-    "QUEUEADD_AGENT_FAX_INBOUND": "הוספת נציג לתורי פקס",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "הוספתף נציג למבצעי תורים",
+    "ADD_AGENT_TO_VOICE_QUEUES": "הוספת נציג לתורי קול",
+    "ADD_AGENT_TO_CHAT_QUEUES": "הוספת נציג לתורי צ'אט",
+    "ADD_AGENT_TO_MAIL_QUEUES": "הוספת נציג לתורי דוא\"ל",
+    "ADD_AGENT_TO_SMS_QUEUES": "הוספת נציג לתורי מסרונים",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "הוספת נציג לתורי ערוצים פתוחים",
+    "ADD_AGENT_TO_FAX_QUEUES": "הוספת נציג לתורי פקס",
     "QUEUEADD_USER_VOICE_INBOUND": "הוספת משתמש לתורי קול",
     "QUEUEADD_USER_CHAT_INBOUND": "הוספת משתמש לתורי צ'אט",
     "QUEUEADD_USER_MAIL_INBOUND": "הוספת משתמש לתורי דוא\"ל",
@@ -211,20 +211,20 @@
     "ALL_TEAMS": "כל הצוותים",
     "SELECTED_TEAMS": "צוותים נבחרים",
     "SELECTED_AGENTS": "נציגים נבחרים",
-    "ALL_QUEUES_VOICE_OUTBOUND": "כל מבצעי התורים",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "מבצעי תורים נבחרים",
-    "ALL_QUEUES_VOICE_INBOUND": "כל תורי הקול",
-    "SELECTED_QUEUES_VOICE_INBOUND": "תורי קול נבחרים",
-    "ALL_QUEUES_CHAT_INBOUND": "כל תורי הצ'אט",
-    "SELECTED_QUEUES_CHAT_INBOUND": "תורי צ'אט נבחרים",
-    "ALL_QUEUES_MAIL_INBOUND": "כל תורי הדוא\"ל",
-    "SELECTED_QUEUES_MAIL_INBOUND": "תורי דוא\"ל נבחרים",
-    "ALL_QUEUES_SMS_INBOUND": "כל תורי ה-SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "תורי SMS נבחרים",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "כל תורי הערוצים הפתוחים",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "תורי ערוצים פתוחים נבחרים",
-    "ALL_QUEUES_FAX_INBOUND": "כל תורי הפקס",
-    "SELECTED_QUEUES_FAX_INBOUND": "תורי פקס נבחרים",
+    "ALL_QUEUE_CAMPAIGNS": "כל מבצעי התורים",
+    "SELECTED_QUEUE_CAMPAIGNS": "מבצעי תורים נבחרים",
+    "ALL_VOICE_QUEUES": "כל תורי הקול",
+    "SELECTED_VOICE_QUEUES": "תורי קול נבחרים",
+    "ALL_CHAT_QUEUES": "כל תורי הצ'אט",
+    "SELECTED_CHAT_QUEUES": "תורי צ'אט נבחרים",
+    "ALL_MAIL_QUEUES": "כל תורי הדוא\"ל",
+    "SELECTED_MAIL_QUEUES": "תורי דוא\"ל נבחרים",
+    "ALL_SMS_QUEUES": "כל תורי ה-SMS",
+    "SELECTED_SMS_QUEUES": "תורי SMS נבחרים",
+    "ALL_OPENCHANNEL_QUEUES": "כל תורי הערוצים הפתוחים",
+    "SELECTED_OPENCHANNEL_QUEUES": "תורי ערוצים פתוחים נבחרים",
+    "ALL_FAX_QUEUES": "כל תורי הפקס",
+    "SELECTED_FAX_QUEUES": "תורי פקס נבחרים",
     "VOICEMAIL": "הודעה קולית",
     "SHOWWEBCONTROL": "טיפולוגיה",
     "PAGE": "דף",
@@ -339,12 +339,12 @@
     "BLOCKED": "נעילה",
     "DISABLED": "ביטול",
     "REGENERATE": "התחדשות",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "כל התורים ב- WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "כל התורים ב- WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "כל חשבונות WhatsApp",
     "ALL_WHATSAPPQUEUES": "כל התורים ב- Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "הוסף סוכן לתורי WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "הוסף סוכן לתורי WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "הוסף משתמש לתורי WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "תורי WhatsApp שנבחרו",
+    "SELECTED_WHATSAPP_QUEUES": "תורי WhatsApp שנבחרו",
     "SELECTED_WHATSAPPACCOUNTS": "חשבונות WhatsApp שנבחרו",
     "SELECTED_WHATSAPPQUEUES": "תורי WhatsApp שנבחרו",
     "USERADD_WHATSAPPACCOUNTS": "הוסף חשבון WhatsApp למשתמש",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "מושבי כתבי יד",
     "OMNICHANNEL_INTERACTIONS": "אינטראקציות בכל ערוץ",
     "SCREEN_RECORDINGS": "הקלטות מסך",
-    "VOICE_RECORDINGS": "הקלטות קוליות"
+    "VOICE_RECORDINGS": "הקלטות קוליות",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "התעלם מסטטוס הפסקת סוכן עבור שיחות תצוגה מקדימה",
+    "SELECT_RECALLME_CAMPAIGN": "בחר 'זכיר לי מסע פרסום'",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "הוספתף נציג למבצעי תורים",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "הוספת נציג לתורי קול",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "הוספת נציג לתורי צ'אט",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "הוספת נציג לתורי דוא\"ל",
+    "QUEUEADD_AGENT_SMS_INBOUND": "הוספת נציג לתורי מסרונים",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "הוספת נציג לתורי ערוצים פתוחים",
+    "QUEUEADD_AGENT_FAX_INBOUND": "הוספת נציג לתורי פקס",
+    "ALL_QUEUES_VOICE_OUTBOUND": "כל מבצעי התורים",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "מבצעי תורים נבחרים",
+    "ALL_QUEUES_VOICE_INBOUND": "כל תורי הקול",
+    "SELECTED_QUEUES_VOICE_INBOUND": "תורי קול נבחרים",
+    "ALL_QUEUES_CHAT_INBOUND": "כל תורי הצ'אט",
+    "SELECTED_QUEUES_CHAT_INBOUND": "תורי צ'אט נבחרים",
+    "ALL_QUEUES_MAIL_INBOUND": "כל תורי הדוא\"ל",
+    "SELECTED_QUEUES_MAIL_INBOUND": "תורי דוא\"ל נבחרים",
+    "ALL_QUEUES_SMS_INBOUND": "כל תורי ה-SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "תורי SMS נבחרים",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "כל תורי הערוצים הפתוחים",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "תורי ערוצים פתוחים נבחרים",
+    "ALL_QUEUES_FAX_INBOUND": "כל תורי הפקס",
+    "SELECTED_QUEUES_FAX_INBOUND": "תורי פקס נבחרים",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "כל התורים ב- WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "הוסף סוכן לתורי WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "תורי WhatsApp שנבחרו"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/hi.json b/public/app/main/apps/staff/i18n/hi.json
index f21b5cf..52f244a 100644
--- a/public/app/main/apps/staff/i18n/hi.json
+++ b/public/app/main/apps/staff/i18n/hi.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "डिफ़ॉल्ट केपरिवहन सेट करें क्रम निर्धारण की प्राथमिक डिफ़ॉल्ट परिवहन।",
       "HOST": "ग्राहक को कैसे - IP होस्ट नाम या है। यदि आप चाहते हैं कि फ़ोन रजिस्‍टर करने का उपयोग करें. IP होस्ट के बजाय गतिशील कीवर्ड",
       "NAT": "ग्राहकों के लिए तारांकन के व्यवहार को पीछे फ़ायरवॉल.यदि कोई अलग-अल्पविराम की विकल्प है 'नहीं', तारांकन परटिप्प ाी और स ९सी अन्य सेटिंग्स सेट आइप गीतांजलिश्री का तिरोहित=सं.",
-      "SIPEXPIRES": "डिफ़ॉल्ट: 120",
+      "SIPEXPIRES": "डिफ़ॉल्ट: 160",
       "SIPPORT": "डिफ़ॉल्ट: 5160",
       "TYPE": "रखावके कमरंद की भूमिका के तारांक लगा। उपयोगकर्ता को प्रमाणित करने के लिए प्रयोग किया :------- मित्र आउटगोइंग कॉल के लिए पीयर इनकमिंग कार्यनिष्पादनके विशेषताओं के ऊपर है।",
       "CHATCAPACITY": "असीमित अर्थ शून्य",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "सभी उपलब्ध",
     "CALLGROUP": "समूह कॉल",
     "PICKUPGROUP": "Pickup समूह",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "लोकतंत्रमें अभियानों एजेंट को जोड़ें",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "ध्वनि स्वर जोड़ने के एजेंट को कतार",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "चैट एजेंट को जोड़ने वाली कतारों",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "मेल जोड़ना एजेंट को कतार",
-    "QUEUEADD_AGENT_SMS_INBOUND": "SMS के एजेंट को जोड़ने वाली कतारों",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "एजेंट को जोड़ने के लिए खुले चैनल कतार",
-    "QUEUEADD_AGENT_FAX_INBOUND": "एजेंट को फैक्स कतार में जोड़ें",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "लोकतंत्रमें अभियानों एजेंट को जोड़ें",
+    "ADD_AGENT_TO_VOICE_QUEUES": "ध्वनि स्वर जोड़ने के एजेंट को कतार",
+    "ADD_AGENT_TO_CHAT_QUEUES": "चैट एजेंट को जोड़ने वाली कतारों",
+    "ADD_AGENT_TO_MAIL_QUEUES": "मेल जोड़ना एजेंट को कतार",
+    "ADD_AGENT_TO_SMS_QUEUES": "SMS के एजेंट को जोड़ने वाली कतारों",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "एजेंट को जोड़ने के लिए खुले चैनल कतार",
+    "ADD_AGENT_TO_FAX_QUEUES": "एजेंट को फैक्स कतार में जोड़ें",
     "QUEUEADD_USER_VOICE_INBOUND": "उपयोगकर्ता जोड़ें पर वॉयस कतार",
     "QUEUEADD_USER_CHAT_INBOUND": "उपयोगकर्ता जोड़ें से चैट कतार",
     "QUEUEADD_USER_MAIL_INBOUND": "उपयोगकर्ता जोड़ें से मेल कतार",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "सभी टीमें भाग लेंगी।",
     "SELECTED_TEAMS": "चयनित टीम",
     "SELECTED_AGENTS": "चयनित एजेंटों",
-    "ALL_QUEUES_VOICE_OUTBOUND": "सभी कतार अभियान",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "चयनित कतार अभियान",
-    "ALL_QUEUES_VOICE_INBOUND": "सभी वॉयस कतार",
-    "SELECTED_QUEUES_VOICE_INBOUND": "चयनित आवाज कतार",
-    "ALL_QUEUES_CHAT_INBOUND": "सभी चैट कतार",
-    "SELECTED_QUEUES_CHAT_INBOUND": "चयनित चैट कतार",
-    "ALL_QUEUES_MAIL_INBOUND": "हर मेल कतार",
-    "SELECTED_QUEUES_MAIL_INBOUND": "चयनित मेल कतार",
-    "ALL_QUEUES_SMS_INBOUND": "सभी SMS कतार",
-    "SELECTED_QUEUES_SMS_INBOUND": "चयनित SMS कतार",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "सभी खुले चैनल कतार",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "चयनित खुले चैनल कतार",
-    "ALL_QUEUES_FAX_INBOUND": "सभी फैक्स कतार",
-    "SELECTED_QUEUES_FAX_INBOUND": "चयनित फैक्स कतार",
+    "ALL_QUEUE_CAMPAIGNS": "सभी कतार अभियान",
+    "SELECTED_QUEUE_CAMPAIGNS": "चयनित कतार अभियान",
+    "ALL_VOICE_QUEUES": "सभी वॉयस कतार",
+    "SELECTED_VOICE_QUEUES": "चयनित आवाज कतार",
+    "ALL_CHAT_QUEUES": "सभी चैट कतार",
+    "SELECTED_CHAT_QUEUES": "चयनित चैट कतार",
+    "ALL_MAIL_QUEUES": "हर मेल कतार",
+    "SELECTED_MAIL_QUEUES": "चयनित मेल कतार",
+    "ALL_SMS_QUEUES": "सभी SMS कतार",
+    "SELECTED_SMS_QUEUES": "चयनित SMS कतार",
+    "ALL_OPENCHANNEL_QUEUES": "सभी खुले चैनल कतार",
+    "SELECTED_OPENCHANNEL_QUEUES": "चयनित खुले चैनल कतार",
+    "ALL_FAX_QUEUES": "सभी फैक्स कतार",
+    "SELECTED_FAX_QUEUES": "चयनित फैक्स कतार",
     "VOICEMAIL": "वॉयसमेल",
     "SHOWWEBCONTROL": "वेब नियंत्रण में दिखाएं",
     "PAGE": "पृष्ठ",
@@ -339,12 +339,12 @@
     "BLOCKED": "बंद",
     "DISABLED": "निष्क्रिय",
     "REGENERATE": "पुनः जेनरेट",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "सभी WhatsApp कतारें",
+    "ALL_WHATSAPP_QUEUES": "सभी WhatsApp कतारें",
     "ALL_WHATSAPPACCOUNTS": "सभी व्हाट्सएप अकाउंट",
     "ALL_WHATSAPPQUEUES": "सभी व्हाट्सएप कतार",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "एजेंट को व्हाट्सएप कतार में जोड़ें",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "एजेंट को व्हाट्सएप कतार में जोड़ें",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "व्हाट्सएप कतार में उपयोगकर्ता जोड़ें",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "चयनित व्हाट्सएप कतारें",
+    "SELECTED_WHATSAPP_QUEUES": "चयनित व्हाट्सएप कतारें",
     "SELECTED_WHATSAPPACCOUNTS": "व्हाट्सएप अकाउंट चुने",
     "SELECTED_WHATSAPPQUEUES": "चयनित व्हाट्सएप कतारें",
     "USERADD_WHATSAPPACCOUNTS": "उपयोगकर्ता के लिए WhatsApp खाता जोड़ें",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "जेस्क्रिप्टी सत्र",
     "OMNICHANNEL_INTERACTIONS": "ओमनीचैनल इंटरैक्शन",
     "SCREEN_RECORDINGS": "स्क्रीन रिकॉर्डिंग",
-    "VOICE_RECORDINGS": "वॉयस रिकॉर्डिंग"
+    "VOICE_RECORDINGS": "वॉयस रिकॉर्डिंग",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "पूर्वावलोकन कॉल के लिए एजेंट ब्रेक स्थिति पर ध्यान न दें",
+    "SELECT_RECALLME_CAMPAIGN": "रिकॉल मी कैंपेन चुनें",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "लोकतंत्रमें अभियानों एजेंट को जोड़ें",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "ध्वनि स्वर जोड़ने के एजेंट को कतार",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "चैट एजेंट को जोड़ने वाली कतारों",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "मेल जोड़ना एजेंट को कतार",
+    "QUEUEADD_AGENT_SMS_INBOUND": "SMS के एजेंट को जोड़ने वाली कतारों",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "एजेंट को जोड़ने के लिए खुले चैनल कतार",
+    "QUEUEADD_AGENT_FAX_INBOUND": "एजेंट को फैक्स कतार में जोड़ें",
+    "ALL_QUEUES_VOICE_OUTBOUND": "सभी कतार अभियान",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "चयनित कतार अभियान",
+    "ALL_QUEUES_VOICE_INBOUND": "सभी वॉयस कतार",
+    "SELECTED_QUEUES_VOICE_INBOUND": "चयनित आवाज कतार",
+    "ALL_QUEUES_CHAT_INBOUND": "सभी चैट कतार",
+    "SELECTED_QUEUES_CHAT_INBOUND": "चयनित चैट कतार",
+    "ALL_QUEUES_MAIL_INBOUND": "हर मेल कतार",
+    "SELECTED_QUEUES_MAIL_INBOUND": "चयनित मेल कतार",
+    "ALL_QUEUES_SMS_INBOUND": "सभी SMS कतार",
+    "SELECTED_QUEUES_SMS_INBOUND": "चयनित SMS कतार",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "सभी खुले चैनल कतार",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "चयनित खुले चैनल कतार",
+    "ALL_QUEUES_FAX_INBOUND": "सभी फैक्स कतार",
+    "SELECTED_QUEUES_FAX_INBOUND": "चयनित फैक्स कतार",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "सभी WhatsApp कतारें",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "एजेंट को व्हाट्सएप कतार में जोड़ें",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "चयनित व्हाट्सएप कतारें"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/hu.json b/public/app/main/apps/staff/i18n/hu.json
new file mode 100644
index 0000000..287a788
--- /dev/null
+++ b/public/app/main/apps/staff/i18n/hu.json
@@ -0,0 +1,399 @@
+{
+  "STAFF": {
+    "MANAGE_API_KEY": "API Key Manager",
+    "GENERATE": "Generate",
+    "REGENERATE": "Regenerate",
+    "REMOVE": "Remove",
+    "APIKEYMANAGER_USER": "API Key Manager",
+    "APIKEY": "API Key",
+    "VIDEOSUPPORT": "Video support",
+    "HOTDESK": "Hot desk",
+    "ENABLEVIDEOECORDING": "Enable Video Recording",
+    "ENABLESCREENRECORDINGBYAGENT": "Enable Screen Recording by Agent",
+    "ENABLEAUTOMATICSCREENRECORDING": "Enable Automatic Screen Recording",
+    "OLD_PASSWORD": "Old Password",
+    "ENABLEJAWSINTEGRATION": "Enable Jaws Integration",
+    "ALIAS": "Alias",
+    "NO_PASSWORD_CHANGE": "No Password Change",
+    "SECURITY_SUITE": "Security Suite",
+    "LAST_PASSWORD_RESET_AT": "Last Password Reset At",
+    "SIP_WEBRTC": "Sip",
+    "SETTINGS_WEBRTC": "Settings",
+    "WEBRTC": "WebRTC",
+    "DTLSCERTFILE": "TLS certificate",
+    "DTLSPRIVATEKEY": "TLS certificate's private key",
+    "CONTEXT": "Context",
+    "RINGINUSE": "Ring In Use",
+    "USERS": "Users",
+    "AGENTS": "Agents",
+    "TOGGLE_SIDENAV": "Toggle sidenav",
+    "SEARCH_FOR_ANYONE": "Search",
+    "BACK": "Back",
+    "MULTI_SELECT_TOGGLE": "multi select toggle",
+    "SELECT_ALL": "Select all",
+    "SELECT_NONE": "Select None",
+    "SELECTED": "Selected",
+    "DELETE_SELECTED": "Delete selected",
+    "EXPORT_SELECTED": "Export selected",
+    "ALL_USERS": "All users",
+    "ALL_AGENTS": "All agents",
+    "SORT": "sort",
+    "NAME": "Name",
+    "FULLNAME": "Full Name",
+    "A_TO_Z": "(A to Z)",
+    "Z_TO_A": "(Z to A)",
+    "MORE": "More",
+    "DELETE_USER": "Delete User",
+    "EDIT_USER": "Edit User",
+    "DELETE_AGENT": "Delete Agent",
+    "EDIT_AGENT": "Edit Agent",
+    "DELETE": "Delete",
+    "SAVE": "SAVE",
+    "ADD_USER": "ADD USER",
+    "ADD_AGENT": "ADD AGENT",
+    "NO_RESULTS": "No results..",
+    "CLOSE_DIALOG": "Close dialog",
+    "NAME_REQUIRED": "Name (required)",
+    "USERNAME": "Username",
+    "SHOW_ALL_FIELDS": "Show All Fields",
+    "PHONE_NUMBER": "Phone number",
+    "EMAIL": "Email",
+    "PASSWORD": "Password",
+    "ERRORS": {
+      "CONFIRM_REQUIRED": "Mandatory field",
+      "ALLOWCODECS_REQUIRED": "Mandatory field",
+      "ENCRYPTION": "SRTP (Secure Realtime Protocol) Encryption",
+      "DTLSCERTFILE_REQUIRED": "Mandatory field",
+      "DTLSPRIVATEKEY_REQUIRED": "Mandatory field",
+      "FULLNAME_REQUIRED": "Mandatory field",
+      "USERNAME_REQUIRED": "Mandatory field",
+      "EMAIL_REQUIRED": "Mandatory field",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "ACCOUNTNAME_REQUIRED": "Mandatory field",
+      "NAME_REQUIRED": "Mandatory field",
+      "HOST_REQUIRED": "Mandatory field",
+      "CHATCAPACITY_REQUIRED": "Mandatory field",
+      "MAILCAPACITY_REQUIRED": "Mandatory field",
+      "FAXCAPACITY_REQUIRED": "Mandatory field",
+      "SMSCAPACITY_REQUIRED": "Mandatory field",
+      "WHATSAPPCAPACITY_REQUIRED": "Mandatory field",
+      "OPENCHANNELCAPACITY_REQUIRED": "Mandatory field",
+      "SIPEXPIRES_REQUIRED": "Mandatory field",
+      "SIPPORT_REQUIRED": "Mandatory field",
+      "UNCONDITIONALNUMBER_REQUIRED": "Mandatory field",
+      "NOREPLYNUMBER_REQUIRED": "Mandatory field",
+      "BUSYNUMBER_REQUIRED": "Mandatory field",
+      "USERNAME_MUST_VALID_PATTERN": "Wrong format {{regex}}",
+      "REMOTECONTROLPORT_REQUIRED": "Mandatory field",
+      "CHATCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAILCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FAXCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "OPENCHANNELCAPACITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AUTOANSWERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AUTOANSWERDELAY_REQUIRED": "Mandatory field",
+      "MONITOREXTENSION_REQUIRED": "Mandatory field",
+      "SECURE_PASSWORD_PATTERN": "The password must be at least 8 characters long and have 1 lowercase character, 1 uppercase character, 1 number and 1 special character ~!@#$%^&-_=+[{]}.",
+      "CRUDPERMISSIONS_REQUIRED": "Mandatory field",
+      "USERPROFILE_REQUIRED": "Mandatory field",
+      "PASSWORD_OLDPASSWORD_MATCH": "New password must be different from previous one"
+    },
+    "ACCOUNT": "Account",
+    "VOICE": "Voice",
+    "CREATED_AT": "Created At",
+    "ROLE": "Role",
+    "PERSONAL_INFO": "Personal Info",
+    "DESCRIPTION": "Description",
+    "CHANGE_AVATAR": "Change Avatar",
+    "GENERAL": "General",
+    "INTERNAL": "Internal",
+    "TRANSPORT": "Transport",
+    "ALLOWCODECS": "Allowed Codecs",
+    "DISABLED": "Deactivated",
+    "BLOCKED": "Locked",
+    "HELP": {
+      "DISABLED": "select to deactivate / unselect to reactivate",
+      "BLOCKED": "Lock / Unlock access",
+      "APIKEY": "Please use 'API key manager' button on toolbar to manage this key",
+      "LAST_PASSWORD_RESET_AT": "Last date and time the password has been changed. If Secure Suite General Setting is enabled, the password will expire after 90 days.",
+      "DTLSCERTFILE": "Link to the valid TLS certificate(.crt file). Default value: '/etc/pki/tls/certs/motion.crt'.",
+      "DTLSPRIVATEKEY": "Link to the certificate's private key(.key file). Default value: '/etc/pki/tls/private/motion.key'.",
+      "ALLOWCODECS": "Allowed Codecs in order of preference",
+      "TRANSPORT": "Set the default transports in order of preference",
+      "HOST": "How to find the client - IP or host name. If you want the phone to register itself, use the keyword dynamic instead of Host IP",
+      "NAT": "Changes the behaviour of Asterisk for clients behind a firewall. If any of the comma-separated options is 'no', Asterisk will ignore other settings and set nat=no",
+      "SIPEXPIRES": "Default: 120",
+      "SIPPORT": "Default: 5160",
+      "TYPE": "Determines the SIP role within asterisk. User: used to authenticate incoming - Peer: for outgoing calls - Friend: covers both characteristics of the above",
+      "CHATCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "MAILCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "FAXCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "SMSCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "WHATSAPPCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "OPENCHANNELCAPACITY": "Maximum number of concurrent channel interactions per agent (0=unlimited)",
+      "CALLGROUP": "The agent's callgroup",
+      "PICKUPGROUP": "The groups in which the agent can answer calls",
+      "USERNAME": "Only numbers, letters and specific characters (._) are supported",
+      "ENCRYPTION": "SRTP (Secure Realtime Protocol) Encryption",
+      "SAVE_PERMISSIONS": "Every section containing any pending changes will be saved",
+      "CUSTOM_DASHBOARDS_PERMISSIONS": "Custom Dashboards permissions are managed in the Tools module",
+      "ENABLEAUTOMATICSCREENRECORDING": "The functionality is available only for voice channel",
+      "MASK_SENSITIVE_DATA": "Mask any sensitive data throughout the application (e.g. phone numbers and email addresses)",
+      "WSS_PORT": "Default: 8089"
+    },
+    "NEW_PASSWORD": "New Password",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "CHANGE_PASSWORD": "Change Password",
+    "CHANGEPASSWORD_AGENT": "Change Password",
+    "CHANGEPASSWORD_USER": "Change Password",
+    "CHANGEPASSWORD_TELEPHONE": "Change Password",
+    "LOGININPAUSE": "Login In Pause",
+    "HOST": "Host",
+    "NAT": "NAT",
+    "CHANSPY": "ChanSpy",
+    "OTHER_CHANNELS": "Other Channels",
+    "CHATCAPACITY": "Chat Capacity",
+    "MAILCAPACITY": "Email Capacity",
+    "FAXCAPACITY": "Fax Capacity",
+    "SMSCAPACITY": "Sms Capacity",
+    "WHATSAPPCAPACITY": "WhatsApp Connector Capacity",
+    "OPENCHANNELCAPACITY": "Open Channel Capacity",
+    "MOTIONBAR": "Motion Bar",
+    "SETTINGS": "Settings",
+    "AUTOANSWER": "Auto Answer",
+    "ENABLESETTINGS": "Enable Settings",
+    "CALL_FORWARDING": "Call Forwarding",
+    "UNCONDITIONAL": "Unconditional",
+    "UNCONDITIONALNUMBER": "Unconditional Number",
+    "NOREPLY": "No Reply",
+    "NOREPLYNUMBER": "No Reply Number",
+    "BUSY": "Busy",
+    "BUSYNUMBER": "Busy Number",
+    "REMOTE_CONTROL": "Remote Control",
+    "REMOTECONTROL": "Remote Control",
+    "REMOTECONTROLPORT": "Remote Control Port",
+    "SIP": "SIP",
+    "SIPEXPIRES": "SIP Expires [sec]",
+    "SIPPORT": "SIP Port",
+    "PENALTY": "Penalty",
+    "ACCOUNTNAME": "Account Name",
+    "ADD_TELEPHONE": "Add Telephone",
+    "EDIT_TELEPHONE": "Edit Telephone",
+    "DELETE_TELEPHONE": "Delete Telephone",
+    "TEAMS": "Teams",
+    "DELETE_TEAM": "Delete Team",
+    "AGENTADD_TEAM": "Add Agents to Team",
+    "EDIT_TEAM": "Edit Team",
+    "TYPE": "Type",
+    "TELEPHONES": "Telephones",
+    "CALLERID": "Caller ID",
+    "ENABLERECORDING": "Enable Recording",
+    "STAFF": "Staff",
+    "ID": "Id",
+    "NEW_USER": "New User",
+    "NEW_AGENT": "New Agent",
+    "NEW_TELEPHONE": "New Telephone",
+    "NEW_TEAM": "New Team",
+    "ADD_TEAM": "Add Team",
+    "JOIN_QUEUE": "Join Queue",
+    "CAPACITY": "Capacity",
+    "AUTOINTERNAL": "Auto generate internal number",
+    "ADD_AGENT_TO_TEAM": "Add Agent to Team",
+    "TEAMADD_AGENT": "Add Agent to Team",
+    "NO_AVAILABLE_INFO": "No available info",
+    "PERMISSIONS": "Permissions",
+    "ADD_AGENT_TO_QUEUE": "Add Agent to Queue",
+    "ALL_MODULES_AVAILABLE": "All modules available",
+    "CALLGROUP": "Call Group",
+    "PICKUPGROUP": "Pickup Group",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Add Agent to Queue Campaigns",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Add Agent to Voice Queues",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Add Agent to Chat Queues",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Add Agent to Email Queues",
+    "ADD_AGENT_TO_SMS_QUEUES": "Add Agent to SMS Queues",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Add Agent to WhatsApp Queues",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Add Agent to Open Channel Queues",
+    "ADD_AGENT_TO_FAX_QUEUES": "Add Agent to Fax Queues",
+    "QUEUEADD_USER_VOICE_INBOUND": "Add User to Voice Queues",
+    "QUEUEADD_USER_CHAT_INBOUND": "Add User to Chat Queues",
+    "QUEUEADD_USER_MAIL_INBOUND": "Add User to Email Queues",
+    "QUEUEADD_USER_SMS_INBOUND": "Add User to SMS Queues",
+    "QUEUEADD_USER_WHATSAPP_INBOUND": "Add User to WhatsApp Queues",
+    "QUEUEADD_USER_OPENCHANNEL_INBOUND": "Add User to Open Channel Queues",
+    "QUEUEADD_USER_FAX_INBOUND": "Add User to Fax Queues",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "SELECTED_AGENTS": "Selected Agents",
+    "ALL_QUEUE_CAMPAIGNS": "All Queue Campaigns",
+    "SELECTED_QUEUE_CAMPAIGNS": "Selected Queue Campaigns",
+    "ALL_VOICE_QUEUES": "All Voice Queues",
+    "SELECTED_VOICE_QUEUES": "Selected Voice Queues",
+    "ALL_CHAT_QUEUES": "All Chat Queues",
+    "SELECTED_CHAT_QUEUES": "Selected Chat Queues",
+    "ALL_MAIL_QUEUES": "All Email Queues",
+    "SELECTED_MAIL_QUEUES": "Selected Email Queues",
+    "ALL_SMS_QUEUES": "All SMS Queues",
+    "SELECTED_SMS_QUEUES": "Selected SMS Queues",
+    "ALL_WHATSAPP_QUEUES": "All WhatsApp Queues",
+    "SELECTED_WHATSAPP_QUEUES": "Selected WhatsApp Queues",
+    "ALL_OPENCHANNEL_QUEUES": "All Open Channel Queues",
+    "SELECTED_OPENCHANNEL_QUEUES": "Selected Open Channel Queues",
+    "ALL_FAX_QUEUES": "All Fax Queues",
+    "SELECTED_FAX_QUEUES": "Selected Fax Queues",
+    "VOICEMAIL": "Voicemail",
+    "SHOWWEBCONTROL": "Typology",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "CALLFORWARDING": "Call Forwarding",
+    "DND": "Do not disturb during pause",
+    "UNANSWEREDCALLBADGE": "Show unanswered call badge",
+    "ENABLEDTMFTONE": "Enable Dtmf tones",
+    "AUTOANSWERDELAY": "Auto Answer Delay [s]",
+    "ENCRYPTION": "Encryption",
+    "CHANNELS": "Channels",
+    "CHAT": "Chat",
+    "SMS": "Sms",
+    "WHATSAPP": "WhatsApp Connector",
+    "OPENCHANNEL": "Open Channel",
+    "FAX": "Fax",
+    "QUEUEADD_USER_VOICE_OUTBOUND": "Add User to Queue Campaigns",
+    "MONITOREXTENSION": "Record calls to user extension",
+    "EDITPERMISSIONS": "Editing Permissions",
+    "READ_PERMISSION": "Read",
+    "EDIT_PERMISSION": "Edit",
+    "DELETE_PERMISSION": "Delete",
+    "GENERAL_PERMISSIONS": "General",
+    "ENABLEMESSENGER": "Enable Internal Messenger",
+    "OUTBOUNDPROXY": "Oubound Proxy",
+    "PHONE": "Phone",
+    "MOBILE": "Mobile",
+    "PREFIXREQUIRED": "Prefix Required",
+    "MANAGE_PERMISSIONS": "Manage Permissions",
+    "USERADD_VOICEQUEUES": "Add Voice Queue to User",
+    "ALL_VOICEQUEUES": "All Voice Queues",
+    "SELECTED_VOICEQUEUES": "Selected Voice Queues",
+    "USERADD_CHATQUEUES": "Add Chat Queue to User",
+    "ALL_CHATQUEUES": "All Chat Queues",
+    "SELECTED_CHATQUEUES": "Selected Email Queues",
+    "USERADD_MAILQUEUES": "Add Email Queue to User",
+    "ALL_MAILQUEUES": "All Email Queues",
+    "SELECTED_MAILQUEUES": "Selected Chat Queues",
+    "USERADD_SMSQUEUES": "Add SMS Queue to User",
+    "ALL_SMSQUEUES": "All SMS Queues",
+    "SELECTED_SMSQUEUES": "Selected SMS Queues",
+    "USERADD_WHATSAPPQUEUES": "Add Whataspp Queue to User",
+    "ALL_WHATSAPPQUEUES": "All Whataspp Queues",
+    "SELECTED_WHATSAPPQUEUES": "Selected WhatsApp Queues",
+    "USERADD_FAXQUEUES": "Add Fax Queue to User",
+    "ALL_FAXQUEUES": "All Fax Queues",
+    "SELECTED_FAXQUEUES": "Selected Fax Queues",
+    "USERADD_OPENCHANNELQUEUES": "Add Open Channel Queue to User",
+    "ALL_OPENCHANNELQUEUES": "All Open Channel Queues",
+    "SELECTED_OPENCHANNELQUEUES": "Selected Open Channel Queues",
+    "USERADD_PROJECTS": "Add Cally Square Project to User",
+    "ALL_PROJECTS": "All Cally Square Projects",
+    "SELECTED_PROJECTS": "Selected Cally Square Projects",
+    "USERADD_CHATWEBSITES": "Add Chat Website to User",
+    "ALL_CHATWEBSITES": "All Chat Websites",
+    "SELECTED_CHATWEBSITES": "Selected Chat Websites",
+    "USERADD_QUEUECAMPAIGNS": "Add Queue Campaign to User",
+    "ALL_QUEUECAMPAIGNS": "All Queue Campaigns",
+    "SELECTED_QUEUECAMPAIGNS": "Selected Queue Campaigns",
+    "USERADD_MAILACCOUNTS": "Add Email Account to User",
+    "ALL_MAILACCOUNTS": "All Email Accounts",
+    "SELECTED_MAILACCOUNTS": "Selected Email Accounts",
+    "USERADD_FAXACCOUNTS": "Add Fax Account to User",
+    "ALL_FAXACCOUNTS": "All Fax Accounts",
+    "SELECTED_FAXACCOUNTS": "Selected Fax Accounts",
+    "USERADD_SMSACCOUNTS": "Add SMS Account to User",
+    "ALL_SMSACCOUNTS": "All SMS Accounts",
+    "SELECTED_SMSACCOUNTS": "Selected SMS Accounts",
+    "USERADD_WHATSAPPACCOUNTS": "Add WhatsApp Account to User",
+    "ALL_WHATSAPPACCOUNTS": "All WhatsApp Accounts",
+    "SELECTED_WHATSAPPACCOUNTS": "Selected WhatsApp Accounts",
+    "USERADD_OPENCHANNELACCOUNTS": "Add Open Channel Account to User",
+    "ALL_OPENCHANNELACCOUNTS": "All Open Channel Accounts",
+    "SELECTED_OPENCHANNELACCOUNTS": "Selected Open Channel Accounts",
+    "USERPROFILES": "User Profiles",
+    "USERPROFILE": "User Profile",
+    "NEW_USERPROFILE": "New User Profile",
+    "ADD_USERPROFILE": "Add User Profile",
+    "EDIT_USERPROFILE": "Edit User Profile",
+    "CLONE_USERPROFILE": "Clone User Profile",
+    "DELETE_USERPROFILE": "Delete User Profile",
+    "CRUDPERMISSIONS": "Permission Type",
+    "SECTIONS": "Sections",
+    "MODULES": "Modules",
+    "SUMMARY": "Summary",
+    "REPORT_TYPE": "Report Type",
+    "PERMISSIONS_MANAGE": "Manage",
+    "PERMISSIONS_SECTION_TITLE": "{{sectionName}} Permissions",
+    "PERMISSIONS_AUTO_ASSOCIATION_INFO": "Automatically associate every current and future resource of this section to the User Profile",
+    "PERMISSIONS_PLACEHOLDER_SEARCH": "Search...",
+    "PERMISSIONS_SELECT_SECTION": "Select a section",
+    "PERMISSIONS_SELECT_REPORT_TYPE": "Select report type",
+    "PERMISSIONS_ALL_RESOURCES": "All resources",
+    "PERMISSIONS_SELECTED_RESOURCES": "Selected resources",
+    "PERMISSIONS_SECTION_HIDE": "Hide section to the User",
+    "PERMISSIONS_SECTION_SHOW": "Show section to the User",
+    "PERMISSIONS_WARNING_ENABLE_ALL": "All {{sectionName}} subsections and their resources will be enabled. Are you sure you want to continue?",
+    "PERMISSIONS_WARNING_CLOSE": "You have unsaved changes. Are you sure you want to exit without saving?",
+    "NOTIFICATIONS": {
+      "PERMISSIONS_ENABLED_ALL_SUCCESS_TITLE": "{{sectionName}} section enabled",
+      "PERMISSIONS_ENABLED_ALL_SUCCESS_MESSAGE": "All {{sectionName}} resources have been added to {{userProfileName}} User Profile",
+      "PERMISSIONS_ENABLED_ALL_SUCCESS_MESSAGE_NO_RESOURCES": "{{sectionName}} has been added to {{userProfileName}} User Profile",
+      "PERMISSIONS_DISABLED_ALL_SUCCESS_TITLE": "{{sectionName}} section disabled",
+      "PERMISSIONS_DISABLED_ALL_SUCCESS_MESSAGE": "All {{sectionName}} resources have been removed from {{userProfileName}} User Profile",
+      "PERMISSIONS_DISABLED_ALL_SUCCESS_MESSAGE_NO_RESOURCES": "{{sectionName}} has been removed from {{userProfileName}} User Profile",
+      "PERMISSIONS_SAVED_SUCCESS_TITLE": "{{sectionName}} section saved",
+      "PERMISSIONS_SAVED_SUCCESS_MESSAGE": "Permissions successfully updated!"
+    },
+    "CONFIRM": "Confirm",
+    "CANCEL": "Cancel",
+    "CLOSE": "Close",
+    "QUEUES_ASSOCIATION": "{{channel}} Queues Association",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE": "Unauthorized action",
+    "PERMISSIONS_UNAUTHORIZED_REDIRECT_MESSAGE": "You are not allowed to access the selected section",
+    "PERMISSIONS_UNAUTHORIZED_CREATION_MESSAGE": "You are not allowed to create the resource",
+    "MASK_SENSITIVE_DATA": "Mask Sensitive Data",
+    "WSS_PORT": "WSS Port",
+    "DOWNLOADS": "Downloads",
+    "DOWNLOAD_PERMISSIONS": "Download Permissions",
+    "VOICE_RECORDINGS": "Voice Recordings",
+    "OMNICHANNEL_INTERACTIONS": "Omnichannel Interactions",
+    "ATTACHMENTS": "Attachments",
+    "SCREEN_RECORDINGS": "Screen Recordings",
+    "JSCRIPTY_SESSIONS": "Jscripty Sessions",
+    "CONTACT_MANAGER_LISTS": "Contact Manager Lists",
+    "CALLYSQUARE_RECORDINGS": "Cally Square Recordings",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignore agent break status for preview calls",
+    "SELECT_RECALLME_CAMPAIGN": "Select Recall Me Campaign",
+    "ALL_QUEUES_CHAT_INBOUND": "Minden csevegési sor",
+    "ALL_QUEUES_FAX_INBOUND": "Minden faxsor",
+    "ALL_QUEUES_MAIL_INBOUND": "Minden e-mail sor",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Minden nyitott csatornasor",
+    "ALL_QUEUES_SMS_INBOUND": "Minden SMS-sor",
+    "ALL_QUEUES_VOICE_INBOUND": "Minden hangsor",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Minden sorkampány",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Minden WhatsApp várólista",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Ügynök hozzáadása a csevegési sorokhoz",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Ügynök hozzáadása a faxsorokhoz",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Ügynök hozzáadása az e-mail sorokhoz",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Ügynök hozzáadása a nyitott csatornasorokhoz",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Ügynök hozzáadása az SMS-sorokhoz",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Ügynök hozzáadása a Voice Queues-hez",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Ügynök hozzáadása a kampányok sorába",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Ügynök hozzáadása a WhatsApp Várólistákhoz",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Kiválasztott csevegési sorok",
+    "SELECTED_QUEUES_FAX_INBOUND": "Kiválasztott faxsorok",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Kiválasztott e-mail sorok",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Kijelölt Nyitott csatornasorok",
+    "SELECTED_QUEUES_SMS_INBOUND": "Kiválasztott SMS-sorok",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Kiválasztott hangsorok",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Kiválasztott sorkampányok",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Kiválasztott WhatsApp-várólisták"
+  }
+}
diff --git a/public/app/main/apps/staff/i18n/id.json b/public/app/main/apps/staff/i18n/id.json
index 5efd94d..0c68cc6 100644
--- a/public/app/main/apps/staff/i18n/id.json
+++ b/public/app/main/apps/staff/i18n/id.json
@@ -54,7 +54,7 @@
       "NAT": "Mengubah perilaku Asterisk untuk klien di belakang firewall. Jika salah satu opsi yang dipisahkan koma adalah 'tidak', Asterisk akan mengabaikan pengaturan lain dan mengatur nat = no",
       "OPENCHANNELCAPACITY": "Jumlah maksimum interaksi saluran bersamaan per agen (0 = tidak terbatas)",
       "PICKUPGROUP": "Grup tempat agen dapat menjawab panggilan",
-      "SIPEXPIRES": "Default: 120",
+      "SIPEXPIRES": "Default: 160",
       "SIPPORT": "Default: 5160",
       "SMSCAPACITY": "Jumlah maksimum interaksi saluran bersamaan per agen (0 = tidak terbatas)",
       "TRANSPORT": "Setel transport default sesuai urutan preferensi",
@@ -84,13 +84,13 @@
     "ALLOWCODECS": "Codec yang Diizinkan",
     "ALL_AGENTS": "Semua agen",
     "ALL_MODULES_AVAILABLE": "Semua modul tersedia",
-    "ALL_QUEUES_CHAT_INBOUND": "Semua Antrean Obrolan",
-    "ALL_QUEUES_FAX_INBOUND": "Semua Antrian Faks",
-    "ALL_QUEUES_MAIL_INBOUND": "Semua Antrian Email",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Semua Antrian Saluran Terbuka",
-    "ALL_QUEUES_SMS_INBOUND": "Semua Antrean SMS",
-    "ALL_QUEUES_VOICE_INBOUND": "Semua Antrian Suara",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Semua Kampanye Antrean",
+    "ALL_CHAT_QUEUES": "Semua Antrean Obrolan",
+    "ALL_FAX_QUEUES": "Semua Antrian Faks",
+    "ALL_MAIL_QUEUES": "Semua Antrian Email",
+    "ALL_OPENCHANNEL_QUEUES": "Semua Antrian Saluran Terbuka",
+    "ALL_SMS_QUEUES": "Semua Antrean SMS",
+    "ALL_VOICE_QUEUES": "Semua Antrian Suara",
+    "ALL_QUEUE_CAMPAIGNS": "Semua Kampanye Antrean",
     "ALL_TEAMS": "Semua Tim",
     "ALL_USERS": "Semua pengguna",
     "AUTOANSWER": "Jawab otomatis",
@@ -184,13 +184,13 @@
     "PHONE": "Telepon",
     "PHONE_NUMBER": "Nomor telepon",
     "PICKUPGROUP": "Grup Penjemputan",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Tambahkan Agen ke Antrean Obrolan",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Tambahkan Agen ke Antrean Faks",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Tambahkan Agen ke Antrean Email",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Tambahkan Agen ke Open Channel Queues",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Tambahkan Agen ke Antrean SMS",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Tambahkan Agen ke Antrian Suara",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Tambahkan Agen ke Kampanye Antrean",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Tambahkan Agen ke Antrean Obrolan",
+    "ADD_AGENT_TO_FAX_QUEUES": "Tambahkan Agen ke Antrean Faks",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Tambahkan Agen ke Antrean Email",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Tambahkan Agen ke Open Channel Queues",
+    "ADD_AGENT_TO_SMS_QUEUES": "Tambahkan Agen ke Antrean SMS",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Tambahkan Agen ke Antrian Suara",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Tambahkan Agen ke Kampanye Antrean",
     "QUEUEADD_USER_CHAT_INBOUND": "Tambahkan Antrean Pengguna ke Obrolan",
     "QUEUEADD_USER_FAX_INBOUND": "Tambahkan User ke Fax Queues",
     "QUEUEADD_USER_MAIL_INBOUND": "Tambahkan Antrian Pengguna ke Email",
@@ -211,13 +211,13 @@
     "SECURITY_SUITE": "Suite Keamanan",
     "SELECTED": "Terpilih",
     "SELECTED_AGENTS": "Agen yang Dipilih",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Antrean Obrolan Terpilih",
-    "SELECTED_QUEUES_FAX_INBOUND": "Antrian Faks yang Dipilih",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Antrean Email Terpilih",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Antrian Saluran Terbuka yang Dipilih",
-    "SELECTED_QUEUES_SMS_INBOUND": "Antrian SMS yang Dipilih",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Antrean Suara yang Dipilih",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Kampanye Antrian Terpilih",
+    "SELECTED_CHAT_QUEUES": "Antrean Obrolan Terpilih",
+    "SELECTED_FAX_QUEUES": "Antrian Faks yang Dipilih",
+    "SELECTED_MAIL_QUEUES": "Antrean Email Terpilih",
+    "SELECTED_OPENCHANNEL_QUEUES": "Antrian Saluran Terbuka yang Dipilih",
+    "SELECTED_SMS_QUEUES": "Antrian SMS yang Dipilih",
+    "SELECTED_VOICE_QUEUES": "Antrean Suara yang Dipilih",
+    "SELECTED_QUEUE_CAMPAIGNS": "Kampanye Antrian Terpilih",
     "SELECTED_TEAMS": "Tim yang Dipilih",
     "SELECT_ALL": "Pilih Semua",
     "SELECT_NONE": "Pilih Tidak Ada",
@@ -339,12 +339,12 @@
     "BLOCKED": "Terkunci",
     "DISABLED": "Dinonaktifkan",
     "REGENERATE": "Diperbaiki",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Semua Antrean WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Semua Antrean WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Semua Akun WhatsApp",
     "ALL_WHATSAPPQUEUES": "Semua Antrian Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Tambahkan Agen ke Antrean WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Tambahkan Agen ke Antrean WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Tambahkan Pengguna ke Antrean WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Antrean WhatsApp yang Dipilih",
+    "SELECTED_WHATSAPP_QUEUES": "Antrean WhatsApp yang Dipilih",
     "SELECTED_WHATSAPPACCOUNTS": "Akun WhatsApp yang Dipilih",
     "SELECTED_WHATSAPPQUEUES": "Antrean WhatsApp yang Dipilih",
     "USERADD_WHATSAPPACCOUNTS": "Tambahkan Akun WhatsApp ke Pengguna",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sesi Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Interaksi Multisaluran",
     "SCREEN_RECORDINGS": "Rekaman Layar",
-    "VOICE_RECORDINGS": "Rekaman Suara"
+    "VOICE_RECORDINGS": "Rekaman Suara",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Abaikan status istirahat agen untuk panggilan pratinjau",
+    "SELECT_RECALLME_CAMPAIGN": "Pilih Kampanye Ingat Saya",
+    "ALL_QUEUES_CHAT_INBOUND": "Semua Antrean Obrolan",
+    "ALL_QUEUES_FAX_INBOUND": "Semua Antrian Faks",
+    "ALL_QUEUES_MAIL_INBOUND": "Semua Antrian Email",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Semua Antrian Saluran Terbuka",
+    "ALL_QUEUES_SMS_INBOUND": "Semua Antrean SMS",
+    "ALL_QUEUES_VOICE_INBOUND": "Semua Antrian Suara",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Semua Kampanye Antrean",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Tambahkan Agen ke Antrean Obrolan",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Tambahkan Agen ke Antrean Faks",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Tambahkan Agen ke Antrean Email",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Tambahkan Agen ke Open Channel Queues",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Tambahkan Agen ke Antrean SMS",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Tambahkan Agen ke Antrian Suara",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Tambahkan Agen ke Kampanye Antrean",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Antrean Obrolan Terpilih",
+    "SELECTED_QUEUES_FAX_INBOUND": "Antrian Faks yang Dipilih",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Antrean Email Terpilih",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Antrian Saluran Terbuka yang Dipilih",
+    "SELECTED_QUEUES_SMS_INBOUND": "Antrian SMS yang Dipilih",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Antrean Suara yang Dipilih",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Kampanye Antrian Terpilih",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Semua Antrean WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Tambahkan Agen ke Antrean WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Antrean WhatsApp yang Dipilih"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/it.json b/public/app/main/apps/staff/i18n/it.json
index 111b886..b77d91e 100644
--- a/public/app/main/apps/staff/i18n/it.json
+++ b/public/app/main/apps/staff/i18n/it.json
@@ -111,7 +111,7 @@
       "TRANSPORT": "Imposta i protocolli di default (saranno gestiti nell'ordine)",
       "HOST": "Come trovare il client - IP o nome host. Se si vuole che il telefono si registri autonomamente, usare la stringa 'dynamic' invece dell' IP dell'Host",
       "NAT": "Cambia il comportamento di asterisk per i client dietro un firewall. Se almeno una delle opzioni separate da virgola è 'no', Asterisk ignorerà tutte le altre e imposterà nat=no",
-      "SIPEXPIRES": "Default: 120",
+      "SIPEXPIRES": "Default: 160",
       "SIPPORT": "Default: 5160",
       "TYPE": "Determina il ruolo del SIP all'interno di asterisk. User: usato per identificare le chiamate in arrivo - Peer: per le chiamate in uscita - Friend: copre entrambe le caratteristiche di User e Peer",
       "CHATCAPACITY": "Inserire il numero massimo di interazioni concorrenti per il canale (0=illimitato)",
@@ -197,13 +197,13 @@
     "ALL_MODULES_AVAILABLE": "Tutti i moduli disponibili",
     "CALLGROUP": "Call Group",
     "PICKUPGROUP": "Pickup Group",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Aggiungi Agente a Campagne Coda",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Aggiungi Agente a code Voce",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Aggiungi Agente a code Chat",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Aggiungi Agente a code Email",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Aggiungi Agente a code SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Aggiungi Agente a code Open Channel",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Aggiungi Agente a code Fax",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Aggiungi Agente a Campagne Coda",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Aggiungi Agente a code Voce",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Aggiungi Agente a code Chat",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Aggiungi Agente a code Email",
+    "ADD_AGENT_TO_SMS_QUEUES": "Aggiungi Agente a code SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Aggiungi Agente a code Open Channel",
+    "ADD_AGENT_TO_FAX_QUEUES": "Aggiungi Agente a code Fax",
     "QUEUEADD_USER_VOICE_INBOUND": "Aggiungi Utente a code Voce",
     "QUEUEADD_USER_CHAT_INBOUND": "Aggiungi Utente a code Chat",
     "QUEUEADD_USER_MAIL_INBOUND": "Aggiungi Utente a code Email",
@@ -213,20 +213,20 @@
     "ALL_TEAMS": "Tutti i Team",
     "SELECTED_TEAMS": "Team selezionati",
     "SELECTED_AGENTS": "Agenti selezionati",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Tutte le Campagne Coda",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campagne Coda selezionate",
-    "ALL_QUEUES_VOICE_INBOUND": "Tutte le code",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Code Voce selezionate",
-    "ALL_QUEUES_CHAT_INBOUND": "Tutte le code Chat",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Code Chat selezionate",
-    "ALL_QUEUES_MAIL_INBOUND": "Tutte le code Email",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Code Email selezionate",
-    "ALL_QUEUES_SMS_INBOUND": "Tutte le code SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "Code SMS selezionate",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Tutte le code Open Channel",
-    "ALL_QUEUES_FAX_INBOUND": "Tutte le code Fax",
-    "SELECTED_QUEUES_FAX_INBOUND": "Code Fax selezionate",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selezionare le code Open Channel",
+    "ALL_QUEUE_CAMPAIGNS": "Tutte le Campagne Coda",
+    "SELECTED_QUEUE_CAMPAIGNS": "Campagne Coda selezionate",
+    "ALL_VOICE_QUEUES": "Tutte le code",
+    "SELECTED_VOICE_QUEUES": "Code Voce selezionate",
+    "ALL_CHAT_QUEUES": "Tutte le code Chat",
+    "SELECTED_CHAT_QUEUES": "Code Chat selezionate",
+    "ALL_MAIL_QUEUES": "Tutte le code Email",
+    "SELECTED_MAIL_QUEUES": "Code Email selezionate",
+    "ALL_SMS_QUEUES": "Tutte le code SMS",
+    "SELECTED_SMS_QUEUES": "Code SMS selezionate",
+    "ALL_OPENCHANNEL_QUEUES": "Tutte le code Open Channel",
+    "ALL_FAX_QUEUES": "Tutte le code Fax",
+    "SELECTED_FAX_QUEUES": "Code Fax selezionate",
+    "SELECTED_OPENCHANNEL_QUEUES": "Selezionare le code Open Channel",
     "VOICEMAIL": "Voicemail",
     "RINGINUSE": "Squilla quando occupato",
     "SHOWWEBCONTROL": "Tipologia",
@@ -347,12 +347,12 @@
     "ENABLEVIDEOECORDING": "Abilita registrazione video",
     "BLOCKED": "Bloccato",
     "DISABLED": "Disattivato",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Tutte le code di WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Tutte le code di WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Tutti gli account WhatsApp",
     "ALL_WHATSAPPQUEUES": "Tutte le code Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Aggiungi agente alle code di WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Aggiungi agente alle code di WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Aggiungi utente alle code di WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Code WhatsApp selezionate",
+    "SELECTED_WHATSAPP_QUEUES": "Code WhatsApp selezionate",
     "SELECTED_WHATSAPPACCOUNTS": "Account WhatsApp selezionati",
     "SELECTED_WHATSAPPQUEUES": "Code WhatsApp selezionate",
     "USERADD_WHATSAPPACCOUNTS": "Aggiungi account WhatsApp all'utente",
@@ -369,6 +369,32 @@
     "SCREEN_RECORDINGS": "Registrazioni Screen",
     "JSCRIPTY_SESSIONS": "Sessioni Jscripty",
     "CONTACT_MANAGER_LISTS": "Liste Manager Contatti",
-    "CALLYSQUARE_RECORDINGS": "Registrazioni Cally Square"
+    "CALLYSQUARE_RECORDINGS": "Registrazioni Cally Square",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignora lo stato di pausa per le chiamate preview",
+    "SELECT_RECALLME_CAMPAIGN": "Seleziona Campagna Recall Me",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Aggiungi Agente a Campagne Coda",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Aggiungi Agente a code Voce",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Aggiungi Agente a code Chat",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Aggiungi Agente a code Email",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Aggiungi Agente a code SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Aggiungi Agente a code Open Channel",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Aggiungi Agente a code Fax",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Tutte le Campagne Coda",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campagne Coda selezionate",
+    "ALL_QUEUES_VOICE_INBOUND": "Tutte le code",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Code Voce selezionate",
+    "ALL_QUEUES_CHAT_INBOUND": "Tutte le code Chat",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Code Chat selezionate",
+    "ALL_QUEUES_MAIL_INBOUND": "Tutte le code Email",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Code Email selezionate",
+    "ALL_QUEUES_SMS_INBOUND": "Tutte le code SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Code SMS selezionate",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Tutte le code Open Channel",
+    "ALL_QUEUES_FAX_INBOUND": "Tutte le code Fax",
+    "SELECTED_QUEUES_FAX_INBOUND": "Code Fax selezionate",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Selezionare le code Open Channel",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Tutte le code di WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Aggiungi agente alle code di WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Code WhatsApp selezionate"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/ja.json b/public/app/main/apps/staff/i18n/ja.json
index d3fcbbc..e7628f3 100644
--- a/public/app/main/apps/staff/i18n/ja.json
+++ b/public/app/main/apps/staff/i18n/ja.json
@@ -54,7 +54,7 @@
       "NAT": "ファイアウォールの内側にあるクライアントのAsteriskの動作を変更します。 カンマ区切りのオプションのいずれかが 'no'の場合、Asteriskは他の設定を無視し、nat = noを設定します。",
       "OPENCHANNELCAPACITY": "エージェントあたりの同時チャネルインタラクションの最大数（0 =無制限）",
       "PICKUPGROUP": "エージェントがコールに応答できるグループ",
-      "SIPEXPIRES": "デフォルト：120",
+      "SIPEXPIRES": "デフォルト：160",
       "SIPPORT": "デフォルト：5160",
       "SMSCAPACITY": "エージェントあたりを同時チャネルインタラクションの最大数（0 =無制限）",
       "TRANSPORT": "優先順位でデフォルト転送を設定します",
@@ -84,13 +84,13 @@
     "ALLOWCODECS": "許可されたコーデック",
     "ALL_AGENTS": "すべてのエージェント",
     "ALL_MODULES_AVAILABLE": "すべてのモジュールが利用可能です",
-    "ALL_QUEUES_CHAT_INBOUND": "すべてのチャットキュー",
-    "ALL_QUEUES_FAX_INBOUND": "すべてのFAXキュー",
-    "ALL_QUEUES_MAIL_INBOUND": "すべてのメールキュー",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "すべてのオープンチャネルキュー",
-    "ALL_QUEUES_SMS_INBOUND": "すべてのSMSキュー",
-    "ALL_QUEUES_VOICE_INBOUND": "すべての音声キュー",
-    "ALL_QUEUES_VOICE_OUTBOUND": "すべてのキューキャンペーン",
+    "ALL_CHAT_QUEUES": "すべてのチャットキュー",
+    "ALL_FAX_QUEUES": "すべてのFAXキュー",
+    "ALL_MAIL_QUEUES": "すべてのメールキュー",
+    "ALL_OPENCHANNEL_QUEUES": "すべてのオープンチャネルキュー",
+    "ALL_SMS_QUEUES": "すべてのSMSキュー",
+    "ALL_VOICE_QUEUES": "すべての音声キュー",
+    "ALL_QUEUE_CAMPAIGNS": "すべてのキューキャンペーン",
     "ALL_TEAMS": "すべてのチーム",
     "ALL_USERS": "すべてのユーザー",
     "AUTOANSWER": "自動応答",
@@ -183,13 +183,13 @@
     "PHONE": "電話番号",
     "PHONE_NUMBER": "電話番号",
     "PICKUPGROUP": "ピックアップグループ",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "チャットキューにエージェントを追加",
-    "QUEUEADD_AGENT_FAX_INBOUND": "FAXキューにエージェントを追加",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "メールキューにエージェントを追加",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "オープンチャネルキューにエージェントを追加",
-    "QUEUEADD_AGENT_SMS_INBOUND": "SMSキューにエージェントを追加",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "音声キューにエージェントを追加",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "キューキャンペーンにエージェントを追加",
+    "ADD_AGENT_TO_CHAT_QUEUES": "チャットキューにエージェントを追加",
+    "ADD_AGENT_TO_FAX_QUEUES": "FAXキューにエージェントを追加",
+    "ADD_AGENT_TO_MAIL_QUEUES": "メールキューにエージェントを追加",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "オープンチャネルキューにエージェントを追加",
+    "ADD_AGENT_TO_SMS_QUEUES": "SMSキューにエージェントを追加",
+    "ADD_AGENT_TO_VOICE_QUEUES": "音声キューにエージェントを追加",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "キューキャンペーンにエージェントを追加",
     "QUEUEADD_USER_CHAT_INBOUND": "チャットキューにユーザーを追加",
     "QUEUEADD_USER_FAX_INBOUND": "FAXキューにユーザーを追加",
     "QUEUEADD_USER_MAIL_INBOUND": "メールキューにユーザーを追加",
@@ -210,13 +210,13 @@
     "SECURITY_SUITE": "セキュリティスイート",
     "SELECTED": "選択された",
     "SELECTED_AGENTS": "選択されたエージェント",
-    "SELECTED_QUEUES_CHAT_INBOUND": "選択されたチャットキュー",
-    "SELECTED_QUEUES_FAX_INBOUND": "選択されたFAXキュー",
-    "SELECTED_QUEUES_MAIL_INBOUND": "選択されたメールキュー",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "選択されたオープンチャンネルキュー",
-    "SELECTED_QUEUES_SMS_INBOUND": "選択されたSMSキュー",
-    "SELECTED_QUEUES_VOICE_INBOUND": "選択された音声キュー",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "選択されたキューキャンペーン",
+    "SELECTED_CHAT_QUEUES": "選択されたチャットキュー",
+    "SELECTED_FAX_QUEUES": "選択されたFAXキュー",
+    "SELECTED_MAIL_QUEUES": "選択されたメールキュー",
+    "SELECTED_OPENCHANNEL_QUEUES": "選択されたオープンチャンネルキュー",
+    "SELECTED_SMS_QUEUES": "選択されたSMSキュー",
+    "SELECTED_VOICE_QUEUES": "選択された音声キュー",
+    "SELECTED_QUEUE_CAMPAIGNS": "選択されたキューキャンペーン",
     "SELECTED_TEAMS": "選択されたチーム",
     "SELECT_ALL": "すべて選択",
     "SELECT_NONE": "選択解除",
@@ -339,12 +339,12 @@
     "BLOCKED": "ロック済み",
     "DISABLED": "無効化",
     "REGENERATE": "再生成",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "すべてのWhatsAppキュー",
+    "ALL_WHATSAPP_QUEUES": "すべてのWhatsAppキュー",
     "ALL_WHATSAPPACCOUNTS": "すべてのWhatsAppアカウント",
     "ALL_WHATSAPPQUEUES": "すべてのWhatasppキュー",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsAppキューへのエージェントの追加",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "WhatsAppキューへのエージェントの追加",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "WhatsAppキューへのユーザーの追加",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "選択されたWhatsAppキュー",
+    "SELECTED_WHATSAPP_QUEUES": "選択されたWhatsAppキュー",
     "SELECTED_WHATSAPPACCOUNTS": "選択されたWhatsAppアカウント",
     "SELECTED_WHATSAPPQUEUES": "選択されたWhatsAppキュー",
     "USERADD_WHATSAPPACCOUNTS": "WhatsAppアカウントをユーザーに追加",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscriptyセッション",
     "OMNICHANNEL_INTERACTIONS": "オムニチャネルの相互作用",
     "SCREEN_RECORDINGS": "スクリーンレコーディング",
-    "VOICE_RECORDINGS": "音声録音"
+    "VOICE_RECORDINGS": "音声録音",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "プレビューコールのエージェントブレークステータスを無視する",
+    "SELECT_RECALLME_CAMPAIGN": "リコールミーキャンペーンを選択",
+    "ALL_QUEUES_CHAT_INBOUND": "すべてのチャットキュー",
+    "ALL_QUEUES_FAX_INBOUND": "すべてのFAXキュー",
+    "ALL_QUEUES_MAIL_INBOUND": "すべてのメールキュー",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "すべてのオープンチャネルキュー",
+    "ALL_QUEUES_SMS_INBOUND": "すべてのSMSキュー",
+    "ALL_QUEUES_VOICE_INBOUND": "すべての音声キュー",
+    "ALL_QUEUES_VOICE_OUTBOUND": "すべてのキューキャンペーン",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "チャットキューにエージェントを追加",
+    "QUEUEADD_AGENT_FAX_INBOUND": "FAXキューにエージェントを追加",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "メールキューにエージェントを追加",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "オープンチャネルキューにエージェントを追加",
+    "QUEUEADD_AGENT_SMS_INBOUND": "SMSキューにエージェントを追加",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "音声キューにエージェントを追加",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "キューキャンペーンにエージェントを追加",
+    "SELECTED_QUEUES_CHAT_INBOUND": "選択されたチャットキュー",
+    "SELECTED_QUEUES_FAX_INBOUND": "選択されたFAXキュー",
+    "SELECTED_QUEUES_MAIL_INBOUND": "選択されたメールキュー",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "選択されたオープンチャンネルキュー",
+    "SELECTED_QUEUES_SMS_INBOUND": "選択されたSMSキュー",
+    "SELECTED_QUEUES_VOICE_INBOUND": "選択された音声キュー",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "選択されたキューキャンペーン",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "すべてのWhatsAppキュー",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsAppキューへのエージェントの追加",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "選択されたWhatsAppキュー"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/ko.json b/public/app/main/apps/staff/i18n/ko.json
index 5be8467..f6d9ecc 100644
--- a/public/app/main/apps/staff/i18n/ko.json
+++ b/public/app/main/apps/staff/i18n/ko.json
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "전체 사용가능한 모듈",
     "CALLGROUP": "전화 그룹",
     "PICKUPGROUP": "응답 그룹",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "상담원 발신 음성에 상담그룹 추가",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "상담원 수신 음성에 상담그룹 추가",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "상담원 수신 채팅에 상담그룹 추가",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "상담원 수신 이메일에 상담그룹 추가",
-    "QUEUEADD_AGENT_SMS_INBOUND": "상담원 수신 SMS에 상담그룹 추가",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "상담원 수신 오픈채널에 상담그룹 추가",
-    "QUEUEADD_AGENT_FAX_INBOUND": "상담원 수신 팩스에 상담그룹 추가",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "상담원 발신 음성에 상담그룹 추가",
+    "ADD_AGENT_TO_VOICE_QUEUES": "상담원 수신 음성에 상담그룹 추가",
+    "ADD_AGENT_TO_CHAT_QUEUES": "상담원 수신 채팅에 상담그룹 추가",
+    "ADD_AGENT_TO_MAIL_QUEUES": "상담원 수신 이메일에 상담그룹 추가",
+    "ADD_AGENT_TO_SMS_QUEUES": "상담원 수신 SMS에 상담그룹 추가",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "상담원 수신 오픈채널에 상담그룹 추가",
+    "ADD_AGENT_TO_FAX_QUEUES": "상담원 수신 팩스에 상담그룹 추가",
     "QUEUEADD_USER_VOICE_INBOUND": "상담원 수신 음성에 상담그룹 추가",
     "QUEUEADD_USER_CHAT_INBOUND": "상담원 수신 채팅에 상담그룹 추가",
     "QUEUEADD_USER_MAIL_INBOUND": "상담원 수신 이메일에 상담그룹 추가",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "전체 팀",
     "SELECTED_TEAMS": "선택된 팀",
     "SELECTED_AGENTS": "선택된 상담원",
-    "ALL_QUEUES_VOICE_OUTBOUND": "전체상담그룹 발신 음성",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "선택된 상담그룹 발신 음성",
-    "ALL_QUEUES_VOICE_INBOUND": "전체 상담그룹 수신 음성",
-    "SELECTED_QUEUES_VOICE_INBOUND": "선택된 상담그룹 수신 음성",
-    "ALL_QUEUES_CHAT_INBOUND": "전체 상담그룹 수신 채팅",
-    "SELECTED_QUEUES_CHAT_INBOUND": "선택된 상담그룹 수신 채팅",
-    "ALL_QUEUES_MAIL_INBOUND": "전체 상담그룹 수신 이메일",
-    "SELECTED_QUEUES_MAIL_INBOUND": "선택된 상담그룹 수신 이메일",
-    "ALL_QUEUES_SMS_INBOUND": "전체 상담그룹 수신 SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "선택된 상담그룹 수신 SMS",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "전체 상담그룹 수신 오픈채널",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "선택된 상담그룹 수신 오픈채널",
-    "ALL_QUEUES_FAX_INBOUND": "전체 상담그룹 수신 팩스",
-    "SELECTED_QUEUES_FAX_INBOUND": "선택된 상담그룹 수신 팩스",
+    "ALL_QUEUE_CAMPAIGNS": "전체상담그룹 발신 음성",
+    "SELECTED_QUEUE_CAMPAIGNS": "선택된 상담그룹 발신 음성",
+    "ALL_VOICE_QUEUES": "전체 상담그룹 수신 음성",
+    "SELECTED_VOICE_QUEUES": "선택된 상담그룹 수신 음성",
+    "ALL_CHAT_QUEUES": "전체 상담그룹 수신 채팅",
+    "SELECTED_CHAT_QUEUES": "선택된 상담그룹 수신 채팅",
+    "ALL_MAIL_QUEUES": "전체 상담그룹 수신 이메일",
+    "SELECTED_MAIL_QUEUES": "선택된 상담그룹 수신 이메일",
+    "ALL_SMS_QUEUES": "전체 상담그룹 수신 SMS",
+    "SELECTED_SMS_QUEUES": "선택된 상담그룹 수신 SMS",
+    "ALL_OPENCHANNEL_QUEUES": "전체 상담그룹 수신 오픈채널",
+    "SELECTED_OPENCHANNEL_QUEUES": "선택된 상담그룹 수신 오픈채널",
+    "ALL_FAX_QUEUES": "전체 상담그룹 수신 팩스",
+    "SELECTED_FAX_QUEUES": "선택된 상담그룹 수신 팩스",
     "VOICEMAIL": "보이스메일",
     "SHOWWEBCONTROL": "웹 제어 표시",
     "PAGE": "페이지",
@@ -339,12 +339,12 @@
     "BLOCKED": "잠김",
     "DISABLED": "비활성화",
     "REGENERATE": "재생",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "모든 WhatsApp 대기열",
+    "ALL_WHATSAPP_QUEUES": "모든 WhatsApp 대기열",
     "ALL_WHATSAPPACCOUNTS": "모든 WhatsApp 계정",
     "ALL_WHATSAPPQUEUES": "모든 Whataspp 대기열",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsApp 대기열에 에이전트 추가",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "WhatsApp 대기열에 에이전트 추가",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "WhatsApp 대기열에 사용자 추가",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "선택된 WhatsApp 대기열",
+    "SELECTED_WHATSAPP_QUEUES": "선택된 WhatsApp 대기열",
     "SELECTED_WHATSAPPACCOUNTS": "선택된 WhatsApp 계정",
     "SELECTED_WHATSAPPQUEUES": "선택된 WhatsApp 대기열",
     "USERADD_WHATSAPPACCOUNTS": "사용자에게 WhatsApp 계정 추가",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty 세션",
     "OMNICHANNEL_INTERACTIONS": "옴니 채널 상호 작용",
     "SCREEN_RECORDINGS": "화면 녹화",
-    "VOICE_RECORDINGS": "음성 녹음"
+    "VOICE_RECORDINGS": "음성 녹음",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "미리보기 통화에 대한 상담원 휴식 상태 무시",
+    "SELECT_RECALLME_CAMPAIGN": "리콜 미 캠페인 선택",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "상담원 발신 음성에 상담그룹 추가",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "상담원 수신 음성에 상담그룹 추가",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "상담원 수신 채팅에 상담그룹 추가",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "상담원 수신 이메일에 상담그룹 추가",
+    "QUEUEADD_AGENT_SMS_INBOUND": "상담원 수신 SMS에 상담그룹 추가",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "상담원 수신 오픈채널에 상담그룹 추가",
+    "QUEUEADD_AGENT_FAX_INBOUND": "상담원 수신 팩스에 상담그룹 추가",
+    "ALL_QUEUES_VOICE_OUTBOUND": "전체상담그룹 발신 음성",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "선택된 상담그룹 발신 음성",
+    "ALL_QUEUES_VOICE_INBOUND": "전체 상담그룹 수신 음성",
+    "SELECTED_QUEUES_VOICE_INBOUND": "선택된 상담그룹 수신 음성",
+    "ALL_QUEUES_CHAT_INBOUND": "전체 상담그룹 수신 채팅",
+    "SELECTED_QUEUES_CHAT_INBOUND": "선택된 상담그룹 수신 채팅",
+    "ALL_QUEUES_MAIL_INBOUND": "전체 상담그룹 수신 이메일",
+    "SELECTED_QUEUES_MAIL_INBOUND": "선택된 상담그룹 수신 이메일",
+    "ALL_QUEUES_SMS_INBOUND": "전체 상담그룹 수신 SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "선택된 상담그룹 수신 SMS",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "전체 상담그룹 수신 오픈채널",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "선택된 상담그룹 수신 오픈채널",
+    "ALL_QUEUES_FAX_INBOUND": "전체 상담그룹 수신 팩스",
+    "SELECTED_QUEUES_FAX_INBOUND": "선택된 상담그룹 수신 팩스",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "모든 WhatsApp 대기열",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsApp 대기열에 에이전트 추가",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "선택된 WhatsApp 대기열"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/lt.json b/public/app/main/apps/staff/i18n/lt.json
index 3c7408d..6766723 100644
--- a/public/app/main/apps/staff/i18n/lt.json
+++ b/public/app/main/apps/staff/i18n/lt.json
@@ -123,7 +123,7 @@
       "TRANSPORT": "Nustatykite numatytuosius pernešimus pirmenybės tvarka",
       "HOST": "Kaip rasti klientą - IP arba pagrindinio kompiuterio vardas. Jei norite, kad telefonas pats užsiregistruotų, vietoj pagrindinio IP naudokite raktinį žodį „dinaminis“",
       "NAT": "Keičia „Asterisk“ klientų elgesį už ugniasienės. Jei kuri nors iš kableliais atskirtų parinkčių yra „ne“, „Asterisk“ ignoruos kitus parametrus ir nustatys nat = ne",
-      "SIPEXPIRES": "Numatytas: 120",
+      "SIPEXPIRES": "Numatytas: 160",
       "SIPPORT": "Numatytas: 5160",
       "TYPE": "Nustato SIP vaidmenį „Asterisk'e“. Vartotojas: naudojamas atpažinti įeinantiems - bendraamžis: išeinantiems skambučiams - draugas: apima abi pirmiau nurodytas charakteristikas",
       "CHATCAPACITY": "Didžiausias vienu metu veikiančių kanalų sąveikų skaičius vienam agentui (0 = neribotas)",
@@ -206,13 +206,13 @@
     "ALL_MODULES_AVAILABLE": "Galimi visi moduliai",
     "CALLGROUP": "Skambučių grupė",
     "PICKUPGROUP": "Pikapų grupė",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Pridėti agentą prie eilės kampanijų",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Pridėti agentą prie balso eilių",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Pridėti agentą prie pokalbio eilių",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Pridėti agentą prie el. pašto eilių",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Pridėti agentą prie SMS eilių",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Pridėti agentą prie atviro kanalo eilių",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Pridėti agentą prie fakso eilių",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Pridėti agentą prie eilės kampanijų",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Pridėti agentą prie balso eilių",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Pridėti agentą prie pokalbio eilių",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Pridėti agentą prie el. pašto eilių",
+    "ADD_AGENT_TO_SMS_QUEUES": "Pridėti agentą prie SMS eilių",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Pridėti agentą prie atviro kanalo eilių",
+    "ADD_AGENT_TO_FAX_QUEUES": "Pridėti agentą prie fakso eilių",
     "QUEUEADD_USER_VOICE_INBOUND": "Pridėti vartotoją prie balso eilių",
     "QUEUEADD_USER_CHAT_INBOUND": "Pridėti vartotoją prie pokalbio eilių",
     "QUEUEADD_USER_MAIL_INBOUND": "Pridėti vartotoją prie el. pašto eilių",
@@ -222,20 +222,20 @@
     "ALL_TEAMS": "Visos komandos",
     "SELECTED_TEAMS": "Pasirinktos komandos",
     "SELECTED_AGENTS": "Pasirinkti agentai",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Visos eilės kampanijos",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Pasirinktos eilės kampanijos",
-    "ALL_QUEUES_VOICE_INBOUND": "Visos balso eilės",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Pasirinktos balso eilės",
-    "ALL_QUEUES_CHAT_INBOUND": "Visos pokalbio eilės",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Pasirinktos pokalbio eilės",
-    "ALL_QUEUES_MAIL_INBOUND": "Visos el. pašto eilės",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Pasirinktos el. pašto eilės",
-    "ALL_QUEUES_SMS_INBOUND": "Visos SMS eilės",
-    "SELECTED_QUEUES_SMS_INBOUND": "Pasirinktos SMS eilės",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Visos atviro kanalo eilės",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Pasirinktos atviro kanalo eilės",
-    "ALL_QUEUES_FAX_INBOUND": "Visos fakso eilės",
-    "SELECTED_QUEUES_FAX_INBOUND": "Pasirinktos fakso eilės",
+    "ALL_QUEUE_CAMPAIGNS": "Visos eilės kampanijos",
+    "SELECTED_QUEUE_CAMPAIGNS": "Pasirinktos eilės kampanijos",
+    "ALL_VOICE_QUEUES": "Visos balso eilės",
+    "SELECTED_VOICE_QUEUES": "Pasirinktos balso eilės",
+    "ALL_CHAT_QUEUES": "Visos pokalbio eilės",
+    "SELECTED_CHAT_QUEUES": "Pasirinktos pokalbio eilės",
+    "ALL_MAIL_QUEUES": "Visos el. pašto eilės",
+    "SELECTED_MAIL_QUEUES": "Pasirinktos el. pašto eilės",
+    "ALL_SMS_QUEUES": "Visos SMS eilės",
+    "SELECTED_SMS_QUEUES": "Pasirinktos SMS eilės",
+    "ALL_OPENCHANNEL_QUEUES": "Visos atviro kanalo eilės",
+    "SELECTED_OPENCHANNEL_QUEUES": "Pasirinktos atviro kanalo eilės",
+    "ALL_FAX_QUEUES": "Visos fakso eilės",
+    "SELECTED_FAX_QUEUES": "Pasirinktos fakso eilės",
     "VOICEMAIL": "Balso paštas",
     "SHOWWEBCONTROL": "Tipologija",
     "PAGE": "Puslapis",
@@ -346,12 +346,12 @@
     "PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE": "Neteisėtas veiksmas",
     "PERMISSIONS_UNAUTHORIZED_REDIRECT_MESSAGE": "Jums neleidžiama pasiekti pasirinkto skyriaus",
     "PERMISSIONS_UNAUTHORIZED_CREATION_MESSAGE": "Jums neleidžiama kurti šaltinio",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Visos „WhatsApp“ eilės",
+    "ALL_WHATSAPP_QUEUES": "Visos „WhatsApp“ eilės",
     "ALL_WHATSAPPACCOUNTS": "Visos „WhatsApp“ paskyros",
     "ALL_WHATSAPPQUEUES": "Visos „Whataspp“ eilės",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Pridėti agentą prie „WhatsApp“ eilių",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Pridėti agentą prie „WhatsApp“ eilių",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Pridėti vartotoją prie „WhatsApp“ eilių",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Pasirinktos „WhatsApp“ eilės",
+    "SELECTED_WHATSAPP_QUEUES": "Pasirinktos „WhatsApp“ eilės",
     "SELECTED_WHATSAPPACCOUNTS": "Pasirinktos „WhatsApp“ paskyros",
     "SELECTED_WHATSAPPQUEUES": "Pasirinktos „WhatsApp“ eilės",
     "USERADD_WHATSAPPACCOUNTS": "Pridėkite „WhatsApp“ abonementą prie vartotojo",
@@ -368,6 +368,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty sesijos",
     "OMNICHANNEL_INTERACTIONS": "„Omnichannel“ sąveika",
     "SCREEN_RECORDINGS": "Ekrano įrašai",
-    "VOICE_RECORDINGS": "Balso įrašai"
+    "VOICE_RECORDINGS": "Balso įrašai",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignoruoti agento pertraukos būseną peržiūros skambučiams",
+    "SELECT_RECALLME_CAMPAIGN": "Pasirinkite Atšaukti mane kampanija",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Pridėti agentą prie eilės kampanijų",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Pridėti agentą prie balso eilių",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Pridėti agentą prie pokalbio eilių",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Pridėti agentą prie el. pašto eilių",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Pridėti agentą prie SMS eilių",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Pridėti agentą prie atviro kanalo eilių",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Pridėti agentą prie fakso eilių",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Visos eilės kampanijos",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Pasirinktos eilės kampanijos",
+    "ALL_QUEUES_VOICE_INBOUND": "Visos balso eilės",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Pasirinktos balso eilės",
+    "ALL_QUEUES_CHAT_INBOUND": "Visos pokalbio eilės",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Pasirinktos pokalbio eilės",
+    "ALL_QUEUES_MAIL_INBOUND": "Visos el. pašto eilės",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Pasirinktos el. pašto eilės",
+    "ALL_QUEUES_SMS_INBOUND": "Visos SMS eilės",
+    "SELECTED_QUEUES_SMS_INBOUND": "Pasirinktos SMS eilės",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Visos atviro kanalo eilės",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Pasirinktos atviro kanalo eilės",
+    "ALL_QUEUES_FAX_INBOUND": "Visos fakso eilės",
+    "SELECTED_QUEUES_FAX_INBOUND": "Pasirinktos fakso eilės",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Visos „WhatsApp“ eilės",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Pridėti agentą prie „WhatsApp“ eilių",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Pasirinktos „WhatsApp“ eilės"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/lv.json b/public/app/main/apps/staff/i18n/lv.json
index 404cf61..f930cb8 100644
--- a/public/app/main/apps/staff/i18n/lv.json
+++ b/public/app/main/apps/staff/i18n/lv.json
@@ -48,7 +48,7 @@
       "TRANSPORT": "Iestatiet noklusējuma transportēšanu pēc izvēles",
       "HOST": "Kā atrast klientu – IP vai resursdatora nosaukums. Ja vēlaties, lai tālrunis tiktu reģistrēts, izmantojiet atslēgvārdu dinamiku, nevis resursdatora IP",
       "NAT": "Maina \"Asterisk\" darbību klientiem aiz ugunsmūra. Ja kāda no opcijām, kas ir atdalītas ar komatiem, ir \"Nē\", \"Asterisk\" ignorēs citus iestatījumus un iestatīs nat = no",
-      "SIPEXPIRES": "Noklusējums: 120",
+      "SIPEXPIRES": "Noklusējums: 160",
       "SIPPORT": "Noklusējums: 5160",
       "TYPE": "Nosaka SIP lomu \"Asterisk\" ietvaros Lietotājs: izmanto, lai autentificētu ienākošo – Biedrs: izejošajiem zvaniem – Draugs: iekļauj abas iepriekš minētās īpašības",
       "CHATCAPACITY": "Maksimālais vienlaicīgu kanālu mijiedarbību skaits vienam aģentam (0 = neierobežots)",
@@ -190,13 +190,13 @@
     "ALL_MODULES_AVAILABLE": "Visi pieejamie moduļi",
     "CALLGROUP": "Zvanu grupa",
     "PICKUPGROUP": "Pacelšanas grupa",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Pievienot aģentu rindas kampaņām",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Pievienot pārstāvi balss rindām",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Pievienot aģentu tērzēšanas rindām",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Pievienot aģentu e-pasta rindām",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Pievienot aģentu īsziņu rindām",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Pievienot aģentu atvērtā kanāla rindām",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Pievienot aģentu faksa rindām",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Pievienot aģentu rindas kampaņām",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Pievienot pārstāvi balss rindām",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Pievienot aģentu tērzēšanas rindām",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Pievienot aģentu e-pasta rindām",
+    "ADD_AGENT_TO_SMS_QUEUES": "Pievienot aģentu īsziņu rindām",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Pievienot aģentu atvērtā kanāla rindām",
+    "ADD_AGENT_TO_FAX_QUEUES": "Pievienot aģentu faksa rindām",
     "QUEUEADD_USER_VOICE_INBOUND": "Pievienot lietotāju balss rindām",
     "QUEUEADD_USER_CHAT_INBOUND": "Pievienot lietotāju tērzēšanas rindām",
     "QUEUEADD_USER_MAIL_INBOUND": "Pievienot lietotāju e-pasta rindām",
@@ -206,20 +206,20 @@
     "ALL_TEAMS": "Visas komandas",
     "SELECTED_TEAMS": "Atlasītās komandas",
     "SELECTED_AGENTS": "Atlasītie aģenti",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Visas rindas kampaņas",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Atlasītās rindas kampaņas",
-    "ALL_QUEUES_VOICE_INBOUND": "Visas balss rindas",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Atlasītās balss rindas",
-    "ALL_QUEUES_CHAT_INBOUND": "Visas tērzēšanas rindas",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Atlasītās tērzēšanas rindas",
-    "ALL_QUEUES_MAIL_INBOUND": "Visas e-pasta rindas",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Atlasītās e-pasta rindas",
-    "ALL_QUEUES_SMS_INBOUND": "Visas īsziņu rindas",
-    "SELECTED_QUEUES_SMS_INBOUND": "Atlasītās īsziņu rindas",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Visas Open Channel rindas",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Atlasītās atvērto kanālu rindas",
-    "ALL_QUEUES_FAX_INBOUND": "Visas faksa rindas",
-    "SELECTED_QUEUES_FAX_INBOUND": "Atlasītās faksa rindas",
+    "ALL_QUEUE_CAMPAIGNS": "Visas rindas kampaņas",
+    "SELECTED_QUEUE_CAMPAIGNS": "Atlasītās rindas kampaņas",
+    "ALL_VOICE_QUEUES": "Visas balss rindas",
+    "SELECTED_VOICE_QUEUES": "Atlasītās balss rindas",
+    "ALL_CHAT_QUEUES": "Visas tērzēšanas rindas",
+    "SELECTED_CHAT_QUEUES": "Atlasītās tērzēšanas rindas",
+    "ALL_MAIL_QUEUES": "Visas e-pasta rindas",
+    "SELECTED_MAIL_QUEUES": "Atlasītās e-pasta rindas",
+    "ALL_SMS_QUEUES": "Visas īsziņu rindas",
+    "SELECTED_SMS_QUEUES": "Atlasītās īsziņu rindas",
+    "ALL_OPENCHANNEL_QUEUES": "Visas Open Channel rindas",
+    "SELECTED_OPENCHANNEL_QUEUES": "Atlasītās atvērto kanālu rindas",
+    "ALL_FAX_QUEUES": "Visas faksa rindas",
+    "SELECTED_FAX_QUEUES": "Atlasītās faksa rindas",
     "VOICEMAIL": "Balss pasts",
     "SHOWWEBCONTROL": "Tipoloģija",
     "PAGE": "Lappuse",
@@ -339,12 +339,12 @@
     "BLOCKED": "Slēgts",
     "DISABLED": "Deaktivizēts",
     "REGENERATE": "Atjaunot",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Visas WhatsApp rindas",
+    "ALL_WHATSAPP_QUEUES": "Visas WhatsApp rindas",
     "ALL_WHATSAPPACCOUNTS": "Visi WhatsApp konti",
     "ALL_WHATSAPPQUEUES": "Visas Kasaspa rindas",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Pievienojiet aģentu WhatsApp rindām",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Pievienojiet aģentu WhatsApp rindām",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Pievienojiet lietotāju WhatsApp rindām",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Atlasītās WhatsApp rindas",
+    "SELECTED_WHATSAPP_QUEUES": "Atlasītās WhatsApp rindas",
     "SELECTED_WHATSAPPACCOUNTS": "Atlasītie WhatsApp konti",
     "SELECTED_WHATSAPPQUEUES": "Atlasītās WhatsApp rindas",
     "USERADD_WHATSAPPACCOUNTS": "Pievienojiet WhatsApp kontu lietotājam",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty sesijas",
     "OMNICHANNEL_INTERACTIONS": "Visu kanālu mijiedarbība",
     "SCREEN_RECORDINGS": "Ekrāna ieraksti",
-    "VOICE_RECORDINGS": "Balss ieraksti"
+    "VOICE_RECORDINGS": "Balss ieraksti",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorēt aģenta pārtraukuma statusu priekšskatījuma zvaniem",
+    "SELECT_RECALLME_CAMPAIGN": "Atlasiet Atsaukt mani kampaņa",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Pievienot aģentu rindas kampaņām",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Pievienot pārstāvi balss rindām",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Pievienot aģentu tērzēšanas rindām",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Pievienot aģentu e-pasta rindām",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Pievienot aģentu īsziņu rindām",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Pievienot aģentu atvērtā kanāla rindām",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Pievienot aģentu faksa rindām",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Visas rindas kampaņas",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Atlasītās rindas kampaņas",
+    "ALL_QUEUES_VOICE_INBOUND": "Visas balss rindas",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Atlasītās balss rindas",
+    "ALL_QUEUES_CHAT_INBOUND": "Visas tērzēšanas rindas",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Atlasītās tērzēšanas rindas",
+    "ALL_QUEUES_MAIL_INBOUND": "Visas e-pasta rindas",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Atlasītās e-pasta rindas",
+    "ALL_QUEUES_SMS_INBOUND": "Visas īsziņu rindas",
+    "SELECTED_QUEUES_SMS_INBOUND": "Atlasītās īsziņu rindas",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Visas Open Channel rindas",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Atlasītās atvērto kanālu rindas",
+    "ALL_QUEUES_FAX_INBOUND": "Visas faksa rindas",
+    "SELECTED_QUEUES_FAX_INBOUND": "Atlasītās faksa rindas",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Visas WhatsApp rindas",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Pievienojiet aģentu WhatsApp rindām",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Atlasītās WhatsApp rindas"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/nl.json b/public/app/main/apps/staff/i18n/nl.json
index 835f03f..3ab5fcb 100644
--- a/public/app/main/apps/staff/i18n/nl.json
+++ b/public/app/main/apps/staff/i18n/nl.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Stel de standaard transporteert. De volgorde bepaalt de primaire standaard transport.",
       "HOST": "Hoe vind ik de client - IP of hostnaam. Als u wilt dat de telefoon aan te melden, gebruik het trefwoord dynamische in plaats van Host IP.",
       "NAT": "Verandert het gedrag van Asterisk voor cliënten achter een firewall.Indien een van de comma-separated opties is 'nee', sterretje negeert andere instellingen en stel nat=no.",
-      "SIPEXPIRES": "Standaard: 120",
+      "SIPEXPIRES": "Standaard: 160",
       "SIPPORT": "Standaard: 5160",
       "TYPE": "Bepaalt de SIP-rol binnen asterisk. Gebruiker: gebruikt ter verificatie van binnenkomend - Peer: voor uitgaande gesprekken - vriend: zowel kenmerken van het bovenstaande.",
       "CHATCAPACITY": "Nul betekent onbeperkt.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Alle modules beschikbaar",
     "CALLGROUP": "Groepsgesprek",
     "PICKUPGROUP": "Groepsgesprekken",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agent toevoegen aan wachtrij campagnes",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Voeg Agent Voice wachtrijen",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Voeg Agent Chatwachtrijen",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Voeg Agent Mailwachtrijen",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Voeg Agent naar SMS-wachtrijen",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Voeg Agent Open kanaal wachtrijen",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Voeg Agent Faxwachtrijen",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Agent toevoegen aan wachtrij campagnes",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Voeg Agent Voice wachtrijen",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Voeg Agent Chatwachtrijen",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Voeg Agent Mailwachtrijen",
+    "ADD_AGENT_TO_SMS_QUEUES": "Voeg Agent naar SMS-wachtrijen",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Voeg Agent Open kanaal wachtrijen",
+    "ADD_AGENT_TO_FAX_QUEUES": "Voeg Agent Faxwachtrijen",
     "QUEUEADD_USER_VOICE_INBOUND": "Gebruiker toevoegen aan Voice-wachtrijen",
     "QUEUEADD_USER_CHAT_INBOUND": "Gebruiker toevoegen aan Chatwachtrijen",
     "QUEUEADD_USER_MAIL_INBOUND": "Gebruiker toevoegen aan Mailwachtrijen",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Alle teams",
     "SELECTED_TEAMS": "Geselecteerde teams",
     "SELECTED_AGENTS": "Geselecteerde agenten",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Wachtrij campagnes",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Geselecteerde Wachtrij campagnes",
-    "ALL_QUEUES_VOICE_INBOUND": "Alle spraak wachtrijen",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Geselecteerde wachtrijen",
-    "ALL_QUEUES_CHAT_INBOUND": "Alle wachtrijen",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Geselecteerde Chatwachtrijen",
-    "ALL_QUEUES_MAIL_INBOUND": "Alle Mailwachtrijen",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Geselecteerde Mailwachtrijen",
-    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-wachtrijen",
-    "SELECTED_QUEUES_SMS_INBOUND": "Geselecteerde SMS wachtrijen",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle open kanaal wachtrijen",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Geselecteerde Open kanaal wachtrijen",
-    "ALL_QUEUES_FAX_INBOUND": "Alle Faxwachtrijen",
-    "SELECTED_QUEUES_FAX_INBOUND": "Geselecteerde Faxwachtrijen",
+    "ALL_QUEUE_CAMPAIGNS": "Alle Wachtrij campagnes",
+    "SELECTED_QUEUE_CAMPAIGNS": "Geselecteerde Wachtrij campagnes",
+    "ALL_VOICE_QUEUES": "Alle spraak wachtrijen",
+    "SELECTED_VOICE_QUEUES": "Geselecteerde wachtrijen",
+    "ALL_CHAT_QUEUES": "Alle wachtrijen",
+    "SELECTED_CHAT_QUEUES": "Geselecteerde Chatwachtrijen",
+    "ALL_MAIL_QUEUES": "Alle Mailwachtrijen",
+    "SELECTED_MAIL_QUEUES": "Geselecteerde Mailwachtrijen",
+    "ALL_SMS_QUEUES": "Alle SMS-wachtrijen",
+    "SELECTED_SMS_QUEUES": "Geselecteerde SMS wachtrijen",
+    "ALL_OPENCHANNEL_QUEUES": "Alle open kanaal wachtrijen",
+    "SELECTED_OPENCHANNEL_QUEUES": "Geselecteerde Open kanaal wachtrijen",
+    "ALL_FAX_QUEUES": "Alle Faxwachtrijen",
+    "SELECTED_FAX_QUEUES": "Geselecteerde Faxwachtrijen",
     "VOICEMAIL": "Voicemail",
     "SHOWWEBCONTROL": "Show Web Control",
     "PAGE": "Pagina",
@@ -339,12 +339,12 @@
     "BLOCKED": "Op slot",
     "DISABLED": "Gedeactiveerd",
     "REGENERATE": "Regenereren",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-wachtrijen",
+    "ALL_WHATSAPP_QUEUES": "Alle WhatsApp-wachtrijen",
     "ALL_WHATSAPPACCOUNTS": "Alle WhatsApp-accounts",
     "ALL_WHATSAPPQUEUES": "Alle Whataspp-wachtrijen",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Voeg agent toe aan WhatsApp-wachtrijen",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Voeg agent toe aan WhatsApp-wachtrijen",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Gebruiker toevoegen aan WhatsApp-wachtrijen",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Geselecteerde WhatsApp-wachtrijen",
+    "SELECTED_WHATSAPP_QUEUES": "Geselecteerde WhatsApp-wachtrijen",
     "SELECTED_WHATSAPPACCOUNTS": "Geselecteerde WhatsApp-accounts",
     "SELECTED_WHATSAPPQUEUES": "Geselecteerde WhatsApp-wachtrijen",
     "USERADD_WHATSAPPACCOUNTS": "Voeg WhatsApp-account toe aan gebruiker",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty-sessies",
     "OMNICHANNEL_INTERACTIONS": "Omnichannel-interacties",
     "SCREEN_RECORDINGS": "Schermopnames",
-    "VOICE_RECORDINGS": "Spraakopnamen"
+    "VOICE_RECORDINGS": "Spraakopnamen",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Negeer de status van agentonderbreking voor voorbeeldgesprekken",
+    "SELECT_RECALLME_CAMPAIGN": "Selecteer Recall Me-campagne",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Agent toevoegen aan wachtrij campagnes",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Voeg Agent Voice wachtrijen",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Voeg Agent Chatwachtrijen",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Voeg Agent Mailwachtrijen",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Voeg Agent naar SMS-wachtrijen",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Voeg Agent Open kanaal wachtrijen",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Voeg Agent Faxwachtrijen",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Alle Wachtrij campagnes",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Geselecteerde Wachtrij campagnes",
+    "ALL_QUEUES_VOICE_INBOUND": "Alle spraak wachtrijen",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Geselecteerde wachtrijen",
+    "ALL_QUEUES_CHAT_INBOUND": "Alle wachtrijen",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Geselecteerde Chatwachtrijen",
+    "ALL_QUEUES_MAIL_INBOUND": "Alle Mailwachtrijen",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Geselecteerde Mailwachtrijen",
+    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-wachtrijen",
+    "SELECTED_QUEUES_SMS_INBOUND": "Geselecteerde SMS wachtrijen",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle open kanaal wachtrijen",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Geselecteerde Open kanaal wachtrijen",
+    "ALL_QUEUES_FAX_INBOUND": "Alle Faxwachtrijen",
+    "SELECTED_QUEUES_FAX_INBOUND": "Geselecteerde Faxwachtrijen",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-wachtrijen",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Voeg agent toe aan WhatsApp-wachtrijen",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Geselecteerde WhatsApp-wachtrijen"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/no.json b/public/app/main/apps/staff/i18n/no.json
index 1e918f6..8d71e11 100644
--- a/public/app/main/apps/staff/i18n/no.json
+++ b/public/app/main/apps/staff/i18n/no.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Angi standard transporterer. Rekkefølgen bestemmer den primære standard transport.",
       "HOST": "Hvordan finne klienten - IP eller vertsnavnet. Hvis du vil at telefonen skal registrere seg, bruk nøkkelord dynamisk i stedet for Host IP.",
       "NAT": "Endrer oppførselen til stjerne for klienter bak en brannmur.Hvis noen av kommaseparert alternativer er 'Nei', stjerne vil ignorere andre innstillinger og sette nat=Nei.",
-      "SIPEXPIRES": "Standard: 120",
+      "SIPEXPIRES": "Standard: 160",
       "SIPPORT": "Standard: 5160",
       "TYPE": "Bestemmer SIP rolle innen stjerne. Bruker: brukes til å autentisere innkommende - Peer: for utgående anrop - venn: dekker både egenskapene til ovenfor.",
       "CHATCAPACITY": "Null betyr ubegrenset.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Alle moduler tilgjengelig",
     "CALLGROUP": "Ring gruppe",
     "PICKUPGROUP": "Pickup-gruppe",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Legg til Agent til kø-kampanjer",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Legg til Agent til Voice køer",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Legg til Agent til å prate køer",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Legg til Agent til post køer",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Legg til Agent til SMS-køer",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Legg til Agent for å åpne kanalen køer",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Legg til Agent til faks køer",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Legg til Agent til kø-kampanjer",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Legg til Agent til Voice køer",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Legg til Agent til å prate køer",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Legg til Agent til post køer",
+    "ADD_AGENT_TO_SMS_QUEUES": "Legg til Agent til SMS-køer",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Legg til Agent for å åpne kanalen køer",
+    "ADD_AGENT_TO_FAX_QUEUES": "Legg til Agent til faks køer",
     "QUEUEADD_USER_VOICE_INBOUND": "Legg brukeren til å stemme køer",
     "QUEUEADD_USER_CHAT_INBOUND": "Legg brukeren til å prate køer",
     "QUEUEADD_USER_MAIL_INBOUND": "Legg brukeren til post køer",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Alle grupper",
     "SELECTED_TEAMS": "Valgte lag",
     "SELECTED_AGENTS": "Valgt agenter",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Alle kø kampanjer",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valgte kø kampanjer",
-    "ALL_QUEUES_VOICE_INBOUND": "Alle Voice køer",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Valgt stemme køer",
-    "ALL_QUEUES_CHAT_INBOUND": "Alle Chat køer",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Valgt Chat køer",
-    "ALL_QUEUES_MAIL_INBOUND": "Alle post-køer",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Valgt post køer",
-    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-køer",
-    "SELECTED_QUEUES_SMS_INBOUND": "Valgt SMS køer",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle åpne kanal køer",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valgt åpen kanal køer",
-    "ALL_QUEUES_FAX_INBOUND": "Alle faks køer",
-    "SELECTED_QUEUES_FAX_INBOUND": "Valgt faks køer",
+    "ALL_QUEUE_CAMPAIGNS": "Alle kø kampanjer",
+    "SELECTED_QUEUE_CAMPAIGNS": "Valgte kø kampanjer",
+    "ALL_VOICE_QUEUES": "Alle Voice køer",
+    "SELECTED_VOICE_QUEUES": "Valgt stemme køer",
+    "ALL_CHAT_QUEUES": "Alle Chat køer",
+    "SELECTED_CHAT_QUEUES": "Valgt Chat køer",
+    "ALL_MAIL_QUEUES": "Alle post-køer",
+    "SELECTED_MAIL_QUEUES": "Valgt post køer",
+    "ALL_SMS_QUEUES": "Alle SMS-køer",
+    "SELECTED_SMS_QUEUES": "Valgt SMS køer",
+    "ALL_OPENCHANNEL_QUEUES": "Alle åpne kanal køer",
+    "SELECTED_OPENCHANNEL_QUEUES": "Valgt åpen kanal køer",
+    "ALL_FAX_QUEUES": "Alle faks køer",
+    "SELECTED_FAX_QUEUES": "Valgt faks køer",
     "VOICEMAIL": "Talebeskjed",
     "SHOWWEBCONTROL": "Vis Web-kontroll",
     "PAGE": "Siden",
@@ -339,12 +339,12 @@
     "BLOCKED": "Låst",
     "DISABLED": "Deaktivert",
     "REGENERATE": "regenerere",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-køer",
+    "ALL_WHATSAPP_QUEUES": "Alle WhatsApp-køer",
     "ALL_WHATSAPPACCOUNTS": "Alle WhatsApp-kontoer",
     "ALL_WHATSAPPQUEUES": "Alle Whataspp-køer",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Legg agent til WhatsApp-køer",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Legg agent til WhatsApp-køer",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Legg til bruker i WhatsApp-køer",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valgte WhatsApp-køer",
+    "SELECTED_WHATSAPP_QUEUES": "Valgte WhatsApp-køer",
     "SELECTED_WHATSAPPACCOUNTS": "Valgte WhatsApp-kontoer",
     "SELECTED_WHATSAPPQUEUES": "Valgte WhatsApp-køer",
     "USERADD_WHATSAPPACCOUNTS": "Legg WhatsApp-konto til brukeren",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty Sessions",
     "OMNICHANNEL_INTERACTIONS": "Omnichannel-interaksjoner",
     "SCREEN_RECORDINGS": "Skjermopptak",
-    "VOICE_RECORDINGS": "Stemmeopptak"
+    "VOICE_RECORDINGS": "Stemmeopptak",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorer agentpausestatus for forhåndsvisningsanrop",
+    "SELECT_RECALLME_CAMPAIGN": "Velg Recall Me Campaign",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Legg til Agent til kø-kampanjer",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Legg til Agent til Voice køer",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Legg til Agent til å prate køer",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Legg til Agent til post køer",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Legg til Agent til SMS-køer",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Legg til Agent for å åpne kanalen køer",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Legg til Agent til faks køer",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Alle kø kampanjer",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valgte kø kampanjer",
+    "ALL_QUEUES_VOICE_INBOUND": "Alle Voice køer",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Valgt stemme køer",
+    "ALL_QUEUES_CHAT_INBOUND": "Alle Chat køer",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Valgt Chat køer",
+    "ALL_QUEUES_MAIL_INBOUND": "Alle post-køer",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Valgt post køer",
+    "ALL_QUEUES_SMS_INBOUND": "Alle SMS-køer",
+    "SELECTED_QUEUES_SMS_INBOUND": "Valgt SMS køer",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alle åpne kanal køer",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valgt åpen kanal køer",
+    "ALL_QUEUES_FAX_INBOUND": "Alle faks køer",
+    "SELECTED_QUEUES_FAX_INBOUND": "Valgt faks køer",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Alle WhatsApp-køer",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Legg agent til WhatsApp-køer",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valgte WhatsApp-køer"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/pl.json b/public/app/main/apps/staff/i18n/pl.json
index 6ed21f7..9881495 100644
--- a/public/app/main/apps/staff/i18n/pl.json
+++ b/public/app/main/apps/staff/i18n/pl.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Ustawianie domyślnego transporty w kolejności preferencji",
       "HOST": "Jak znaleźć klienta - adres IP lub nazwa hosta. Jeśli chcesz telefon aby zarejestrować się, należy użyć słowa kluczowego dynamiczne zamiast IP hosta",
       "NAT": "Zmiany zachowań gwiazdka dla klientów za zaporą ogniową. Jeżeli którykolwiek z oddzielonych przecinkami opcji 'no', gwiazdka będzie ignorował pozostałych ustawień i ustawić nat=no",
-      "SIPEXPIRES": "Domyślnie: 120",
+      "SIPEXPIRES": "Domyślnie: 160",
       "SIPPORT": "Wartość domyślna: 5160",
       "TYPE": "Ustala SIP roli w gwiazdki. Użytkownik: używane do uwierzytelniania przychodzące - Peer: dla połączeń wychodzących - przyjaciela: obejmuje zarówno charakterystyki powyżej",
       "CHATCAPACITY": "Maksymalna liczba jednoczesnych kanałów interakcji na agenta (0=nieograniczona)",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Wszystkie dostępne moduły",
     "CALLGROUP": "Zaproszenie grupy",
     "PICKUPGROUP": "Grupy przejmowania połączeń",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Dodaj agenta do kolejki kampanie reklamowe",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Dodaj agenta do głosu kolejek",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Dodaj agenta do rozmów kolejek",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Dodaj agenta do kolejek poczty",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Dodaj agenta do kolejki wiadomości SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Dodaj agenta do otwartego kanału kolejek",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Dodaj agenta do kolejek faksu",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Dodaj agenta do kolejki kampanie reklamowe",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Dodaj agenta do głosu kolejek",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Dodaj agenta do rozmów kolejek",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Dodaj agenta do kolejek poczty",
+    "ADD_AGENT_TO_SMS_QUEUES": "Dodaj agenta do kolejki wiadomości SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Dodaj agenta do otwartego kanału kolejek",
+    "ADD_AGENT_TO_FAX_QUEUES": "Dodaj agenta do kolejek faksu",
     "QUEUEADD_USER_VOICE_INBOUND": "Dodaj użytkownika do głosu kolejek",
     "QUEUEADD_USER_CHAT_INBOUND": "Dodaj użytkownika do rozmów kolejek",
     "QUEUEADD_USER_MAIL_INBOUND": "Dodaj użytkownika do kolejek poczty",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Wszystkie zespoły",
     "SELECTED_TEAMS": "Wybrane zespoły",
     "SELECTED_AGENTS": "Wybranych agentów",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Wszystkie kampanie kolejki",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Wybrane kampanie kolejki",
-    "ALL_QUEUES_VOICE_INBOUND": "Wszystkie notatki głosowe kolejek",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Wybrane głos kolejek",
-    "ALL_QUEUES_CHAT_INBOUND": "Wszystkich kolejek czatu",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Wybrany Czat kolejek",
-    "ALL_QUEUES_MAIL_INBOUND": "Wszystkich kolejek poczty",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Wybrane kolejek poczty",
-    "ALL_QUEUES_SMS_INBOUND": "Wszystkich kolejek SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "Wybrany SMS kolejek",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Wszystkie Wiekszość kolejek",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Wybrane Wiekszość kolejek",
-    "ALL_QUEUES_FAX_INBOUND": "Wszystkie kolejki faksów",
-    "SELECTED_QUEUES_FAX_INBOUND": "Wybrane Fax kolejek",
+    "ALL_QUEUE_CAMPAIGNS": "Wszystkie kampanie kolejki",
+    "SELECTED_QUEUE_CAMPAIGNS": "Wybrane kampanie kolejki",
+    "ALL_VOICE_QUEUES": "Wszystkie notatki głosowe kolejek",
+    "SELECTED_VOICE_QUEUES": "Wybrane głos kolejek",
+    "ALL_CHAT_QUEUES": "Wszystkich kolejek czatu",
+    "SELECTED_CHAT_QUEUES": "Wybrany Czat kolejek",
+    "ALL_MAIL_QUEUES": "Wszystkich kolejek poczty",
+    "SELECTED_MAIL_QUEUES": "Wybrane kolejek poczty",
+    "ALL_SMS_QUEUES": "Wszystkich kolejek SMS",
+    "SELECTED_SMS_QUEUES": "Wybrany SMS kolejek",
+    "ALL_OPENCHANNEL_QUEUES": "Wszystkie Wiekszość kolejek",
+    "SELECTED_OPENCHANNEL_QUEUES": "Wybrane Wiekszość kolejek",
+    "ALL_FAX_QUEUES": "Wszystkie kolejki faksów",
+    "SELECTED_FAX_QUEUES": "Wybrane Fax kolejek",
     "VOICEMAIL": "Poczta głosowa",
     "SHOWWEBCONTROL": "Pokaż Web Control",
     "PAGE": "Page",
@@ -339,12 +339,12 @@
     "BLOCKED": "Zablokowany",
     "DISABLED": "Dezaktywowano",
     "REGENERATE": "Zregenerować",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Wszystkie kolejki WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Wszystkie kolejki WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Wszystkie konta WhatsApp",
     "ALL_WHATSAPPQUEUES": "Wszystkie kolejki Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Dodaj agenta do kolejek WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Dodaj agenta do kolejek WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Dodaj użytkownika do kolejek WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Wybrane kolejki WhatsApp",
+    "SELECTED_WHATSAPP_QUEUES": "Wybrane kolejki WhatsApp",
     "SELECTED_WHATSAPPACCOUNTS": "Wybrane konta WhatsApp",
     "SELECTED_WHATSAPPQUEUES": "Wybrane kolejki WhatsApp",
     "USERADD_WHATSAPPACCOUNTS": "Dodaj konto WhatsApp do użytkownika",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sesje Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Interakcje wielokanałowe",
     "SCREEN_RECORDINGS": "Nagrania ekranu",
-    "VOICE_RECORDINGS": "Nagrania głosowe"
+    "VOICE_RECORDINGS": "Nagrania głosowe",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignoruj stan przerwania agenta dla połączeń podglądu",
+    "SELECT_RECALLME_CAMPAIGN": "Wybierz kampanię Przypomnij mnie",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Dodaj agenta do kolejki kampanie reklamowe",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Dodaj agenta do głosu kolejek",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Dodaj agenta do rozmów kolejek",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Dodaj agenta do kolejek poczty",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Dodaj agenta do kolejki wiadomości SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Dodaj agenta do otwartego kanału kolejek",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Dodaj agenta do kolejek faksu",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Wszystkie kampanie kolejki",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Wybrane kampanie kolejki",
+    "ALL_QUEUES_VOICE_INBOUND": "Wszystkie notatki głosowe kolejek",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Wybrane głos kolejek",
+    "ALL_QUEUES_CHAT_INBOUND": "Wszystkich kolejek czatu",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Wybrany Czat kolejek",
+    "ALL_QUEUES_MAIL_INBOUND": "Wszystkich kolejek poczty",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Wybrane kolejek poczty",
+    "ALL_QUEUES_SMS_INBOUND": "Wszystkich kolejek SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Wybrany SMS kolejek",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Wszystkie Wiekszość kolejek",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Wybrane Wiekszość kolejek",
+    "ALL_QUEUES_FAX_INBOUND": "Wszystkie kolejki faksów",
+    "SELECTED_QUEUES_FAX_INBOUND": "Wybrane Fax kolejek",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Wszystkie kolejki WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Dodaj agenta do kolejek WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Wybrane kolejki WhatsApp"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/pt-BR.json b/public/app/main/apps/staff/i18n/pt-BR.json
index bf2c9d3..2c3fdf2 100644
--- a/public/app/main/apps/staff/i18n/pt-BR.json
+++ b/public/app/main/apps/staff/i18n/pt-BR.json
@@ -109,7 +109,7 @@
       "TRANSPORT": "Definir os transportes padrão em ordem de preferência",
       "HOST": "Como encontrar o cliente - IP ou nome do host. Se você deseja que o telefone se registre, use a palavra-chave dynamic em vez de Host IP",
       "NAT": "Altera o comportamento do Asterisk para clientes por trás de um firewall. Se qualquer uma das opções separadas por vírgulas for 'no', o Asterisk irá ignorar outras configurações e definir nat = no",
-      "SIPEXPIRES": "Padrão: 120",
+      "SIPEXPIRES": "Padrão: 160",
       "SIPPORT": "Padrão: 5160",
       "TYPE": "Determina o papel do SIP no asterisco. Usuário: usado para autenticar entrada - Peer: para chamadas de saída - Amigo: abrange ambas as características do acima",
       "CHATCAPACITY": "Número máximo de interações de canal simultâneas por agente (0 = ilimitado)",
@@ -166,65 +166,65 @@
     "SIPPORT": "Porta SIP",
     "PENALTY": "Prioridade",
     "ACCOUNTNAME": "Nome da conta",
-    "ADD_TELEPHONE": "Adicionar Telefone",
-    "EDIT_TELEPHONE": "Editar Telefone",
-    "DELETE_TELEPHONE": "Excluir Telefone",
-    "TEAMS": "Equipes",
-    "DELETE_TEAM": "Excluir Equipe",
-    "AGENTADD_TEAM": "Adicionar agentes na equipe",
-    "EDIT_TEAM": "Editar Equipe",
+    "ADD_TELEPHONE": "Adicionar Ramal",
+    "EDIT_TELEPHONE": "Editar Ramal",
+    "DELETE_TELEPHONE": "Excluir Ramal",
+    "TEAMS": "Grupos",
+    "DELETE_TEAM": "Excluir Grupo",
+    "AGENTADD_TEAM": "Adicionar agentes no grupo",
+    "EDIT_TEAM": "Editar Grupo",
     "TYPE": "Tipo",
-    "TELEPHONES": "Telefones",
+    "TELEPHONES": "Ramais",
     "CALLERID": "Identificador de chamadas",
     "ENABLERECORDING": "Ativar gravação",
-    "STAFF": "Pessoal",
+    "STAFF": "Equipe",
     "ID": "Id",
     "NEW_USER": "Novo Usuário",
     "NEW_AGENT": "Novo Agente",
-    "NEW_TELEPHONE": "Novo Telefone",
-    "NEW_TEAM": "Nova Equipe",
-    "ADD_TEAM": "Adicionar Equipe",
+    "NEW_TELEPHONE": "Novo Ramal",
+    "NEW_TEAM": "Novo Grupo",
+    "ADD_TEAM": "Adicionar Grupo",
     "JOIN_QUEUE": "Junte-se à fila",
     "CAPACITY": "Capacidade",
     "AUTOINTERNAL": "Auto gerar número interno",
-    "ADD_AGENT_TO_TEAM": "Adicionar agente na equipe",
-    "TEAMADD_AGENT": "Adicionar agente na equipe",
+    "ADD_AGENT_TO_TEAM": "Adicionar agente no grupo",
+    "TEAMADD_AGENT": "Adicionar agente no grupo",
     "NO_AVAILABLE_INFO": "Nenhuma informação disponível",
     "PERMISSIONS": "Permissões",
     "ADD_AGENT_TO_QUEUE": "Adicionar agente à fila",
     "ALL_MODULES_AVAILABLE": "Todos os módulos disponíveis",
     "CALLGROUP": "Grupo de Chamadas",
     "PICKUPGROUP": "Grupo de retirada",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Adicionar agente a campanhas de fila",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Adicionar agente às filas de voz",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Adicionar agente às filas de Chat",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Adicionar agente às filas de emails",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Adicionar agente às filas do SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Adicionar agente às filas do Open Channel",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Adicionar agente às filas de fax",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Adicionar agente a campanhas de fila",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Adicionar agente às filas de voz",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Adicionar agente às filas de Chat",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Adicionar agente às filas de emails",
+    "ADD_AGENT_TO_SMS_QUEUES": "Adicionar agente às filas do SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Adicionar agente às filas do Open Channel",
+    "ADD_AGENT_TO_FAX_QUEUES": "Adicionar agente às filas de fax",
     "QUEUEADD_USER_VOICE_INBOUND": "Adicionar usuário às filas de voz",
     "QUEUEADD_USER_CHAT_INBOUND": "Adicionar usuário a filas de Chat",
     "QUEUEADD_USER_MAIL_INBOUND": "Adicionar usuário a filas de e-mail",
     "QUEUEADD_USER_SMS_INBOUND": "Adicionar usuário às filas do SMS",
     "QUEUEADD_USER_OPENCHANNEL_INBOUND": "Adicionar usuário para filas do Open Channel",
     "QUEUEADD_USER_FAX_INBOUND": "Adicionar usuário às filas de fax",
-    "ALL_TEAMS": "Todas as equipes",
-    "SELECTED_TEAMS": "Equipes Selecionadas",
+    "ALL_TEAMS": "Todos os grupos",
+    "SELECTED_TEAMS": "Grupos Selecionados",
     "SELECTED_AGENTS": "Agentes Selecionados",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Todas as campanhas de filas",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campanhas de Filas Selecionadas",
-    "ALL_QUEUES_VOICE_INBOUND": "Todas as filas de voz",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Filas de voz selecionadas",
-    "ALL_QUEUES_CHAT_INBOUND": "Todas as filas de Chat",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Filas de Chat Selecionadas",
-    "ALL_QUEUES_MAIL_INBOUND": "Todas as filas de email",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Filas de E-mail Selecionadas",
-    "ALL_QUEUES_SMS_INBOUND": "Todas as filas do SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "Filas SMS Selecionadas",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas as filas do Open Channel",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Filas de Open Channel Selecionadas",
-    "ALL_QUEUES_FAX_INBOUND": "Todas as filas de fax",
-    "SELECTED_QUEUES_FAX_INBOUND": "Filas de fax selecionadas",
+    "ALL_QUEUE_CAMPAIGNS": "Todas as campanhas de filas",
+    "SELECTED_QUEUE_CAMPAIGNS": "Campanhas de Filas Selecionadas",
+    "ALL_VOICE_QUEUES": "Todas as filas de voz",
+    "SELECTED_VOICE_QUEUES": "Filas de voz selecionadas",
+    "ALL_CHAT_QUEUES": "Todas as filas de Chat",
+    "SELECTED_CHAT_QUEUES": "Filas de Chat Selecionadas",
+    "ALL_MAIL_QUEUES": "Todas as filas de email",
+    "SELECTED_MAIL_QUEUES": "Filas de E-mail Selecionadas",
+    "ALL_SMS_QUEUES": "Todas as filas do SMS",
+    "SELECTED_SMS_QUEUES": "Filas SMS Selecionadas",
+    "ALL_OPENCHANNEL_QUEUES": "Todas as filas do Open Channel",
+    "SELECTED_OPENCHANNEL_QUEUES": "Filas de Open Channel Selecionadas",
+    "ALL_FAX_QUEUES": "Todas as filas de fax",
+    "SELECTED_FAX_QUEUES": "Filas de fax selecionadas",
     "VOICEMAIL": "Correio de voz",
     "SHOWWEBCONTROL": "Tipologia",
     "PAGE": "Página",
@@ -323,7 +323,7 @@
     "REPORT_TYPE": "Tipo de relatório",
     "SECTIONS": "Seções",
     "SUMMARY": "Resumo",
-    "TEAMS_ASSOCIATION": "Associação de equipes",
+    "TEAMS_ASSOCIATION": "Associação de grupos",
     "USERPROFILE": "Perfil de usuário",
     "USERPROFILES": "Perfis de usuário",
     "PERMISSIONS_UNAUTHORIZED_CREATION_MESSAGE": "Você não tem permissão para criar o recurso",
@@ -339,12 +339,12 @@
     "BLOCKED": "Bloqueado",
     "DISABLED": "Desativado",
     "REGENERATE": "Regenerado",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas as filas de WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Todas as filas de WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Todas as contas WhatsApp",
     "ALL_WHATSAPPQUEUES": "Todas as filas Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Adicionar agente às filas do WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Adicionar agente às filas do WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Adicionar usuário às filas do WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Filas de WhatsApp selecionadas",
+    "SELECTED_WHATSAPP_QUEUES": "Filas de WhatsApp selecionadas",
     "SELECTED_WHATSAPPACCOUNTS": "Contas WhatsApp selecionadas",
     "SELECTED_WHATSAPPQUEUES": "Filas de WhatsApp selecionadas",
     "USERADD_WHATSAPPACCOUNTS": "Adicionar conta WhatsApp ao usuário",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sessões Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Interações Omnichannel",
     "SCREEN_RECORDINGS": "Gravações de tela",
-    "VOICE_RECORDINGS": "Gravações de Voz"
+    "VOICE_RECORDINGS": "Gravações de Voz",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorar o status de interrupção do agente para chamadas de visualização",
+    "SELECT_RECALLME_CAMPAIGN": "Selecione a campanha Recall Me",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Adicionar agente a campanhas de fila",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Adicionar agente às filas de voz",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Adicionar agente às filas de Chat",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Adicionar agente às filas de emails",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Adicionar agente às filas do SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Adicionar agente às filas do Open Channel",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Adicionar agente às filas de fax",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Todas as campanhas de filas",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campanhas de Filas Selecionadas",
+    "ALL_QUEUES_VOICE_INBOUND": "Todas as filas de voz",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Filas de voz selecionadas",
+    "ALL_QUEUES_CHAT_INBOUND": "Todas as filas de Chat",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Filas de Chat Selecionadas",
+    "ALL_QUEUES_MAIL_INBOUND": "Todas as filas de email",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Filas de E-mail Selecionadas",
+    "ALL_QUEUES_SMS_INBOUND": "Todas as filas do SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Filas SMS Selecionadas",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas as filas do Open Channel",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Filas de Open Channel Selecionadas",
+    "ALL_QUEUES_FAX_INBOUND": "Todas as filas de fax",
+    "SELECTED_QUEUES_FAX_INBOUND": "Filas de fax selecionadas",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas as filas de WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Adicionar agente às filas do WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Filas de WhatsApp selecionadas"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/pt-PT.json b/public/app/main/apps/staff/i18n/pt-PT.json
index 44742f9..4d002fd 100644
--- a/public/app/main/apps/staff/i18n/pt-PT.json
+++ b/public/app/main/apps/staff/i18n/pt-PT.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Defina o padrão de transportes. A ordem determina o transporte primário padrão.",
       "HOST": "Como encontrar o cliente - O IP ou o nome do host. Se desejar que o telefone para se registrar, use a palavra-chave dinâmica em vez do host IP.",
       "NAT": "Altera o comportamento do asterisco para clientes atrás de um firewall.Se qualquer uma das opções separadas por vírgula é \"não\", asterisco será ignorar quaisquer outras configurações e defina nat=n°",
-      "SIPEXPIRES": "Padrão: 120",
+      "SIPEXPIRES": "Padrão: 160",
       "SIPPORT": "Padrão: 5160",
       "TYPE": "Determina o papel SIP dentro de asterisco. Usuário: usado para autenticar - Ponto de entrada: para chamadas de saída - amigo: abrange tanto as características do acima.",
       "CHATCAPACITY": "Zero significa ilimitado.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Todos os módulos disponíveis",
     "CALLGROUP": "Grupo de chamada",
     "PICKUPGROUP": "Grupo de captura",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Adicionar agente para fila de campanhas",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Adicionar agente para filas de voz",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Adicionar agente para filas de bate-papo",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Adicionar agente para filas de correio",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Adicionar agente para filas de SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Adicionar agente para filas de canal aberto",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Adicionar agente para filas de Fax",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Adicionar agente para fila de campanhas",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Adicionar agente para filas de voz",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Adicionar agente para filas de bate-papo",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Adicionar agente para filas de correio",
+    "ADD_AGENT_TO_SMS_QUEUES": "Adicionar agente para filas de SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Adicionar agente para filas de canal aberto",
+    "ADD_AGENT_TO_FAX_QUEUES": "Adicionar agente para filas de Fax",
     "QUEUEADD_USER_VOICE_INBOUND": "Adicionar usuário à filas de voz",
     "QUEUEADD_USER_CHAT_INBOUND": "Adicionar usuário para filas de bate-papo",
     "QUEUEADD_USER_MAIL_INBOUND": "Adicionar usuário ao Mail filas",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Todas as equipas",
     "SELECTED_TEAMS": "Equipes selecionadas",
     "SELECTED_AGENTS": "Agentes selecionados",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Todas as campanhas de fila",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campanhas de filas selecionado",
-    "ALL_QUEUES_VOICE_INBOUND": "Todas as filas de voz",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Filas de voz selecionado",
-    "ALL_QUEUES_CHAT_INBOUND": "Todas as filas de bate-papo",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Filas de chat selecionado",
-    "ALL_QUEUES_MAIL_INBOUND": "Todas as filas de correio",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Filas de correio seleccionado",
-    "ALL_QUEUES_SMS_INBOUND": "Todas as filas de SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "Filas de SMS selecionado",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas as filas de canal aberto",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Filas de abrir o canal seleccionado",
-    "ALL_QUEUES_FAX_INBOUND": "Todas as filas de Fax",
-    "SELECTED_QUEUES_FAX_INBOUND": "Filas de fax selecionado",
+    "ALL_QUEUE_CAMPAIGNS": "Todas as campanhas de fila",
+    "SELECTED_QUEUE_CAMPAIGNS": "Campanhas de filas selecionado",
+    "ALL_VOICE_QUEUES": "Todas as filas de voz",
+    "SELECTED_VOICE_QUEUES": "Filas de voz selecionado",
+    "ALL_CHAT_QUEUES": "Todas as filas de bate-papo",
+    "SELECTED_CHAT_QUEUES": "Filas de chat selecionado",
+    "ALL_MAIL_QUEUES": "Todas as filas de correio",
+    "SELECTED_MAIL_QUEUES": "Filas de correio seleccionado",
+    "ALL_SMS_QUEUES": "Todas as filas de SMS",
+    "SELECTED_SMS_QUEUES": "Filas de SMS selecionado",
+    "ALL_OPENCHANNEL_QUEUES": "Todas as filas de canal aberto",
+    "SELECTED_OPENCHANNEL_QUEUES": "Filas de abrir o canal seleccionado",
+    "ALL_FAX_QUEUES": "Todas as filas de Fax",
+    "SELECTED_FAX_QUEUES": "Filas de fax selecionado",
     "VOICEMAIL": "Correio de voz",
     "SHOWWEBCONTROL": "Mostrar Controlo Web",
     "PAGE": "Página",
@@ -339,12 +339,12 @@
     "BLOCKED": "Bloqueado",
     "DISABLED": "Desativado",
     "REGENERATE": "Regenerado",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas as filas de WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Todas as filas de WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Todas as contas WhatsApp",
     "ALL_WHATSAPPQUEUES": "Todas as filas Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Adicionar agente às filas do WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Adicionar agente às filas do WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Adicionar usuário às filas do WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Filas de WhatsApp selecionadas",
+    "SELECTED_WHATSAPP_QUEUES": "Filas de WhatsApp selecionadas",
     "SELECTED_WHATSAPPACCOUNTS": "Contas WhatsApp selecionadas",
     "SELECTED_WHATSAPPQUEUES": "Filas de WhatsApp selecionadas",
     "USERADD_WHATSAPPACCOUNTS": "Adicionar conta WhatsApp ao usuário",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Sessões Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Interações Omnichannel",
     "SCREEN_RECORDINGS": "Gravações de tela",
-    "VOICE_RECORDINGS": "Gravações de Voz"
+    "VOICE_RECORDINGS": "Gravações de Voz",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorar o status de interrupção do agente para chamadas de visualização",
+    "SELECT_RECALLME_CAMPAIGN": "Selecione a campanha Recall Me",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Adicionar agente para fila de campanhas",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Adicionar agente para filas de voz",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Adicionar agente para filas de bate-papo",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Adicionar agente para filas de correio",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Adicionar agente para filas de SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Adicionar agente para filas de canal aberto",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Adicionar agente para filas de Fax",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Todas as campanhas de fila",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Campanhas de filas selecionado",
+    "ALL_QUEUES_VOICE_INBOUND": "Todas as filas de voz",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Filas de voz selecionado",
+    "ALL_QUEUES_CHAT_INBOUND": "Todas as filas de bate-papo",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Filas de chat selecionado",
+    "ALL_QUEUES_MAIL_INBOUND": "Todas as filas de correio",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Filas de correio seleccionado",
+    "ALL_QUEUES_SMS_INBOUND": "Todas as filas de SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Filas de SMS selecionado",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Todas as filas de canal aberto",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Filas de abrir o canal seleccionado",
+    "ALL_QUEUES_FAX_INBOUND": "Todas as filas de Fax",
+    "SELECTED_QUEUES_FAX_INBOUND": "Filas de fax selecionado",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Todas as filas de WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Adicionar agente às filas do WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Filas de WhatsApp selecionadas"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/ru.json b/public/app/main/apps/staff/i18n/ru.json
index 283239e..76c5af1 100644
--- a/public/app/main/apps/staff/i18n/ru.json
+++ b/public/app/main/apps/staff/i18n/ru.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Установить значение по умолчанию для транспорта. Порядок определяет основной транспортом по умолчанию.",
       "HOST": "Как найти клиента - IP или имя хоста. Если Вы хотите телефон для самого Регистра, используйте ключевое слово Dynamic вместо IP-адрес хоста.",
       "NAT": "Изменяет поведение звездочка для клиентов за брандмауэром.Если любое из разделенных запятыми параметров 'Нет', звездочка будет игнорировать любые другие параметры и настройки NAT=no.",
-      "SIPEXPIRES": "По умолчанию: 120",
+      "SIPEXPIRES": "По умолчанию: 160",
       "SIPPORT": "По умолчанию: 5160",
       "TYPE": "Определяет роль SIP в Asterisk. Пользователь: используется для проверки подлинности входящих - Одноранговые сети: для исходящих вызовов - друга: охватывает как характеристики выше.",
       "CHATCAPACITY": "Ноль означает неограниченное количество.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Все модули",
     "CALLGROUP": "Вызов группы",
     "PICKUPGROUP": "Группы перехвата вызова",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Добавить оператора в очереди кампаний",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Добавить оператора в очереди голосовой связи",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Добавить оператора в чат очередей",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Добавить оператора в очереди сообщений электронной почты",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Добавить оператора в очереди сообщений SMS",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Добавить оператора в открытый канал очередей",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Добавить оператора в очереди факса",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Добавить оператора в очереди кампаний",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Добавить оператора в очереди голосовой связи",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Добавить оператора в чат очередей",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Добавить оператора в очереди сообщений электронной почты",
+    "ADD_AGENT_TO_SMS_QUEUES": "Добавить оператора в очереди сообщений SMS",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Добавить оператора в открытый канал очередей",
+    "ADD_AGENT_TO_FAX_QUEUES": "Добавить оператора в очереди факса",
     "QUEUEADD_USER_VOICE_INBOUND": "Добавить пользователя в очереди голосовой связи",
     "QUEUEADD_USER_CHAT_INBOUND": "Добавить пользователя в чат очередей",
     "QUEUEADD_USER_MAIL_INBOUND": "Добавить пользователя в очереди сообщений электронной почты",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Все группы",
     "SELECTED_TEAMS": "Выбранные группы",
     "SELECTED_AGENTS": "Выбранные операторы",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Все очереди кампаний",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Выбранные очереди кампаний",
-    "ALL_QUEUES_VOICE_INBOUND": "Все голосовые очередей",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Выбранный голос очередей",
-    "ALL_QUEUES_CHAT_INBOUND": "Все очереди чата",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Выбранный чат очередей",
-    "ALL_QUEUES_MAIL_INBOUND": "Все очереди сообщений электронной почты",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Выбранные очереди сообщений электронной почты",
-    "ALL_QUEUES_SMS_INBOUND": "Все очереди сообщений SMS",
-    "SELECTED_QUEUES_SMS_INBOUND": "Выбранные очереди сообщений SMS",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Все открытые канал очередей",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Выбранные открытый канал очередей",
-    "ALL_QUEUES_FAX_INBOUND": "Все очереди факса",
-    "SELECTED_QUEUES_FAX_INBOUND": "Выбранный факс очередей",
+    "ALL_QUEUE_CAMPAIGNS": "Все очереди кампаний",
+    "SELECTED_QUEUE_CAMPAIGNS": "Выбранные очереди кампаний",
+    "ALL_VOICE_QUEUES": "Все голосовые очередей",
+    "SELECTED_VOICE_QUEUES": "Выбранный голос очередей",
+    "ALL_CHAT_QUEUES": "Все очереди чата",
+    "SELECTED_CHAT_QUEUES": "Выбранный чат очередей",
+    "ALL_MAIL_QUEUES": "Все очереди сообщений электронной почты",
+    "SELECTED_MAIL_QUEUES": "Выбранные очереди сообщений электронной почты",
+    "ALL_SMS_QUEUES": "Все очереди сообщений SMS",
+    "SELECTED_SMS_QUEUES": "Выбранные очереди сообщений SMS",
+    "ALL_OPENCHANNEL_QUEUES": "Все открытые канал очередей",
+    "SELECTED_OPENCHANNEL_QUEUES": "Выбранные открытый канал очередей",
+    "ALL_FAX_QUEUES": "Все очереди факса",
+    "SELECTED_FAX_QUEUES": "Выбранный факс очередей",
     "VOICEMAIL": "Голосовая почта",
     "SHOWWEBCONTROL": "Показать Web Control",
     "PAGE": "Страница",
@@ -349,12 +349,12 @@
       "PERMISSIONS_SAVED_SUCCESS_TITLE": "{{sectionName}} раздел сохранен",
       "PERMISSIONS_SAVED_SUCCESS_MESSAGE": "Разрешения успешно обновлены!"
     },
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Все очереди WhatsApp",
+    "ALL_WHATSAPP_QUEUES": "Все очереди WhatsApp",
     "ALL_WHATSAPPACCOUNTS": "Все аккаунты WhatsApp",
     "ALL_WHATSAPPQUEUES": "Все очереди Whataspp",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Добавить агента в очереди WhatsApp",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Добавить агента в очереди WhatsApp",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Добавить пользователя в очереди WhatsApp",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Выбранные очереди WhatsApp",
+    "SELECTED_WHATSAPP_QUEUES": "Выбранные очереди WhatsApp",
     "SELECTED_WHATSAPPACCOUNTS": "Выбранные учетные записи WhatsApp",
     "SELECTED_WHATSAPPQUEUES": "Выбранные очереди WhatsApp",
     "USERADD_WHATSAPPACCOUNTS": "Добавить учетную запись WhatsApp к пользователю",
@@ -371,6 +371,32 @@
     "JSCRIPTY_SESSIONS": "Сессии Jscripty",
     "OMNICHANNEL_INTERACTIONS": "Омниканальные взаимодействия",
     "SCREEN_RECORDINGS": "Записи с экрана",
-    "VOICE_RECORDINGS": "Голосовые записи"
+    "VOICE_RECORDINGS": "Голосовые записи",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Игнорировать статус перерыва агента для предварительных звонков",
+    "SELECT_RECALLME_CAMPAIGN": "Выберите кампанию \"Напомни мне\"",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Добавить оператора в очереди кампаний",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Добавить оператора в очереди голосовой связи",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Добавить оператора в чат очередей",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Добавить оператора в очереди сообщений электронной почты",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Добавить оператора в очереди сообщений SMS",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Добавить оператора в открытый канал очередей",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Добавить оператора в очереди факса",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Все очереди кампаний",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Выбранные очереди кампаний",
+    "ALL_QUEUES_VOICE_INBOUND": "Все голосовые очередей",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Выбранный голос очередей",
+    "ALL_QUEUES_CHAT_INBOUND": "Все очереди чата",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Выбранный чат очередей",
+    "ALL_QUEUES_MAIL_INBOUND": "Все очереди сообщений электронной почты",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Выбранные очереди сообщений электронной почты",
+    "ALL_QUEUES_SMS_INBOUND": "Все очереди сообщений SMS",
+    "SELECTED_QUEUES_SMS_INBOUND": "Выбранные очереди сообщений SMS",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Все открытые канал очередей",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Выбранные открытый канал очередей",
+    "ALL_QUEUES_FAX_INBOUND": "Все очереди факса",
+    "SELECTED_QUEUES_FAX_INBOUND": "Выбранный факс очередей",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Все очереди WhatsApp",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Добавить агента в очереди WhatsApp",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Выбранные очереди WhatsApp"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/sv.json b/public/app/main/apps/staff/i18n/sv.json
index 42ed1e8..c5295e1 100644
--- a/public/app/main/apps/staff/i18n/sv.json
+++ b/public/app/main/apps/staff/i18n/sv.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Ställ in standard transporter. Avgör det primära förvalda transporter.",
       "HOST": "Hur klienten - IP eller värdnamn. Om du vill att telefonen ska registrera sig, använda nyckelordet dynamisk istället för Host IP.",
       "NAT": "Förändringar i beteendet hos Asterisk för beställare bakom en firewall.Om någon av komma-avskilde alternativ är \"nej\", Asterisk kommer att ignorera alla andra inställningar och ställa in nat=no.",
-      "SIPEXPIRES": "Standard: 120",
+      "SIPEXPIRES": "Standard: 160",
       "SIPPORT": "Standard: 5160",
       "TYPE": "Bestämmer SIP roll inom asterisk. Användare: används för att autentisera inkommande - Kisa: för utgående samtal - vän: omfattar både egenskaper hos ovan.",
       "CHATCAPACITY": "Noll betyder obegränsade.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Alla moduler är tillgängliga",
     "CALLGROUP": "Gruppsamtal",
     "PICKUPGROUP": "Gruppsamtal",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Lägg till agent till kökampanjer",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Lägg till agent till röstköer",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Lägg till agent till chattköer",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Lägg till agent till epostköer",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Lägg till agent till SMS-köer",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Lägg till agent till öppna kanal-köer",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Lägg till agent till faxköer",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Lägg till agent till kökampanjer",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Lägg till agent till röstköer",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Lägg till agent till chattköer",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Lägg till agent till epostköer",
+    "ADD_AGENT_TO_SMS_QUEUES": "Lägg till agent till SMS-köer",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Lägg till agent till öppna kanal-köer",
+    "ADD_AGENT_TO_FAX_QUEUES": "Lägg till agent till faxköer",
     "QUEUEADD_USER_VOICE_INBOUND": "Lägg till användare till röstköer",
     "QUEUEADD_USER_CHAT_INBOUND": "Lägg till användare i chattköer",
     "QUEUEADD_USER_MAIL_INBOUND": "Lägg till användare till epostköer",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Alla grupper",
     "SELECTED_TEAMS": "Valda grupper",
     "SELECTED_AGENTS": "Valda agenter",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Alla kökampanjer",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valda kökampanjer",
-    "ALL_QUEUES_VOICE_INBOUND": "Alla röstköer",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Valda röstköer",
-    "ALL_QUEUES_CHAT_INBOUND": "All chattköer",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Valda chattköer",
-    "ALL_QUEUES_MAIL_INBOUND": "Alla epostköer",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Valda epostköer",
-    "ALL_QUEUES_SMS_INBOUND": "Alla SMS-köer",
-    "SELECTED_QUEUES_SMS_INBOUND": "Valda SMS-köer",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alla öppna kanal-köer",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valda öppna kanal-köer",
-    "ALL_QUEUES_FAX_INBOUND": "Alla faxköer",
-    "SELECTED_QUEUES_FAX_INBOUND": "Valda faxköer",
+    "ALL_QUEUE_CAMPAIGNS": "Alla kökampanjer",
+    "SELECTED_QUEUE_CAMPAIGNS": "Valda kökampanjer",
+    "ALL_VOICE_QUEUES": "Alla röstköer",
+    "SELECTED_VOICE_QUEUES": "Valda röstköer",
+    "ALL_CHAT_QUEUES": "All chattköer",
+    "SELECTED_CHAT_QUEUES": "Valda chattköer",
+    "ALL_MAIL_QUEUES": "Alla epostköer",
+    "SELECTED_MAIL_QUEUES": "Valda epostköer",
+    "ALL_SMS_QUEUES": "Alla SMS-köer",
+    "SELECTED_SMS_QUEUES": "Valda SMS-köer",
+    "ALL_OPENCHANNEL_QUEUES": "Alla öppna kanal-köer",
+    "SELECTED_OPENCHANNEL_QUEUES": "Valda öppna kanal-köer",
+    "ALL_FAX_QUEUES": "Alla faxköer",
+    "SELECTED_FAX_QUEUES": "Valda faxköer",
     "VOICEMAIL": "Röstmeddelande",
     "SHOWWEBCONTROL": "Typologi",
     "PAGE": "Sid",
@@ -339,12 +339,12 @@
     "BLOCKED": "låst",
     "DISABLED": "Inaktiverad",
     "REGENERATE": "Regenerera",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "Alla WhatsApp-köer",
+    "ALL_WHATSAPP_QUEUES": "Alla WhatsApp-köer",
     "ALL_WHATSAPPACCOUNTS": "Alla WhatsApp-konton",
     "ALL_WHATSAPPQUEUES": "Alla Whataspp-köer",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lägg till agent i WhatsApp-köer",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "Lägg till agent i WhatsApp-köer",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "Lägg till användare i WhatsApp-köer",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valda WhatsApp-köer",
+    "SELECTED_WHATSAPP_QUEUES": "Valda WhatsApp-köer",
     "SELECTED_WHATSAPPACCOUNTS": "Valda WhatsApp-konton",
     "SELECTED_WHATSAPPQUEUES": "Valda WhatsApp-köer",
     "USERADD_WHATSAPPACCOUNTS": "Lägg till WhatsApp-konto till användaren",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty-sessioner",
     "OMNICHANNEL_INTERACTIONS": "Omnichannel-interaktioner",
     "SCREEN_RECORDINGS": "Skärminspelningar",
-    "VOICE_RECORDINGS": "Röstinspelningar"
+    "VOICE_RECORDINGS": "Röstinspelningar",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Ignorera agentavbrottsstatus för förhandsgranskningssamtal",
+    "SELECT_RECALLME_CAMPAIGN": "Välj Recall Me Campaign",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Lägg till agent till kökampanjer",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Lägg till agent till röstköer",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Lägg till agent till chattköer",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Lägg till agent till epostköer",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Lägg till agent till SMS-köer",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Lägg till agent till öppna kanal-köer",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Lägg till agent till faxköer",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Alla kökampanjer",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Valda kökampanjer",
+    "ALL_QUEUES_VOICE_INBOUND": "Alla röstköer",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Valda röstköer",
+    "ALL_QUEUES_CHAT_INBOUND": "All chattköer",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Valda chattköer",
+    "ALL_QUEUES_MAIL_INBOUND": "Alla epostköer",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Valda epostköer",
+    "ALL_QUEUES_SMS_INBOUND": "Alla SMS-köer",
+    "SELECTED_QUEUES_SMS_INBOUND": "Valda SMS-köer",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Alla öppna kanal-köer",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Valda öppna kanal-köer",
+    "ALL_QUEUES_FAX_INBOUND": "Alla faxköer",
+    "SELECTED_QUEUES_FAX_INBOUND": "Valda faxköer",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "Alla WhatsApp-köer",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "Lägg till agent i WhatsApp-köer",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Valda WhatsApp-köer"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/tr.json b/public/app/main/apps/staff/i18n/tr.json
index 0b27de9..85cdf7a 100644
--- a/public/app/main/apps/staff/i18n/tr.json
+++ b/public/app/main/apps/staff/i18n/tr.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "Varsayılan geciktirir. Sipariş belirler, birincil varsayılan taşıma.",
       "HOST": "Nasıl istemci - IP veya ana bilgisayar adı. Istiyorsanız, telefon kendini, dinamik anahtar yerine, Ana IP.",
       "NAT": "Değişiklikler, davranış, Yıldız istemciler için bir güvenlik duvarının arkasında.Herhangi bir virgülle ayrılmış seçenekleri 'hayır', Yıldız yok diğer ayarları ve nat=no.",
-      "SIPEXPIRES": "Varsayılan: 120",
+      "SIPEXPIRES": "Varsayılan: 160",
       "SIPPORT": "Varsayılan: 5160",
       "TYPE": "Belirler, SIP içinde yıldız. Kullanıcı: kimliğini doğrulamak için kullanılan gelen - Eşler: aramaları - Arkadaş: kapakları hem özellikleri.",
       "CHATCAPACITY": "Sıfır anlamına gelir sınırsız.",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "Tüm modülü bulunmaktadır.",
     "CALLGROUP": "Çağrı Grup",
     "PICKUPGROUP": "Toplayıcı Grup",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Ajans Kuyruk Kampanyaları",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Ajans Sesli Kuyrukları",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Ajans Sohbet Kuyrukları",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Ajans Posta Kuyrukları",
-    "QUEUEADD_AGENT_SMS_INBOUND": "Add Ajans SMS Kuyrukları",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent Açık Kanal Kuyrukları",
-    "QUEUEADD_AGENT_FAX_INBOUND": "Add Ajans Faks Kuyrukları",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "Add Ajans Kuyruk Kampanyaları",
+    "ADD_AGENT_TO_VOICE_QUEUES": "Add Ajans Sesli Kuyrukları",
+    "ADD_AGENT_TO_CHAT_QUEUES": "Add Ajans Sohbet Kuyrukları",
+    "ADD_AGENT_TO_MAIL_QUEUES": "Add Ajans Posta Kuyrukları",
+    "ADD_AGENT_TO_SMS_QUEUES": "Add Ajans SMS Kuyrukları",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "Add Agent Açık Kanal Kuyrukları",
+    "ADD_AGENT_TO_FAX_QUEUES": "Add Ajans Faks Kuyrukları",
     "QUEUEADD_USER_VOICE_INBOUND": "Kullanıcı Ekle Sesli Kuyrukları",
     "QUEUEADD_USER_CHAT_INBOUND": "Kullanıcı Ekle Sohbet Kuyrukları",
     "QUEUEADD_USER_MAIL_INBOUND": "Kullanıcı Ekle Posta Kuyrukları",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "Tüm takımlar",
     "SELECTED_TEAMS": "Seçilen Ekipleri",
     "SELECTED_AGENTS": "Seçilen maddeler",
-    "ALL_QUEUES_VOICE_OUTBOUND": "Sırada tüm Kampanyalar",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "Seçilen Kuyruk Kampanyaları",
-    "ALL_QUEUES_VOICE_INBOUND": "Tüm Ses Kuyrukları",
-    "SELECTED_QUEUES_VOICE_INBOUND": "Seçilen Ses Kuyrukları",
-    "ALL_QUEUES_CHAT_INBOUND": "Tüm Sohbet Kuyrukları",
-    "SELECTED_QUEUES_CHAT_INBOUND": "Seçilen Sohbet Kuyrukları",
-    "ALL_QUEUES_MAIL_INBOUND": "Tüm Posta Kuyrukları",
-    "SELECTED_QUEUES_MAIL_INBOUND": "Seçilen Posta Kuyrukları",
-    "ALL_QUEUES_SMS_INBOUND": "Tüm SMS Kuyrukları",
-    "SELECTED_QUEUES_SMS_INBOUND": "Seçilen SMS Kuyrukları",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Tüm Açık Kanal Kuyrukları",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Seçilen Açık Kanal Kuyrukları",
-    "ALL_QUEUES_FAX_INBOUND": "Tüm Faks Kuyrukları",
-    "SELECTED_QUEUES_FAX_INBOUND": "Seçilen Faks Kuyrukları",
+    "ALL_QUEUE_CAMPAIGNS": "Sırada tüm Kampanyalar",
+    "SELECTED_QUEUE_CAMPAIGNS": "Seçilen Kuyruk Kampanyaları",
+    "ALL_VOICE_QUEUES": "Tüm Ses Kuyrukları",
+    "SELECTED_VOICE_QUEUES": "Seçilen Ses Kuyrukları",
+    "ALL_CHAT_QUEUES": "Tüm Sohbet Kuyrukları",
+    "SELECTED_CHAT_QUEUES": "Seçilen Sohbet Kuyrukları",
+    "ALL_MAIL_QUEUES": "Tüm Posta Kuyrukları",
+    "SELECTED_MAIL_QUEUES": "Seçilen Posta Kuyrukları",
+    "ALL_SMS_QUEUES": "Tüm SMS Kuyrukları",
+    "SELECTED_SMS_QUEUES": "Seçilen SMS Kuyrukları",
+    "ALL_OPENCHANNEL_QUEUES": "Tüm Açık Kanal Kuyrukları",
+    "SELECTED_OPENCHANNEL_QUEUES": "Seçilen Açık Kanal Kuyrukları",
+    "ALL_FAX_QUEUES": "Tüm Faks Kuyrukları",
+    "SELECTED_FAX_QUEUES": "Seçilen Faks Kuyrukları",
     "VOICEMAIL": "Sesli Posta",
     "SHOWWEBCONTROL": "Show Web Kontrolü",
     "PAGE": "Sayfa",
@@ -342,9 +342,9 @@
     "ALL_QUEUES_WHATSAPP_INBOUND": "Tüm WhatsApp Sıraları",
     "ALL_WHATSAPPACCOUNTS": "Tüm WhatsApp Hesapları",
     "ALL_WHATSAPPQUEUES": "Tüm Whataspp Kuyrukları",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsApp Sıralarına Ajan Ekle",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "WhatsApp Sıralarına Ajan Ekle",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "WhatsApp Sıralarına Kullanıcı Ekle",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Seçili WhatsApp Sıraları",
+    "SELECTED_WHATSAPP_QUEUES": "Seçili WhatsApp Sıraları",
     "SELECTED_WHATSAPPACCOUNTS": "Seçili WhatsApp Hesapları",
     "SELECTED_WHATSAPPQUEUES": "Seçili WhatsApp Sıraları",
     "USERADD_WHATSAPPACCOUNTS": "Kullanıcıya WhatsApp Hesabı Ekleyin",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscript Oturumları",
     "OMNICHANNEL_INTERACTIONS": "Çok Kanallı Etkileşimler",
     "SCREEN_RECORDINGS": "Ekran Kayıtları",
-    "VOICE_RECORDINGS": "Ses Kayıtları"
+    "VOICE_RECORDINGS": "Ses Kayıtları",
+    "ALL_WHATSAPP_QUEUES": "Tüm WhatsApp Kuyrukları",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "Önizleme çağrıları için aracı kesinti durumunu yoksay",
+    "SELECT_RECALLME_CAMPAIGN": "Beni Hatırla Kampanyasını Seçin",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "Add Ajans Kuyruk Kampanyaları",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "Add Ajans Sesli Kuyrukları",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "Add Ajans Sohbet Kuyrukları",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "Add Ajans Posta Kuyrukları",
+    "QUEUEADD_AGENT_SMS_INBOUND": "Add Ajans SMS Kuyrukları",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "Add Agent Açık Kanal Kuyrukları",
+    "QUEUEADD_AGENT_FAX_INBOUND": "Add Ajans Faks Kuyrukları",
+    "ALL_QUEUES_VOICE_OUTBOUND": "Sırada tüm Kampanyalar",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "Seçilen Kuyruk Kampanyaları",
+    "ALL_QUEUES_VOICE_INBOUND": "Tüm Ses Kuyrukları",
+    "SELECTED_QUEUES_VOICE_INBOUND": "Seçilen Ses Kuyrukları",
+    "ALL_QUEUES_CHAT_INBOUND": "Tüm Sohbet Kuyrukları",
+    "SELECTED_QUEUES_CHAT_INBOUND": "Seçilen Sohbet Kuyrukları",
+    "ALL_QUEUES_MAIL_INBOUND": "Tüm Posta Kuyrukları",
+    "SELECTED_QUEUES_MAIL_INBOUND": "Seçilen Posta Kuyrukları",
+    "ALL_QUEUES_SMS_INBOUND": "Tüm SMS Kuyrukları",
+    "SELECTED_QUEUES_SMS_INBOUND": "Seçilen SMS Kuyrukları",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "Tüm Açık Kanal Kuyrukları",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "Seçilen Açık Kanal Kuyrukları",
+    "ALL_QUEUES_FAX_INBOUND": "Tüm Faks Kuyrukları",
+    "SELECTED_QUEUES_FAX_INBOUND": "Seçilen Faks Kuyrukları",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "WhatsApp Sıralarına Ajan Ekle",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "Seçili WhatsApp Sıraları"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/zh-CN.json b/public/app/main/apps/staff/i18n/zh-CN.json
index dc853d6..c55c12d 100644
--- a/public/app/main/apps/staff/i18n/zh-CN.json
+++ b/public/app/main/apps/staff/i18n/zh-CN.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "设置缺省的传输。 该顺序确定主要的默认的传输。",
       "HOST": "如何找到客户端-服务器的 IP 或主机名。 如果您想要的手机本身注册、使用关键字动态而不是主机的 IP。",
       "NAT": "改变行为的星号后面的客户端的防火墙。 如果任何的以逗号分隔的-选项是 “不”、星号将会忽略任何其他设置和设置 nat =否。",
-      "SIPEXPIRES": "默认值: 120",
+      "SIPEXPIRES": "默认值: 160",
       "SIPPORT": "缺省值: 5160",
       "TYPE": "确定了 SIP 的作用范围内的星号。 用户名: 用于验证传入-同行: 呼出电话-朋友: 涵盖了这两个特点。",
       "CHATCAPACITY": "0 意味着无限的。",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "所有模块都可用",
     "CALLGROUP": "通话组",
     "PICKUPGROUP": "代答组",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "代理添加到队列活动",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "代理添加到语音队列",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "代理添加到文本交谈的队列",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "代理添加到邮件队列。",
-    "QUEUEADD_AGENT_SMS_INBOUND": "代理添加到 SMS 队列。",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "代理添加到打开的通道的队列。",
-    "QUEUEADD_AGENT_FAX_INBOUND": "代理添加到传真队列。",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "代理添加到队列活动",
+    "ADD_AGENT_TO_VOICE_QUEUES": "代理添加到语音队列",
+    "ADD_AGENT_TO_CHAT_QUEUES": "代理添加到文本交谈的队列",
+    "ADD_AGENT_TO_MAIL_QUEUES": "代理添加到邮件队列。",
+    "ADD_AGENT_TO_SMS_QUEUES": "代理添加到 SMS 队列。",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "代理添加到打开的通道的队列。",
+    "ADD_AGENT_TO_FAX_QUEUES": "代理添加到传真队列。",
     "QUEUEADD_USER_VOICE_INBOUND": "将用户添加到语音队列",
     "QUEUEADD_USER_CHAT_INBOUND": "将用户添加到文本交谈的队列",
     "QUEUEADD_USER_MAIL_INBOUND": "将用户添加到邮件队列。",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "所有的团队",
     "SELECTED_TEAMS": "选定的组",
     "SELECTED_AGENTS": "选定的座席",
-    "ALL_QUEUES_VOICE_OUTBOUND": "所有队列活动",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "选定的队列活动",
-    "ALL_QUEUES_VOICE_INBOUND": "所有的语音队列",
-    "SELECTED_QUEUES_VOICE_INBOUND": "选定的语音队列",
-    "ALL_QUEUES_CHAT_INBOUND": "所有的聊天队列",
-    "SELECTED_QUEUES_CHAT_INBOUND": "选中 “文本交谈” 队列。",
-    "ALL_QUEUES_MAIL_INBOUND": "所有的邮件队列。",
-    "SELECTED_QUEUES_MAIL_INBOUND": "选中的邮件队列。",
-    "ALL_QUEUES_SMS_INBOUND": "所有的 SMS 队列。",
-    "SELECTED_QUEUES_SMS_INBOUND": "选中的短信队列。",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "所有打开的通道的队列。",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "选中的已经打开的通道的队列。",
-    "ALL_QUEUES_FAX_INBOUND": "所有的传真队列。",
-    "SELECTED_QUEUES_FAX_INBOUND": "选定的传真队列。",
+    "ALL_QUEUE_CAMPAIGNS": "所有队列活动",
+    "SELECTED_QUEUE_CAMPAIGNS": "选定的队列活动",
+    "ALL_VOICE_QUEUES": "所有的语音队列",
+    "SELECTED_VOICE_QUEUES": "选定的语音队列",
+    "ALL_CHAT_QUEUES": "所有的聊天队列",
+    "SELECTED_CHAT_QUEUES": "选中 “文本交谈” 队列。",
+    "ALL_MAIL_QUEUES": "所有的邮件队列。",
+    "SELECTED_MAIL_QUEUES": "选中的邮件队列。",
+    "ALL_SMS_QUEUES": "所有的 SMS 队列。",
+    "SELECTED_SMS_QUEUES": "选中的短信队列。",
+    "ALL_OPENCHANNEL_QUEUES": "所有打开的通道的队列。",
+    "SELECTED_OPENCHANNEL_QUEUES": "选中的已经打开的通道的队列。",
+    "ALL_FAX_QUEUES": "所有的传真队列。",
+    "SELECTED_FAX_QUEUES": "选定的传真队列。",
     "VOICEMAIL": "语音邮件",
     "SHOWWEBCONTROL": "显示 Web 控件",
     "PAGE": "页面",
@@ -339,12 +339,12 @@
     "BLOCKED": "已锁定",
     "DISABLED": "已停用",
     "REGENERATE": "再生",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "所有WhatsApp队列",
+    "ALL_WHATSAPP_QUEUES": "所有WhatsApp队列",
     "ALL_WHATSAPPACCOUNTS": "所有WhatsApp帐户",
     "ALL_WHATSAPPQUEUES": "所有Whataspp队列",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "将代理添加到WhatsApp队列",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "将代理添加到WhatsApp队列",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "将用户添加到WhatsApp队列",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "选定的WhatsApp队列",
+    "SELECTED_WHATSAPP_QUEUES": "选定的WhatsApp队列",
     "SELECTED_WHATSAPPACCOUNTS": "选定的WhatsApp帐户",
     "SELECTED_WHATSAPPQUEUES": "选定的WhatsApp队列",
     "USERADD_WHATSAPPACCOUNTS": "将WhatsApp帐户添加到用户",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty 会话",
     "OMNICHANNEL_INTERACTIONS": "全渠道互动",
     "SCREEN_RECORDINGS": "屏幕录像",
-    "VOICE_RECORDINGS": "录音"
+    "VOICE_RECORDINGS": "录音",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "忽略预览呼叫的座席中断状态",
+    "SELECT_RECALLME_CAMPAIGN": "选择 Recall Me 活动",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "代理添加到队列活动",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "代理添加到语音队列",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "代理添加到文本交谈的队列",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "代理添加到邮件队列。",
+    "QUEUEADD_AGENT_SMS_INBOUND": "代理添加到 SMS 队列。",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "代理添加到打开的通道的队列。",
+    "QUEUEADD_AGENT_FAX_INBOUND": "代理添加到传真队列。",
+    "ALL_QUEUES_VOICE_OUTBOUND": "所有队列活动",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "选定的队列活动",
+    "ALL_QUEUES_VOICE_INBOUND": "所有的语音队列",
+    "SELECTED_QUEUES_VOICE_INBOUND": "选定的语音队列",
+    "ALL_QUEUES_CHAT_INBOUND": "所有的聊天队列",
+    "SELECTED_QUEUES_CHAT_INBOUND": "选中 “文本交谈” 队列。",
+    "ALL_QUEUES_MAIL_INBOUND": "所有的邮件队列。",
+    "SELECTED_QUEUES_MAIL_INBOUND": "选中的邮件队列。",
+    "ALL_QUEUES_SMS_INBOUND": "所有的 SMS 队列。",
+    "SELECTED_QUEUES_SMS_INBOUND": "选中的短信队列。",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "所有打开的通道的队列。",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "选中的已经打开的通道的队列。",
+    "ALL_QUEUES_FAX_INBOUND": "所有的传真队列。",
+    "SELECTED_QUEUES_FAX_INBOUND": "选定的传真队列。",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "所有WhatsApp队列",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "将代理添加到WhatsApp队列",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "选定的WhatsApp队列"
   }
 }
diff --git a/public/app/main/apps/staff/i18n/zh-TW.json b/public/app/main/apps/staff/i18n/zh-TW.json
index 0e215f0..e1732e5 100644
--- a/public/app/main/apps/staff/i18n/zh-TW.json
+++ b/public/app/main/apps/staff/i18n/zh-TW.json
@@ -93,7 +93,7 @@
       "TRANSPORT": "設定預設的傳輸。 醫令會決定主要預設傳輸。",
       "HOST": "如何找到用戶端 - IP 或主機名稱。 如果您想要將電話轉接至自己登錄 , 使用關鍵字動態而非主機的 IP 。",
       "NAT": "改變行為之星號的用戶端防火牆後面。如果有任何逗點分隔選項為「否」 , 星號將會略過所有其他設定值和設定 NAT = No ( 否 ) 。",
-      "SIPEXPIRES": "預設值 : 120",
+      "SIPEXPIRES": "預設值 : 160",
       "SIPPORT": "預設值 : 5160",
       "TYPE": "決定 SIP 角色星號。 使用者 : 用於驗證傳入 - 點對點式 : 撥出電話 - 朋友 : 涵蓋了這兩個特徵的以上。",
       "CHATCAPACITY": "0 表示沒有限制。",
@@ -182,13 +182,13 @@
     "ALL_MODULES_AVAILABLE": "所有的模組可供使用",
     "CALLGROUP": "通話群組",
     "PICKUPGROUP": "代接群組",
-    "QUEUEADD_AGENT_VOICE_OUTBOUND": "值機員新增至佇列活動",
-    "QUEUEADD_AGENT_VOICE_INBOUND": "新增值機員至語音佇列",
-    "QUEUEADD_AGENT_CHAT_INBOUND": "值機員新增至文字交談」佇列",
-    "QUEUEADD_AGENT_MAIL_INBOUND": "值機員新增至郵件佇列",
-    "QUEUEADD_AGENT_SMS_INBOUND": "新增值機員至 SMS 佇列",
-    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "新增值機員以開啟通道佇列",
-    "QUEUEADD_AGENT_FAX_INBOUND": "值機員新增至傳真佇列",
+    "ADD_AGENT_TO_QUEUE_CAMPAIGNS": "值機員新增至佇列活動",
+    "ADD_AGENT_TO_VOICE_QUEUES": "新增值機員至語音佇列",
+    "ADD_AGENT_TO_CHAT_QUEUES": "值機員新增至文字交談」佇列",
+    "ADD_AGENT_TO_MAIL_QUEUES": "值機員新增至郵件佇列",
+    "ADD_AGENT_TO_SMS_QUEUES": "新增值機員至 SMS 佇列",
+    "ADD_AGENT_TO_OPENCHANNEL_QUEUES": "新增值機員以開啟通道佇列",
+    "ADD_AGENT_TO_FAX_QUEUES": "值機員新增至傳真佇列",
     "QUEUEADD_USER_VOICE_INBOUND": "新增使用者至語音佇列",
     "QUEUEADD_USER_CHAT_INBOUND": "將使用者新增到文字交談」佇列",
     "QUEUEADD_USER_MAIL_INBOUND": "新增使用者至郵件佇列",
@@ -198,20 +198,20 @@
     "ALL_TEAMS": "所有群組",
     "SELECTED_TEAMS": "選取群組",
     "SELECTED_AGENTS": "已選取的值機人員",
-    "ALL_QUEUES_VOICE_OUTBOUND": "所有佇列活動",
-    "SELECTED_QUEUES_VOICE_OUTBOUND": "所選取的佇列活動",
-    "ALL_QUEUES_VOICE_INBOUND": "所有語音通話佇列",
-    "SELECTED_QUEUES_VOICE_INBOUND": "選取語音通話佇列",
-    "ALL_QUEUES_CHAT_INBOUND": "所有聊天佇列",
-    "SELECTED_QUEUES_CHAT_INBOUND": "選取的文字交談佇列",
-    "ALL_QUEUES_MAIL_INBOUND": "所有郵件佇列",
-    "SELECTED_QUEUES_MAIL_INBOUND": "選定的郵件佇列",
-    "ALL_QUEUES_SMS_INBOUND": "所有 SMS 佇列",
-    "SELECTED_QUEUES_SMS_INBOUND": "所選簡訊佇列",
-    "ALL_QUEUES_OPENCHANNEL_INBOUND": "所有開啟通道佇列",
-    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "選取開啟通道佇列",
-    "ALL_QUEUES_FAX_INBOUND": "所有傳真佇列",
-    "SELECTED_QUEUES_FAX_INBOUND": "選取的傳真佇列",
+    "ALL_QUEUE_CAMPAIGNS": "所有佇列活動",
+    "SELECTED_QUEUE_CAMPAIGNS": "所選取的佇列活動",
+    "ALL_VOICE_QUEUES": "所有語音通話佇列",
+    "SELECTED_VOICE_QUEUES": "選取語音通話佇列",
+    "ALL_CHAT_QUEUES": "所有聊天佇列",
+    "SELECTED_CHAT_QUEUES": "選取的文字交談佇列",
+    "ALL_MAIL_QUEUES": "所有郵件佇列",
+    "SELECTED_MAIL_QUEUES": "選定的郵件佇列",
+    "ALL_SMS_QUEUES": "所有 SMS 佇列",
+    "SELECTED_SMS_QUEUES": "所選簡訊佇列",
+    "ALL_OPENCHANNEL_QUEUES": "所有開啟通道佇列",
+    "SELECTED_OPENCHANNEL_QUEUES": "選取開啟通道佇列",
+    "ALL_FAX_QUEUES": "所有傳真佇列",
+    "SELECTED_FAX_QUEUES": "選取的傳真佇列",
     "VOICEMAIL": "語音信箱",
     "SHOWWEBCONTROL": "顯示 Web 控制",
     "PAGE": "頁面",
@@ -339,12 +339,12 @@
     "BLOCKED": "已鎖定",
     "DISABLED": "已停用",
     "REGENERATE": "再生",
-    "ALL_QUEUES_WHATSAPP_INBOUND": "所有WhatsApp隊列",
+    "ALL_WHATSAPP_QUEUES": "所有WhatsApp隊列",
     "ALL_WHATSAPPACCOUNTS": "所有WhatsApp帳戶",
     "ALL_WHATSAPPQUEUES": "所有Whataspp隊列",
-    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "將代理添加到WhatsApp隊列",
+    "ADD_AGENT_TO_WHATSAPP_QUEUES": "將代理添加到WhatsApp隊列",
     "QUEUEADD_USER_WHATSAPP_INBOUND": "將用戶添加到WhatsApp隊列",
-    "SELECTED_QUEUES_WHATSAPP_INBOUND": "選定的WhatsApp隊列",
+    "SELECTED_WHATSAPP_QUEUES": "選定的WhatsApp隊列",
     "SELECTED_WHATSAPPACCOUNTS": "選定的WhatsApp帳戶",
     "SELECTED_WHATSAPPQUEUES": "選定的WhatsApp隊列",
     "USERADD_WHATSAPPACCOUNTS": "將WhatsApp帳戶添加到用戶",
@@ -361,6 +361,32 @@
     "JSCRIPTY_SESSIONS": "Jscripty 會話",
     "OMNICHANNEL_INTERACTIONS": "全渠道互動",
     "SCREEN_RECORDINGS": "屏幕錄像",
-    "VOICE_RECORDINGS": "錄音"
+    "VOICE_RECORDINGS": "錄音",
+    "IGNORE_AGENT_BREAK_STATUS_FOR_PREVIEW_CALLS": "忽略預覽呼叫的座席中斷狀態",
+    "SELECT_RECALLME_CAMPAIGN": "選擇 Recall Me 活動",
+    "QUEUEADD_AGENT_VOICE_OUTBOUND": "值機員新增至佇列活動",
+    "QUEUEADD_AGENT_VOICE_INBOUND": "新增值機員至語音佇列",
+    "QUEUEADD_AGENT_CHAT_INBOUND": "值機員新增至文字交談」佇列",
+    "QUEUEADD_AGENT_MAIL_INBOUND": "值機員新增至郵件佇列",
+    "QUEUEADD_AGENT_SMS_INBOUND": "新增值機員至 SMS 佇列",
+    "QUEUEADD_AGENT_OPENCHANNEL_INBOUND": "新增值機員以開啟通道佇列",
+    "QUEUEADD_AGENT_FAX_INBOUND": "值機員新增至傳真佇列",
+    "ALL_QUEUES_VOICE_OUTBOUND": "所有佇列活動",
+    "SELECTED_QUEUES_VOICE_OUTBOUND": "所選取的佇列活動",
+    "ALL_QUEUES_VOICE_INBOUND": "所有語音通話佇列",
+    "SELECTED_QUEUES_VOICE_INBOUND": "選取語音通話佇列",
+    "ALL_QUEUES_CHAT_INBOUND": "所有聊天佇列",
+    "SELECTED_QUEUES_CHAT_INBOUND": "選取的文字交談佇列",
+    "ALL_QUEUES_MAIL_INBOUND": "所有郵件佇列",
+    "SELECTED_QUEUES_MAIL_INBOUND": "選定的郵件佇列",
+    "ALL_QUEUES_SMS_INBOUND": "所有 SMS 佇列",
+    "SELECTED_QUEUES_SMS_INBOUND": "所選簡訊佇列",
+    "ALL_QUEUES_OPENCHANNEL_INBOUND": "所有開啟通道佇列",
+    "SELECTED_QUEUES_OPENCHANNEL_INBOUND": "選取開啟通道佇列",
+    "ALL_QUEUES_FAX_INBOUND": "所有傳真佇列",
+    "SELECTED_QUEUES_FAX_INBOUND": "選取的傳真佇列",
+    "ALL_QUEUES_WHATSAPP_INBOUND": "所有WhatsApp隊列",
+    "QUEUEADD_AGENT_WHATSAPP_INBOUND": "將代理添加到WhatsApp隊列",
+    "SELECTED_QUEUES_WHATSAPP_INBOUND": "選定的WhatsApp隊列"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/ar.json b/public/app/main/apps/tools/i18n/ar.json
index e6347f3..cd353c4 100644
--- a/public/app/main/apps/tools/i18n/ar.json
+++ b/public/app/main/apps/tools/i18n/ar.json
@@ -62,7 +62,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أكبر من أو تساوي",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "يجب أن تكون القيمة أقل من أو تساوي",
       "TIMEOUT_REQUIRED": "حقل الزامي",
-      "AUTOCREATE_FIELD_REQUIRED": "حقل الزامي"
+      "AUTOCREATE_FIELD_REQUIRED": "حقل الزامي",
+      "CHANNEL_REQUIRED": "حقل الزامي",
+      "IGNOREDIALERCONTACTID_REQUIRED": "تجاهل معرف جهة اتصال الطالب مطلوب"
     },
     "HELP": {
       "DEFAULTUSER": "المستخدم الافتراضي",
@@ -102,7 +104,9 @@
       "SCRIPT_INFO": "إدراج وصف للبرنامج النصي",
       "SCRIPT_TYPE": "أدخل تصنيفًا للبرنامج النصي (على سبيل المثال ، حليقة ، باش ...)",
       "HEADERS": "ملاحظة: يجب أن يكون قسم الرؤوس بتنسيق RAW JSON {\"key\": \"value\"}\nملاحظة: إذا لم يتم ملئها ، سيتم إرسال القيمة الافتراضية",
-      "TIMEOUT": "طلب مهلة بالثواني. يجب أن تكون القيمة بين 1 و 10 والقيمة الافتراضية هي 5."
+      "TIMEOUT": "طلب مهلة بالثواني. يجب أن تكون القيمة بين 1 و 10 والقيمة الافتراضية هي 5.",
+      "MANAGED": "العدد الإجمالي للتفاعلات المكتملة",
+      "OPENED": "العدد الإجمالي للتفاعلات النشطة"
     },
     "ADD_TRUNK": "أضف قناة",
     "AND_SECOND": "والثانية",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "ترتيب المستوى الثاني",
     "SELECT_LEVEL": "حدد مستوى",
     "TITLEFONTSIZE": "حجم عنوان الخط",
-    "ADD_CONTACTITEMTYPE": "يضيف",
-    "CONTACTITEMTYPE": "أنواع عناصر الاتصال",
-    "NEW_CONTACTITEMTYPE": "نوع عنصر اتصال جديد",
-    "ORDER_BY": "ترتيب حسب",
-    "RGBBACKGROUNDCOLOR": "لون الخلفية RGB"
+    "EMAIL": "بريد إلكتروني",
+    "FILTERCHATWEBSITES": "تصفية مواقع الدردشة",
+    "FILTEREMAILACCOUNTS": "تصفية حسابات البريد الإلكتروني",
+    "FILTERFAXACCOUNTS": "تصفية حسابات الفاكس",
+    "FILTEROPENCHANNELACCOUNTS": "تصفية حسابات OpenChannel",
+    "FILTERSMSACCOUNTS": "تصفية حسابات الرسائل القصيرة",
+    "FILTERWHATSAPPACCOUNTS": "تصفية حسابات Whatsapp",
+    "MANAGED": "مُدار",
+    "MANAGED_TEXT": "التفاعلات المدارة",
+    "OPENED": "افتتح",
+    "OPENED_TEXT": "التفاعلات المفتوحة",
+    "IGNOREDIALERCONTACTID": "تجاهل معرف جهة الاتصال",
+    "MAIL_SUBSTATUS": "حالة البريد الإلكتروني الفرعية"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/cs.json b/public/app/main/apps/tools/i18n/cs.json
index e082884..ca23cef 100644
--- a/public/app/main/apps/tools/i18n/cs.json
+++ b/public/app/main/apps/tools/i18n/cs.json
@@ -113,7 +113,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Hodnota musí být větší nebo rovna",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Hodnota musí být menší nebo rovna",
       "TIMEOUT_REQUIRED": "Povinné pole",
-      "AUTOCREATE_FIELD_REQUIRED": "Povinné pole"
+      "AUTOCREATE_FIELD_REQUIRED": "Povinné pole",
+      "CHANNEL_REQUIRED": "Povinné pole",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Pole Ignorovat ID kontaktu vytáčení je povinné"
     },
     "HOST": "Host",
     "SECRET": "Secret",
@@ -158,7 +160,9 @@
       "SCRIPT": "Vložte skript",
       "SCRIPT_INFO": "Vložte popis skriptu",
       "SCRIPT_TYPE": "Vložte typologii skriptu (např. Curl, bash ...)",
-      "TIMEOUT": "Vyžádejte si časový limit v sekundách. Hodnota musí být mezi 1 a 10 a výchozí hodnota je 5."
+      "TIMEOUT": "Vyžádejte si časový limit v sekundách. Hodnota musí být mezi 1 a 10 a výchozí hodnota je 5.",
+      "MANAGED": "Celkový počet dokončených interakcí",
+      "OPENED": "Celkový počet aktivních interakcí"
     },
     "EDIT_TRUNK": "Edit Trunk",
     "DELETE_TRUNK": "Delete Trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Dispozice druhé úrovně",
     "SELECT_LEVEL": "Vyberte úroveň",
     "TITLEFONTSIZE": "Velikost názvu písma",
-    "ADD_CONTACTITEMTYPE": "Přidat",
-    "CONTACTITEMTYPE": "Kontaktujte typy položek",
-    "NEW_CONTACTITEMTYPE": "Nový typ položky kontaktu",
-    "ORDER_BY": "Seřadit podle",
-    "RGBBACKGROUNDCOLOR": "Barva pozadí RGB"
+    "EMAIL": "E-mailem",
+    "FILTERCHATWEBSITES": "Filtrujte webové stránky chatu",
+    "FILTEREMAILACCOUNTS": "Filtrovat e -mailové účty",
+    "FILTERFAXACCOUNTS": "Filtrovat faxové účty",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrujte účty OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtrovat sms účty",
+    "FILTERWHATSAPPACCOUNTS": "Filtrujte účty Whatsapp",
+    "MANAGED": "Podařilo se",
+    "MANAGED_TEXT": "Spravované interakce",
+    "OPENED": "Otevřeno",
+    "OPENED_TEXT": "Otevřené interakce",
+    "IGNOREDIALERCONTACTID": "Ignorovat ID kontaktu vytáčení",
+    "MAIL_SUBSTATUS": "E-mail Substatus"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/da.json b/public/app/main/apps/tools/i18n/da.json
index 631e339..aa7f127 100644
--- a/public/app/main/apps/tools/i18n/da.json
+++ b/public/app/main/apps/tools/i18n/da.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Værdien skal være større end eller lig med",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Værdien skal være mindre end eller lig med",
       "TIMEOUT_REQUIRED": "Obligatorisk felt",
-      "AUTOCREATE_FIELD_REQUIRED": "Obligatorisk felt"
+      "AUTOCREATE_FIELD_REQUIRED": "Obligatorisk felt",
+      "CHANNEL_REQUIRED": "Obligatorisk felt",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Feltet Ignorer opkaldskontakt-id er påkrævet"
     },
     "HOST": "Host",
     "SECRET": "Hemmelig",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Indsæt en beskrivelse af scriptet",
       "SCRIPT_TYPE": "Indsæt en typologi for scriptet (f.eks. Curl, bash ...)",
       "HEADERS": "Bemærk: Headers-sektionen skal være i RAW JSON-format {\"key\": \"value\"}\nBemærk: Hvis ikke udfyldt, sendes standardværdien",
-      "TIMEOUT": "Anmod om timeout i sekunder. Værdien skal være mellem 1 og 10, og standardværdien er 5."
+      "TIMEOUT": "Anmod om timeout i sekunder. Værdien skal være mellem 1 og 10, og standardværdien er 5.",
+      "MANAGED": "Det samlede antal afsluttede interaktioner",
+      "OPENED": "Det samlede antal aktive interaktioner"
     },
     "EDIT_TRUNK": "Rediger Trunk",
     "DELETE_TRUNK": "Slet Trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Andet niveau disposition",
     "SELECT_LEVEL": "Vælg et niveau",
     "TITLEFONTSIZE": "Skrifttitelstørrelse",
-    "ADD_CONTACTITEMTYPE": "Tilføje",
-    "CONTACTITEMTYPE": "Kontaktelementtyper",
-    "NEW_CONTACTITEMTYPE": "Ny type kontaktperson",
-    "ORDER_BY": "Bestil inden",
-    "RGBBACKGROUNDCOLOR": "RGB Baggrundsfarve"
+    "EMAIL": "E -mail",
+    "FILTERCHATWEBSITES": "Filtrer chatwebsteder",
+    "FILTEREMAILACCOUNTS": "Filtrer e -mail -konti",
+    "FILTERFAXACCOUNTS": "Filtrer faxkonti",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrer OpenChannel -konti",
+    "FILTERSMSACCOUNTS": "Filtrer sms -konti",
+    "FILTERWHATSAPPACCOUNTS": "Filtrer Whatsapp -konti",
+    "MANAGED": "Lykkedes",
+    "MANAGED_TEXT": "Administrerede interaktioner",
+    "OPENED": "Åbnet",
+    "OPENED_TEXT": "Åbnede interaktioner",
+    "IGNOREDIALERCONTACTID": "Ignorer opkaldskontakt-id",
+    "MAIL_SUBSTATUS": "E-mail understatus"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/de.json b/public/app/main/apps/tools/i18n/de.json
index fe24062..c8a1b95 100644
--- a/public/app/main/apps/tools/i18n/de.json
+++ b/public/app/main/apps/tools/i18n/de.json
@@ -3,210 +3,214 @@
     "BOT": "Voicebot",
     "CALL": "Anruf",
     "NAME": "Name",
-    "TRUNKS": "Amtsleitungen",
-    "SEARCH_FOR_ANYONE": "Suche für Jedermann",
+    "TRUNKS": "Trunks",
+    "SEARCH_FOR_ANYONE": "Suche",
     "ERRORS": {
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "HOST_REQUIRED": "Der Host wird benötigt",
-      "DEFAULTUSER_REQUIRED": "Der Standardbenutzer ist erforderlich",
-      "CALLERID_REQUIRED": "Die Anrufer-ID ist erforderlich",
-      "KEY_REQUIRED": "Der Schlüssel ist erforderlich",
-      "CONFIRM_NOT_MATCH": "Die Kennwörter nicht übereinstimmen",
-      "VALIDITYSTART_REQUIRED": "Die Startzeit ist erforderlich",
-      "VALIDITYEND_REQUIRED": "Das Ende der Zeit ist erforderlich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "HOST_REQUIRED": "Host wird benötigt",
+      "DEFAULTUSER_REQUIRED": "Standardbenutzer ist erforderlich",
+      "CALLERID_REQUIRED": "Anrufer-ID ist erforderlich",
+      "KEY_REQUIRED": "Schlüssel ist erforderlich",
+      "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein",
+      "VALIDITYSTART_REQUIRED": "Startzeit ist erforderlich",
+      "VALIDITYEND_REQUIRED": "Endzeit ist erforderlich",
       "MONTHDAY_REQUIRED": "Tag des Monats ist erforderlich",
-      "HOUR_REQUIRED": "Die Stunde ist erforderlich",
-      "CONTENT_REQUIRED": "Der Inhalt ist erforderlich",
-      "URL_REQUIRED": "Die URL ist erforderlich",
-      "URL_MUST_VALID_URL": "Die URL muss gültig sein",
-      "APPLICATION_REQUIRED": "Die Anwendung ist erforderlich",
-      "ARGUMENTS_REQUIRED": "Die Argumente sind erforderlich",
-      "NAME_MUST_VALID_PATTERN": "Der Name muss in einem gültigen Format geschrieben werden",
-      "POLLING_INTERVAL_REQUIRED": "Das Abfrageintervall ist erforderlich",
-      "TITLE_REQUIRED": "Der Titel ist erforderlich",
-      "EMAILADDRESS_REQUIRED": "Die E-Mail Adresse ist erforderlich",
-      "EVENTVARIABLES_REQUIRED": "Pflichtfeld",
-      "TYPE_REQUIRED": "Pflichtfeld",
-      "VALUE_REQUIRED": "Pflichtfeld",
-      "ACCOUNT_REQUIRED": "Pflichtfeld",
-      "FIELD_REQUIRED": "Pflichtfeld",
-      "INTEGRATION_REQUIRED": "Pflichtfeld",
-      "LIST_REQUIRED": "Pflichtfeld",
-      "TEMPLATE_REQUIRED": "Pflichtfeld",
-      "AUTOCREATECONTACT_REQUIRED": "Pflichtfeld",
-      "OUTBOUNDROUTE_REQUIRED": "Pflichtfeld",
-      "QUEUE_REQUIRED": "Pflichtfeld",
-      "TIME_RANGE_TO_REQUIRED": "Pflichtfeld",
-      "WEEK_DAYS_TO_REQUIRED": "Pflichtfeld",
-      "MONTH_DAYS_TO_REQUIRED": "Pflichtfeld",
-      "MONTH_TO_REQUIRED": "Pflichtfeld",
+      "HOUR_REQUIRED": "Stunde ist erforderlich",
+      "CONTENT_REQUIRED": "Inhalt ist erforderlich",
+      "URL_REQUIRED": "URL ist erforderlich",
+      "URL_MUST_VALID_URL": "URL ungültiges Format",
+      "APPLICATION_REQUIRED": "Anwendung ist erforderlich",
+      "ARGUMENTS_REQUIRED": "Bedingungen sind erforderlich",
+      "NAME_MUST_VALID_PATTERN": "Name ungültiges Format",
+      "POLLING_INTERVAL_REQUIRED": "Abfrageintervall ist erforderlich",
+      "TITLE_REQUIRED": "Titel ist erforderlich",
+      "EMAILADDRESS_REQUIRED": "E-Mail Adresse ist erforderlich",
+      "EVENTVARIABLES_REQUIRED": "Variablen sind erforderlich",
+      "TYPE_REQUIRED": "Typ ist erforderlich",
+      "VALUE_REQUIRED": "Wert ist erforderlich",
+      "ACCOUNT_REQUIRED": "Konto ist erforderlich",
+      "FIELD_REQUIRED": "Feld ist erforderlich",
+      "INTEGRATION_REQUIRED": "Integration ist erforderlich",
+      "LIST_REQUIRED": "Liste ist erforderlich",
+      "TEMPLATE_REQUIRED": "Vorlage ist erforderlich",
+      "AUTOCREATECONTACT_REQUIRED": "Kontakterstellung erforderlich",
+      "OUTBOUNDROUTE_REQUIRED": "Ausgehende Route erforderlich",
+      "QUEUE_REQUIRED": "Warteschlange erforderlich",
+      "TIME_RANGE_TO_REQUIRED": "Zeitintervall erforderlich",
+      "WEEK_DAYS_TO_REQUIRED": "Wochentage erforderlich",
+      "MONTH_DAYS_TO_REQUIRED": "Tage des Monats erforderlich",
+      "MONTH_TO_REQUIRED": "Monat erforderlich",
       "TIME_RANGE_FROM_INVALID": "Falsches Format",
       "TIME_RANGE_TO_INVALID": "Falsches Format",
-      "ACTION_REQUIRED": "Pflichtfeld",
-      "CONFIGURATION_REQUIRED": "Pflichtfeld",
-      "PROJECT_REQUIRED": "Pflichtfeld",
-      "LOCATION_REQUIRED": "Pflichtfeld",
-      "FONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "FONTSIZE_REQUIRED": "Pflichtfeld",
-      "PATH_REQUIRED": "Pflichtfeld",
-      "FORMAT_REQUIRED": "Pflichtfeld",
-      "REPORT_REQUIRED": "Pflichtfeld",
-      "REFRESH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "REFRESH_REQUIRED": "Pflichtfeld",
-      "TITLE_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
-      "NAME_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
-      "OUTPUT_REQUIRED": "Pflichtfeld",
-      "REPORTFOLDER_REQUIRED": "Pflichtfeld",
-      "REPORTSUBFOLDER_REQUIRED": "Pflichtfeld",
-      "REPORTTYPE_REQUIRED": "Pflichtfeld",
-      "AGENT_REQUIRED": "Pflichtfeld",
-      "INFO_REQUIRED": "Pflichtfeld",
-      "SCRIPT_REQUIRED": "Pflichtfeld",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein",
-      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
-      "TIMEOUT_REQUIRED": "Pflichtfeld",
-      "AUTOCREATE_FIELD_REQUIRED": "Pflichtfeld"
+      "CHANNEL_REQUIRED": "Pflichtfeld",
+      "ACTION_REQUIRED": "Aktion erforderlich",
+      "CONFIGURATION_REQUIRED": "Konfiguration erforderlich",
+      "PROJECT_REQUIRED": "Projekt erforderlich",
+      "LOCATION_REQUIRED": "Standort erforderlich",
+      "FONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "FONTSIZE_REQUIRED": "Schriftgröße erforderlich",
+      "PATH_REQUIRED": "Pfad erforderlich",
+      "FORMAT_REQUIRED": "Format erforderlich",
+      "REPORT_REQUIRED": "Report erforderlich",
+      "REFRESH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "REFRESH_REQUIRED": "Aktualisieren erforderlich",
+      "TITLE_MAX_LENGTH": "Titel darf eine maximale Länge haben von {{max}} ",
+      "NAME_MAX_LENGTH": "Name darf eine maximale Länge haben von {{max}} ",
+      "OUTPUT_REQUIRED": "Ausgabe erforderlich",
+      "REPORTFOLDER_REQUIRED": "Ordner erforderlich",
+      "REPORTSUBFOLDER_REQUIRED": "Unterordner erforderlich",
+      "REPORTTYPE_REQUIRED": "Reporttyp erforderlich",
+      "AGENT_REQUIRED": "Agent erforderlich",
+      "INFO_REQUIRED": "Information erforderlich",
+      "SCRIPT_REQUIRED": "Skript erforderlich",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
+      "TIMEOUT_REQUIRED": "Timeout erforderlich",
+      "AUTOCREATE_FIELD_REQUIRED": "Automatisches Erstellen erforderlich",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Wählkontakt ignorieren ID-Feld ist erforderlich"
     },
     "HOST": "Host",
-    "SECRET": "Geheimnis",
-    "DEFAULTUSER": "Default User",
+    "SECRET": "Secret",
+    "DEFAULTUSER": "Standardnutzer",
     "DESCRIPTION": "Beschreibung",
-    "ADD_TRUNK": "Amtsleitung hinzufügen",
+    "ADD_TRUNK": "Trunk hinzufügen",
     "HELP": {
-      "SECRET": "Kennwort für die Authentifizierung, wenden Sie sich an den Anbieter.",
+      "SECRET": "Kennwort für die Authentifizierung, wenden Sie sich an den Systemadministrator.",
       "HOST": "Die Domäne oder den Hostnamen für den Anbieter.",
       "DEFAULTUSER": "Authentifizierung Benutzernamen, wenden Sie sich an den Anbieter.",
       "CALLERID": "Die Anrufer-ID im Format \"name\" <Nummer>.",
-      "REGISTRY": "Die amtsleitung Registry, die von einigen Anbietern, die in der Regel defaultuser:Secret@host.",
-      "FROMDOMAIN": "Legt Standardeinstellungen von:domain in SIP-Nachrichten als SIP-ua (Client). Einige Ziele können die obligatorische Identität Name anstatt nur die IP-Adresse.",
-      "FROMUSER": "Rovider wie ihr sie kennt. Dies ist der Benutzer, um anstelle der Anrufer-ID beim Tätigen von Anrufen zu anderen Peer (SIP-Proxy). Nur gültig für den Typ=peer.",
+      "REGISTRY": "Die SIP-Registry, die von einigen Anbietern, die in der Regel defaultuser:Secret@host.",
+      "FROMDOMAIN": "Legt Standardeinstellungen von:domain in SIP-Nachrichten als SIP-ua (Client).",
+      "FROMUSER": "SIP-Nutzereinstellungen. Nur gültig für den Typ=peer.",
       "OUTBOUNDPROXY": "IP-Adresse oder DNS-SRV-Ressourceneintrag name (ausgenommen die _sip._udp-Präfix): SRV Name, den Hostnamen oder die IP-Adresse des ausgehenden SIP-Proxy. Senden Sie ausgehende Signale zu diesem Proxy und nicht direkt an die Geräte. Nur gültig für den Typ=peer.",
-      "PORT": "Die Nummer des Ports, zu dem Sie eine Verbindung herstellen möchten wir auf der anderen Seite.",
-      "CONTEXT": "Die nutzbaren Rahmen für den Trunk.",
-      "TYPE": "Legt das SIP-Rolle innerhalb der Sternchen. User: Wird verwendet, um die Authentifizierung für eingehende - Peer: für ausgehende Anrufe - Freund: Deckt sowohl die Eigenschaften der oben genannten.",
-      "DTMFMODE": "Wie DTMF (Dual-Tone Multi-Frequency): RFC2833: Die Standardeinstellung, die DTMF gesendet mit RTP, aber außerhalb der Audio Stream. INBAND DTMF gesendet wird: Die in der Audio Stream des aktuellen Gesprächs, wird über die Lautsprecher hörbar. Erfordert eine hohe CPU-Last. INFO: Diese Methode ist zwar sehr zuverlässig, es ist nicht für alle TK-Anlagen und viele SIP-Trunk.",
-      "NAT": "Ändert das Verhalten von Sternchen für Clients hinter einer Firewall.Wenn der Komma-getrennten Optionen ist \"Nein\", Asterisk ignoriert alle anderen Einstellungen und die nat=No.",
+      "PORT": "Die Nummer des Ports, zu dem Sie eine Verbindung herstellen möchten.",
+      "CONTEXT": "Die nutzbaren Kontext für den Trunk.",
+      "TYPE": "Definiert die SIP-Rolle innerhalb der Anwendung. User: Authentifizierung für eingehende Verbindungen; Peer: für ausgehende Verbindungen - Freund: Beide Eigenschaften werden erfüllt",
+      "DTMFMODE": "Sendeart von DTMF-Tönen (Dual-Tone Multi-Frequency): RFC2833: Standardeinstellung, DMTF wird über RTP gesendet (außerhalb des Audiostreams) - INBAND DTMF wird innerhalb des Audiostreams gesendet, über die Lautsprecher hörbar. Erfordert eine höhere CPU-Last.",
+      "NAT": "Ändert das Verhalten von Sternchen für Clients hinter einer Firewall. Wenn \"Nein\", ignoriert der Asterisk alle anderen Einstellungen und die nat=No.",
       "QUALIFY": "Legt fest, wann die SIP erreichbar ist.",
       "ALLOWCODECS": "Erlaubt Codecs in der Reihenfolge ihrer Präferenz.",
-      "INSECURE": "Legt fest, wie Verbindungen mit Peer, dass unsichere Einstellungen.",
-      "CALL_LIMIT": "Die Anzahl der eingehenden und abgehenden Anrufe, die zu einer Zeit.",
-      "DIRECTMEDIA": "Sternchen standardmäßig versucht, die RTP-Stream direkt aus den Anrufer an den Angerufenen. Einige Geräte werden nicht unterstützt wird (vor allem, wenn einer von Ihnen hinter einem NAT-Gerät befindet). Die Standardeinstellung ist Ja. Wenn Sie alle Clients hinter einem NAT-Gerät befindet, oder aus einem anderen Grund nicht möchten, dass Sternchen in der Audiospur, können Sie diese ausschalten.",
-      "CALLCOUNTER": "Aktivieren Sie die Zähler auf Geräte.",
-      "ADD_PHONE_TO_URI": "Legen Sie fest, ob die Provider ';user=Telefon\" an den URL.",
-      "TRUST_REMOTE_PARTY_ID": "Wenn Remote-Party-ID definieren sollte.",
-      "SEND_REMOTE_PARTY_ID_HEADER": "Status",
-      "ENCRYPTION": "Festlegen, ob die Remote-Party-ID gesendet werden soll (standardmäßig auf Nein).",
+      "INSECURE": "Erlaubt unsichere Einstellungen für peer",
+      "CALL_LIMIT": "Maximale Anzahl aller gleichzeitigen ein- und ausgehenden Anrufe",
+      "DIRECTMEDIA": "Der Asterisk versucht, den RTP-Stream im Standard direkt zwischen dem Anrufer und dem Angerufenen aufzubauen. Manche Geräte (z.B. Firewalls) unterstützen diese Funktion nicht. Daher kann hier eine Umstellung erfolgen.",
+      "CALLCOUNTER": "Aktivieren der Anrufzähler für die Geräte",
+      "ADD_PHONE_TO_URI": "Fügt im SIP den user=phone zur URL hinzu",
+      "TRUST_REMOTE_PARTY_ID": "Soll der URL der anderen Partei vertraut werden?",
+      "SEND_REMOTE_PARTY_ID_HEADER": "Soll die ID der anderen Partei gesendet werden?",
+      "ENCRYPTION": "Legt fest, ob die Verbindung über SRTP verschlüsselt vorliegt. Sollte das peer kein SRTP unterstützen, werden Anrufe mit dem HANGUPCAUSE=58 beendet.",
       "TRANSPORT": "Festlegen der Standardeinstellungen für Transporte. Die Reihenfolge bestimmt den primären Standard.",
-      "OTHERFIELDS": "Weitere Felder hinzufügen, in der Amtsleitungen conf-Dateien. In Sternchen format (key=value), jedes Feld auf einer Zeile.",
-      "EMAILADDRESS": "Sie können mehrere Adressen mit Kommata (z. b. [email-masked], [email-masked])",
+      "OTHERFIELDS": "Weitere Felder hinzufügen, in der Trunks conf-Dateien. In Sternchen format (key=value), jedes Feld auf einer Zeile.",
+      "EMAILADDRESS": "Mehrere Adressen mit Komma getrennt eingeben: (z. b. [email-masked], [email-masked])",
       "NAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
-      "EVENTVARIABLES": "Wenn aktiviert, Es fügt alle Event Variablen an die Url",
+      "EVENTVARIABLES": "Fügt die Event-Variablen der URL hinzu",
       "T38PT_UDPTL": "Es: Ja, Redundanz, maxdatagram = 400",
       "EMAILBCCADDRESS": "Fügen Sie eine oder mehrere durch Kommas getrennte Adressen hinzu (z. B. [email-masked], [email-masked]).",
       "EMAILCCADDRESS": "Fügen Sie eine oder mehrere durch Kommas getrennte Adressen hinzu (z. B. [email-masked], [email-masked]).",
-      "BODY": "Wenn nicht ausgefüllt, wird der Standardwert gesendet",
+      "BODY": "(RAW-JSON-Format) Wenn nicht ausgefüllt, wird der Standardwert verwendet",
       "INFO": "Titel einfügen",
       "SCRIPT": "Skript einfügen",
       "SCRIPT_INFO": "Fügen Sie eine Beschreibung für das Skript ein",
       "SCRIPT_TYPE": "Geben Sie eine Typologie für das Skript ein (zB curl, bash ...)",
-      "HEADERS": "Hinweis: Der Header-Abschnitt muss im RAW-JSON-Format {\"key\": \"value\"} vorliegen.\nHinweis: Wenn nicht ausgefüllt, wird der Standardwert gesendet",
-      "TIMEOUT": "Zeitüberschreitung in Sekunden anfordern. Der Wert muss zwischen 1 und 10 liegen und der Standardwert ist 5."
+      "MANAGED": "Die Gesamtzahl der abgeschlossenen Interaktionen",
+      "OPENED": "Die Gesamtzahl der aktiven Interaktionen",
+      "HEADERS": "Hinweis: Der Header-Abschnitt muss im RAW-JSON-Format {\"key\": \"value\"} vorliegen.\nHinweis: Wenn nicht ausgefüllt, wird der Standardwert verwendet",
+      "TIMEOUT": "Zeitüberschreitung in Sekunden anfordern. Der Wert muss zwischen 1 und 10 liegen - Standardwert ist 5."
     },
     "EDIT_TRUNK": "Trunk bearbeiten",
-    "DELETE_TRUNK": "Löschen Sie Trunk",
+    "DELETE_TRUNK": "Trunk löschen",
     "CREATED_AT": "Erstellt am",
     "SETTINGS": "Einstellungen",
-    "ADVANCED": "Erweiterte",
+    "ADVANCED": "Erweitert",
     "OTHER": "Andere",
     "ACTIVE": "Aktiv",
     "CONTEXT": "Kontext",
-    "CALLERID": "Die Anrufer-ID",
+    "CALLERID": "Anrufer-ID",
     "TYPE": "Typ",
-    "DTMFMODE": "Mfv-Modus",
+    "DTMFMODE": "DTMF-Modus",
     "NAT": "NAT",
     "QUALIFY": "Qualifizieren",
     "ALLOWCODECS": "Codecs erlaubt",
     "INSECURE": "Unsicher",
     "REGISTRY": "Registrierung",
-    "DIRECTMEDIA": "Direkte Medien",
+    "DIRECTMEDIA": "Direct Media",
     "CALLCOUNTER": "Anrufzähler",
-    "FROMDOMAIN": "Aus der Domäne",
-    "FROMUSER": "Vom Benutzer",
-    "OUTBOUNDPROXY": "Ausgehender Proxy",
-    "ADD_PHONE_TO_URI": "Telefon hinzufügen, URL",
-    "TRUST_REMOTE_PARTY_ID": "Vertrauen Gegenstelle ID",
-    "SEND_REMOTE_PARTY_ID_HEADER": "Senden einer Partner-ID Header",
+    "FROMDOMAIN": "From Domain",
+    "FROMUSER": "From Nutzer",
+    "OUTBOUNDPROXY": "Outbound Proxy",
+    "ADD_PHONE_TO_URI": "Telefon zur URL hinzufügen",
+    "TRUST_REMOTE_PARTY_ID": "Trust Remote Party ID",
+    "SEND_REMOTE_PARTY_ID_HEADER": "Remote Party im Header senden",
     "ENCRYPTION": "Verschlüsselung",
-    "PORT": "Hafen",
-    "TRANSPORT": "Verkehr",
+    "PORT": "Port",
+    "TRANSPORT": "Transport",
     "SAVE": "Speichern",
     "VARIABLES": "Variablen",
     "ADD_VARIABLE": "Variable hinzufügen",
     "EDIT_VARIABLE": "Variable bearbeiten",
     "DELETE_VARIABLE": "Variable löschen",
-    "SELECTED": "Ausgewählte",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
+    "SELECTED": "Ausgewählt",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
     "TAGS": "Tags",
-    "ADD_TAG": "Variable hinzufügen",
-    "EDIT_TAG": "Variable bearbeiten",
-    "DELETE_TAG": "Variable löschen",
+    "ADD_TAG": "Tag hinzufügen",
+    "EDIT_TAG": "Tag bearbeiten",
+    "DELETE_TAG": "Tag löschen",
     "PAUSES": "Pausen",
     "ADD_PAUSE": "Pause hinzufügen",
     "EDIT_PAUSE": "Pause bearbeiten",
     "DELETE_PAUSE": "Pause löschen",
-    "ADD_CANNEDANSWER": "Vordefinierte Antwort hinzufügen",
-    "EDIT_CANNEDANSWER": "Vordefinierte Antwort bearbeiten",
-    "DELETE_CANNEDANSWER": "Vordefinierte Antwort löschen",
+    "ADD_CANNEDANSWER": "Textvorlage hinzufügen",
+    "EDIT_CANNEDANSWER": "Textvorlage bearbeiten",
+    "DELETE_CANNEDANSWER": "Testvorlage löschen",
     "KEY": "Schlüssel",
     "VALUE": "Wert",
-    "SOUNDS": "Sounds",
-    "EDIT_SOUND": "Ton bearbeiten",
-    "DELETE_SOUND": "Sound löschen",
-    "FINISH": "Fertig stellen",
+    "SOUNDS": "Audiodateien",
+    "EDIT_SOUND": "Audiodatei bearbeiten",
+    "DELETE_SOUND": "Audiodatei löschen",
+    "FINISH": "Abschließen",
     "DROP_TO_UPLOAD": "Drop hochladen",
     "TRIGGERS": "Trigger",
-    "EDIT_TRIGGER": "Auslöser bearbeiten",
-    "DELETE_TRIGGER": "Auslöser löschen",
+    "EDIT_TRIGGER": "Trigger bearbeiten",
+    "DELETE_TRIGGER": "Trigger löschen",
     "ADD_TRIGGER": "Trigger hinzufügen",
     "DELETE": "Löschen",
-    "AUTOMATIONS": "Automatisierungen",
-    "EDIT_AUTOMATION": "Bearbeiten einer Automation",
+    "AUTOMATIONS": "Automation",
+    "EDIT_AUTOMATION": "Automation bearbeiten",
     "DELETE_AUTOMATION": "Automation löschen",
     "ADD_AUTOMATION": "Automation hinzufügen",
-    "INTERVALS": "Intervalle",
+    "INTERVALS": "Zeiten und Feiertage",
     "EDIT_INTERVAL": "Intervall bearbeiten",
-    "DELETE_INTERVAL": "Intervall für Löschen.",
+    "DELETE_INTERVAL": "Intervall löschen",
     "ADD_INTERVAL": "Intervall hinzufügen",
     "TOOLS": "Werkzeuge",
-    "ID": "Id",
+    "ID": "ID",
     "AUDIO": "Audio",
-    "DOWNLOAD_SOUND": "Download Sound",
-    "UPLOAD_SOUND": "Werkzeuge",
+    "DOWNLOAD_SOUND": "Audiodatei herunterladen",
+    "UPLOAD_SOUND": "Audiodatei hochladen",
     "CHANNEL": "Kanal",
     "NEW_TRIGGER": "Neue Trigger",
     "GENERAL": "Allgemein",
     "STATUS": "Status",
     "CONDITIONS&ACTIONS": "Bedingungen und Aktionen",
-    "ALLCONDITIONS": "Alle diese Bedingungen erfüllen:",
-    "ANYCONDITIONS": "Treffen diese Voraussetzungen:",
-    "ACTIONS": "Aktionen:",
+    "ALLCONDITIONS": "Alle Bedingungen werden erfüllt",
+    "ANYCONDITIONS": "Einige Bedingungen werden erfüllt",
+    "ACTIONS": "Aktionen",
     "NEW_AUTOMATION": "Neue Automation",
     "TIMEOUT": "Timeout",
     "PEERSTATUS": "Peer Status",
-    "CALL_LIMIT": "Anrufe beschränken",
-    "OTHERFIELDS": "Andere Felder",
+    "CALL_LIMIT": "Anrufe limitieren",
+    "OTHERFIELDS": "Weitere Felder",
     "NEW_VARIABLE": "Neue Variable",
     "NEW_TAG": "Neuer Tag",
     "NEW_PAUSE": "Neue Pause",
-    "NEW_CANNEDANSWER": "Neue vordefinierte Antwort",
+    "NEW_CANNEDANSWER": "Neue Textvorlage",
     "CONFIRM_PASSWORD": "Passwort bestätigen",
-    "NEW_TRUNK": "Neue Leitung",
-    "FROM": "Von",
-    "TO": "Zu",
-    "WEEKDAY": "Woche Tag",
-    "MONTHDAY": "Monat Tag",
+    "NEW_TRUNK": "Neuer Trunk",
+    "FROM": "von",
+    "TO": "an",
+    "WEEKDAY": "Wochentag",
+    "MONTHDAY": "Monatstag",
     "MONTH": "Monat",
     "ALWAYS": "Immer",
     "MON": "Montag",
@@ -231,22 +235,22 @@
     "PASSWORD": "Passwort",
     "CUSTOMDASHBOARDS": "Benutzerdefinierte Dashboards",
     "NEW_CUSTOMDASHBOARD": "Neues benutzerdefiniertes Dashboard",
-    "ADD_CUSTOMDASHBOARD": "Hinzufügen von benutzerdefinierten Dashboard",
-    "EDIT_CUSTOMDASHBOARD": "Benutzerdefinierte Dashboards bearbeiten",
-    "DELETE_CUSTOMDASHBOARD": "Benutzerdefiniertes Dashboard löschen.",
-    "SCHEDULER": "Scheduler",
-    "NEW_SCHEDULE": "Neuer Zeitplan",
-    "ADD_SCHEDULE": "Zeitplan hinzufügen",
-    "EDIT_SCHEDULE": "Zeitplan bearbeiten",
-    "DELETE_SCHEDULE": "Zeitplan löschen",
+    "ADD_CUSTOMDASHBOARD": "Benutzerdefiniertes Dashboard hinzufügen",
+    "EDIT_CUSTOMDASHBOARD": "Benutzerdefiniertes Dashboard bearbeiten",
+    "DELETE_CUSTOMDASHBOARD": "Benutzerdefiniertes Dashboard löschen",
+    "SCHEDULER": "Berichtsplanung",
+    "NEW_SCHEDULE": "Neue Planung",
+    "ADD_SCHEDULE": "Planung hinzufügen",
+    "EDIT_SCHEDULE": "Planung bearbeiten",
+    "DELETE_SCHEDULE": "Planung löschen",
     "SENDMAIL": "E-Mail senden",
     "CONFIGURATION": "Konfiguration",
     "MAIL": "E-Mail",
     "REPORTTYPE": "Berichtstyp",
     "REPORT": "Bericht",
-    "OUTPUT": "Ausgang",
+    "OUTPUT": "Ausgabe",
     "EXECUTEON": "Ausführung",
-    "REPORTRANGE": "Berichtsbereich",
+    "REPORTRANGE": "Bereich",
     "VALIDITYSTART": "Startzeit",
     "VALIDITYEND": "Endzeit",
     "EXECUTEEVERY": "Alle ausführen",
@@ -258,9 +262,9 @@
     "MONTHLY": "Monatlich",
     "PREVIOUS_DAY": "Vorheriger Tag",
     "LAST_SEVEN_DAYS": "Letzte sieben Tage",
-    "LAST_THIRTY_DAYS": "33 verbotenen letzte Tage",
+    "LAST_THIRTY_DAYS": "Letzte 30 Tage",
     "LAST_MONTH": "Letzter Monat",
-    "WEEKDAYS": "Woche Tage",
+    "WEEKDAYS": "Wochentage",
     "HOUR": "Stunde",
     "DEFAULT": "Standard",
     "CSV": "CSV",
@@ -268,7 +272,7 @@
     "15MIN": "15 Minuten",
     "30MIN": "30 Minuten",
     "1H": "1 Stunde",
-    "VOICE": "Voice",
+    "VOICE": "Sprachanrufe",
     "CHAT": "Chat",
     "SMS": "SMS",
     "OPENCHANNEL": "Offener Kanal",
@@ -293,19 +297,19 @@
     "ADD_ALLCONDITION": "Bedingung hinzufügen",
     "EDIT_ACTION": "Aktion bearbeiten",
     "DELETE_ACTION": "Aktion löschen",
-    "NEW_ACTION": "Neue Maßnahme",
+    "NEW_ACTION": "Neue Aktion",
     "ADD_ACTION": "Aktion hinzufügen",
     "QUEUE": "Warteschlange",
     "CALL_STATUS": "Anrufstatus",
-    "OUTBOUNDROUTE": "Abgehende Routen",
-    "EQUALS": "Ist gleich",
-    "NOT_EQUALS": "Nicht gleich",
-    "CONTACT_MANAGER": "Contacts Manager",
+    "OUTBOUNDROUTE": "Ausgehende Routen",
+    "EQUALS": "ist gleich",
+    "NOT_EQUALS": "ist nicht gleich",
+    "CONTACT_MANAGER": "Kontaktmanager",
     "INTEGRATIONS": "Integrationen",
     "MOTIONBAR": "Motion Bar",
     "JSCRIPTY": "Jscripty",
-    "URL_FORWARD": "URL Weiterleitung",
-    "WEB_POPUP": "Web Popup",
+    "URL_FORWARD": "URL-Weiterleitung",
+    "WEB_POPUP": "Web-Popup",
     "LIST": "Liste",
     "INTEGRATION": "Integration",
     "TEMPLATE": "Vorlage",
@@ -317,27 +321,27 @@
     "OPERATOR": "Betreiber",
     "NO_INTERVALS_AVAILABLE": "Keine Intervalle zur Verfügung",
     "YES": "Ja",
-    "NO": "Keine",
+    "NO": "Nein",
     "SUBJECT": "Betreff",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
     "BROWSER": "Browser",
     "INTERVAL": "Intervall",
-    "INFO": "Info",
+    "INFO": "Information",
     "TIME_RANGE": "Zeitbereich",
-    "WEEK_DAYS": "Woche Tage",
-    "MONTH_DAYS": "Monat Tage",
+    "WEEK_DAYS": "Wochentage",
+    "MONTH_DAYS": "Monatstage",
     "MONTHS": "Monate",
-    "DROP_TO_UPLOAD_MESSAGE": "Sie können auch Audiodateien hier ablegen\" hochzuladen. Nur MP3-, WAV-, GSM-Max. 15 MB",
+    "DROP_TO_UPLOAD_MESSAGE": "Dateien hier hinein ziehen zum Hochladen. Unterstütze Formate: .mp3, .wav, .gsm; Max. Dateigröße: 15 MB",
     "POLLING_INTERVAL": "Abfrageintervall (Sekunden)",
-    "DASHBOARD": "Armaturenbrett",
-    "NEW_DASHBOARDITEM": "Neue Dashboard Widget",
+    "DASHBOARD": "Dashboard",
+    "NEW_DASHBOARDITEM": "Neues Dashboard-Widget",
     "COUNTER": "Zähler",
     "IFRAME": "IFrame",
     "CLOCK": "Uhr",
-    "ADD_DASHBOARDITEM": "Dashboard Widget hinzufügen",
-    "EDIT_WIDGET": "Bearbeiten Widget",
-    "DELETE_WIDGET": "Löschen Widget",
-    "FLIP_WIDGET": "Flip Widget",
+    "ADD_DASHBOARDITEM": "Dashboard-Widget hinzufügen",
+    "EDIT_WIDGET": "Widget bearbeiten",
+    "DELETE_WIDGET": "Widget löschen",
+    "FLIP_WIDGET": "Widget drehen",
     "TITLE": "Titel",
     "UPDATE": "Aktualisieren",
     "LAYOUT": "Layout",
@@ -345,56 +349,56 @@
     "FOREGROUND_COLOR": "Vordergrundfarbe",
     "FOREGROUND_TITLE_COLOR": "Vordergrund Titel Farbe",
     "THEME": "Thema",
-    "LIGHT": "Licht",
+    "LIGHT": "Hell",
     "DARK": "Dunkel",
     "TIMEZONE": "Zeitzone",
-    "DIGITAL_FORMAT": "Digitale Datum Format",
+    "DIGITAL_FORMAT": "Digitales Datumsformat",
     "TOOLS_QUERY": "Abfrage",
-    "SELECT": "Wählen Sie",
+    "SELECT": "Auswählen",
     "WHERE": "Wo",
     "BACK": "Zurück",
     "PROJECT": "Projekt",
-    "GOTOREALTIME_TRUNK": "In Echtzeit, Trunk gehen",
-    "GOTO_TRUNK": "Um die Leitungsbündel gehen",
-    "CRON": "Cron",
+    "GOTOREALTIME_TRUNK": "Zum Echtzeitmonitoring SIP-Trunks gehen",
+    "GOTO_TRUNK": "Zum SIP-Trunk gehen",
+    "CRON": "CrOn",
     "MINUTES": "Minuten",
     "HOURLY": "Stündlich",
     "YEARLY": "Jährlich",
     "EVERY": "Jede",
     "MINUTE": "Minute",
-    "ON_SECOND": "Im 2.",
-    "HOUR_ON_MINUTE": "Stunde Minute",
-    "AND_SECOND": "Und 2.",
-    "DAY_AT": "Tag an",
+    "ON_SECOND": "Zur Sekunde",
+    "HOUR_ON_MINUTE": "Stunde zur Minute",
+    "AND_SECOND": "und Sekunde",
+    "DAY_AT": "Am Tag",
     "START_TIME": "Startzeit",
-    "ON_THE": "Auf der",
-    "OF_EVERY": "Jedes",
+    "ON_THE": "Am",
+    "OF_EVERY": "An jedem",
     "MONTH_AT": "Monat",
-    "AT": "An",
+    "AT": "Um",
     "LAST": "Letzte",
     "LASTUNIT": "Einheit",
     "MAILACCOUNT": "E-Mail Konto",
-    "OF": "Von",
+    "OF": "von",
     "PAST_THE_HOUR": "Nach der vollen Stunde",
     "DAY": "Tag",
     "WEEK": "Woche",
     "YEAR": "Jahr",
-    "ON": "Auf",
+    "ON": "Am",
     "PAI": "P-Asserted-Identity",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OUTBOUND_ROUTE": "Abgehende Routen",
-    "EVENTVARIABLES": "Bei Variablen",
+    "OUTBOUND_ROUTE": "Ausgehende Routen",
+    "EVENTVARIABLES": "Event-Variablen",
     "FAX": "Fax",
     "INTERACTION": "Interaktion",
     "MESSAGE": "Nachricht",
     "T38PT_UDPTL": "T38 pt Udptl",
-    "AUTOCREATECONTACT": "Erstellen Sie automatisch",
+    "AUTOCREATECONTACT": "Automatische Kontakterstellung",
     "COLOR": "Farbe",
-    "LOCATION": "Lage",
-    "NEW_TAB": "Neue Registerkarte",
+    "LOCATION": "Standort",
+    "NEW_TAB": "Neuer Tab",
     "NEW_WINDOW": "Neues Fenster",
-    "WINDOWWIDTH": "Fenster Breite (px)",
+    "WINDOWWIDTH": "Fensterbreite (px)",
     "WINDOWHEIGHT": "Fensterhöhe (px)",
     "EDIT_DASHBOARDITEM": "Dashboard-Widget bearbeiten",
     "FONTSIZE": "Schriftgröße",
@@ -404,21 +408,21 @@
     "FOREGROUND": "Vordergrund",
     "NONE": "Keiner",
     "TOTAL": "Gesamt",
-    "ABANDONED": "Verlassen",
+    "ABANDONED": "Abgebrochen",
     "WAITING": "Warten",
-    "TALKING": "Reden",
-    "ANSWERED": "Antwortete",
-    "UNMANAGED": "Nicht verwaltet",
+    "TALKING": "im Gespräch",
+    "ANSWERED": "Beantwortet",
+    "UNMANAGED": "Nicht bearbeitet",
     "CUSTOMTYPE": "Benutzerdefiniert [Pfad]",
     "WEBREPORT": "Webbericht",
     "PIECHART": "Kuchendiagramm",
     "MULTIBARCHART": "Multibar-Diagramm",
     "MOVE_WIDGET": "Widget verschieben",
-    "USERADD_CUSTOMDASHBOARD": "Hinzufügen von Benutzerberechtigungen",
-    "GOTODASHBOARD_CUSTOMDASHBOARD": "Gehe zum Vorschau-Dashboard",
-    "GOTO_CUSTOMDASHBOARD": "Gehe zum Vorschau-Dashboard",
+    "USERADD_CUSTOMDASHBOARD": "Berechtigungen hinzufügen",
+    "GOTODASHBOARD_CUSTOMDASHBOARD": "Vorschau Dashboard",
+    "GOTO_CUSTOMDASHBOARD": "Vorschau Dashboard",
     "METRIC": "Metrisch",
-    "FILTERVOICEQUEUES": "Voice-Warteschlangen filtern",
+    "FILTERVOICEQUEUES": "Anruf-Warteschlangen filtern",
     "SERIE1": "Serie 1",
     "SERIE2": "Serie 2",
     "SERIE3": "Serie 3",
@@ -428,48 +432,56 @@
     "ALL_USERS": "Alle Nutzer",
     "SELECTED_USERS": "Ausgewählte Benutzer",
     "ADD_WIDGET": "Widget hinzufügen",
-    "NEXTCONTACT": "Nächster",
+    "NEXTCONTACT": "Nächster Kontakt",
     "SENDIFEMPTY": "Senden, wenn leer",
-    "CANCEL": "Stornieren",
+    "CANCEL": "Abbrechen",
     "UPLOADING": "Hochladen",
-    "EMAILBCCADDRESS": "Bcc",
-    "EMAILCCADDRESS": "Cc",
-    "RUN_SCHEDULE": "Zeitplan ausführen",
-    "ADD_DISPOSITION": "Disposition hinzufügen",
-    "DELETE_DISPOSITION": "Disposition löschen",
-    "DISPOSITIONS": "Dispositionen",
-    "EDIT_DISPOSITION": "Disposition bearbeiten",
-    "NEW_DISPOSITION": "Neue Disposition",
-    "CLONE_TRUNK": "Klon-Trunk",
-    "BODY": "Karosserie",
-    "CANNEDANSWERS": "Vordefinierte Antworten",
+    "EMAILBCCADDRESS": "BCC",
+    "EMAILCCADDRESS": "CC",
+    "RUN_SCHEDULE": "Zeitplanung ausführen",
+    "ADD_DISPOSITION": "Qualifizierung hinzufügen",
+    "DELETE_DISPOSITION": "Qualifizierung löschen",
+    "DISPOSITIONS": "Qualifizierungen",
+    "EDIT_DISPOSITION": "Qualifizierung bearbeiten",
+    "NEW_DISPOSITION": "Neue Qualifizierung",
+    "CLONE_TRUNK": "Trunk klonen",
+    "BODY": "Textinhalt",
+    "CANNEDANSWERS": "Textvorlagen",
     "REPORTFOLDER": "Berichtsordner",
-    "REPORTSUBFOLDER": "Unterordner melden",
-    "PREVIOUSCONTACT": "Bisherige",
+    "REPORTSUBFOLDER": "Unterordner",
+    "PREVIOUSCONTACT": "Vorherigen Kontakt",
     "VIDEOSUPPORT": "Video-Unterstützung",
     "AGENT": "Agent",
     "HEADERS": "Überschriften",
     "SCRIPT": "Skript",
-    "SCRIPT_INFO": "Info",
+    "SCRIPT_INFO": "Information",
     "SCRIPT_TYPE": "Art",
     "MOTION_TAB": "Neue Registerkarte \"Agent Dashboard\"",
     "WHATSAPP": "WhatsApp Connector",
     "AUTOCREATE_FIELD": "Feld automatisch erstellen",
-    "GLOBALS": "Globals",
+    "GLOBALS": "Globale Werte",
     "SEARCH_FIELDS": "Suchfelder",
     "STANDARD": "Standard",
     "MOTION_BAR": "Motion Bar",
     "ALL": "Alle",
-    "ALL_DISPOSITIONS": "Alle Dispositionen",
-    "FIRST_LEVEL_DISPOSITION": "First Level Disposition",
-    "LEVEL": "Niveau",
-    "SECOND_LEVEL_DISPOSITION": "Disposition der zweiten Ebene",
-    "SELECT_LEVEL": "Wählen Sie eine Ebene",
-    "TITLEFONTSIZE": "Schrifttitelgröße",
-    "ADD_CONTACTITEMTYPE": "Hinzufügen",
-    "CONTACTITEMTYPE": "Kontaktartikeltypen",
-    "NEW_CONTACTITEMTYPE": "Neuer Kontaktelementtyp",
-    "ORDER_BY": "Sortieren nach",
-    "RGBBACKGROUNDCOLOR": "RGB-Hintergrundfarbe"
+    "EMAIL": "Email",
+    "FILTERCHATWEBSITES": "Chat-Websites filtern",
+    "FILTEREMAILACCOUNTS": "E-Mail-Konten filtern",
+    "FILTERFAXACCOUNTS": "Faxkonten filtern",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannel-Konten filtern",
+    "FILTERSMSACCOUNTS": "SMS-Konten filtern",
+    "FILTERWHATSAPPACCOUNTS": "WhatsApp-Konten filtern",
+    "MANAGED": "Gelang es",
+    "MANAGED_TEXT": "Verwaltete Interaktionen",
+    "OPENED": "Geöffnet",
+    "OPENED_TEXT": "Geöffnete Interaktionen",
+    "ALL_DISPOSITIONS": "Alle Qualifizierungen",
+    "FIRST_LEVEL_DISPOSITION": "Qualifizierung der ersten Ebene",
+    "LEVEL": "Ebene",
+    "SECOND_LEVEL_DISPOSITION": "Qualifizierung der zweiten Ebene",
+    "SELECT_LEVEL": "Ebene auswählen",
+    "TITLEFONTSIZE": "Schriftgröße Titel",
+    "IGNOREDIALERCONTACTID": "Wählkontakt-ID ignorieren",
+    "MAIL_SUBSTATUS": "E-Mail-Unterstatus"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/en.json b/public/app/main/apps/tools/i18n/en.json
index 37ce2c5..320012b 100644
--- a/public/app/main/apps/tools/i18n/en.json
+++ b/public/app/main/apps/tools/i18n/en.json
@@ -20,20 +20,13 @@
     "LINK": "Link [https://]",
     "BACKGROUND": "Background",
     "FOREGROUND": "Foreground",
+    "IGNOREDIALERCONTACTID": "Ignore dialer contact Id",
     "NONE": "None",
     "TOTAL": "Total",
     "ABANDONED": "Abandoned",
     "WAITING": "Waiting",
     "TALKING": "Talking",
     "ANSWERED": "Answered",
-    "CONTACTITEMTYPE": "Contact item types",
-    "ORDER_BY": "Order by",
-    "RGBBACKGROUNDCOLOR": "RGB Background color",
-    "NEW_CONTACTITEMTYPE": "New contact item type",
-    "EDIT_CONTACTITEMTYPE": "Edit contact item type",
-    "DELETE_CONTACTITEMTYPE": "Delete contact item type",
-    "ORDER_BY_NUMERIC":"Order by field should be numeric value!",
-    "ADD_CONTACTITEMTYPE": "Add",
     "UNMANAGED": "Unmanaged",
     "CUSTOMTYPE": "Custom [path]",
     "WEBREPORT": "Web Report",
@@ -66,6 +59,17 @@
     "SCRIPT": "Script",
     "SCRIPT_INFO": "Info",
     "SCRIPT_TYPE": "Type",
+    "EMAIL": "Email",
+    "FILTERFAXACCOUNTS": "Filter Fax Accounts",
+    "FILTERSMSACCOUNTS": "Filter Sms Accounts",
+    "FILTERCHATWEBSITES": "Filter Chat Websites",
+    "FILTERWHATSAPPACCOUNTS": "Filter Whatsapp Accounts",
+    "FILTEREMAILACCOUNTS": "Filter Email Accounts",
+    "FILTEROPENCHANNELACCOUNTS": "Filter OpenChannel Accounts",
+    "OPENED": "Opened",
+    "OPENED_TEXT": "Opened Interactions",
+    "MANAGED": "Managed",
+    "MANAGED_TEXT": "Managed Interactions",
     "ERRORS": {
       "INFO_REQUIRED": "Mandatory field",
       "SCRIPT_REQUIRED": "Mandatory field",
@@ -82,6 +86,7 @@
       "TYPE_REQUIRED": "Mandatory field",
       "VALUE_REQUIRED": "Mandatory field",
       "ACCOUNT_REQUIRED": "Mandatory field",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignore dialer contact Id field is required",
       "FIELD_REQUIRED": "Mandatory field",
       "NAME_REQUIRED": "Mandatory field",
       "HOST_REQUIRED": "Mandatory field",
@@ -127,7 +132,8 @@
       "AGENT_REQUIRED": "Mandatory field",
       "TIMEOUT_REQUIRED": "Mandatory field",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to"
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CHANNEL_REQUIRED": "Mandatory field"
     },
     "HOST": "Host",
     "SECRET": "Secret",
@@ -135,6 +141,8 @@
     "DESCRIPTION": "Description",
     "ADD_TRUNK": "Add Trunk",
     "HELP": {
+      "OPENED": "The total number of Active Interactions",
+      "MANAGED": "The total number of Completed Interactions",
       "SCRIPT_INFO": "Insert a description for the script",
       "SCRIPT_TYPE": "Insert a typology for the script (eg. curl, bash...)",
       "INFO": "Insert title",
@@ -364,6 +372,8 @@
     "QUEUE": "Queue",
     "CALL_STATUS": "Call Status",
     "OUTBOUNDROUTE": "Outbound Route",
+    "MAIL_SUBSTATUS": "Email Substatus",
+    "OFFLINE_MESSAGE": "Offline Message",
     "EQUALS": "Equals",
     "NOT_EQUALS": "Not Equals",
     "CONTACT_MANAGER": "Contacts Manager",
diff --git a/public/app/main/apps/tools/i18n/es.json b/public/app/main/apps/tools/i18n/es.json
index 8723cdd..4c3ca82 100644
--- a/public/app/main/apps/tools/i18n/es.json
+++ b/public/app/main/apps/tools/i18n/es.json
@@ -39,7 +39,9 @@
       "SCRIPT_INFO": "Insertar una descripción para el script",
       "SCRIPT_TYPE": "Inserte una tipología para el script (por ejemplo, curl, bash ...)",
       "HEADERS": "Nota: La sección de encabezados debe estar en formato RAW JSON {\"clave\": \"valor\"}\nNota: Si no se completa, se enviará el valor predeterminado",
-      "TIMEOUT": "Solicitar tiempo de espera en segundos. El valor debe estar entre 1 y 10 y el valor predeterminado es 5."
+      "TIMEOUT": "Solicitar tiempo de espera en segundos. El valor debe estar entre 1 y 10 y el valor predeterminado es 5.",
+      "MANAGED": "El número total de interacciones completadas",
+      "OPENED": "El número total de interacciones activas"
     },
     "ERRORS": {
       "ACCOUNT_REQUIRED": "Campo obligatorio",
@@ -102,7 +104,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "El valor debe ser mayor o igual que",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "El valor debe ser menor o igual que",
       "TIMEOUT_REQUIRED": "Campo obligatorio",
-      "AUTOCREATE_FIELD_REQUIRED": "Campo obligatorio"
+      "AUTOCREATE_FIELD_REQUIRED": "Campo obligatorio",
+      "CHANNEL_REQUIRED": "Campo obligatorio",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignorar el campo de identificación del contacto del marcador es obligatorio"
     },
     "15MIN": "15 minutos",
     "1H": "1 hora",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Tipificación de segundo nivel",
     "SELECT_LEVEL": "Seleccionar un nivel",
     "TITLEFONTSIZE": "Tamaño del título de fuente",
-    "ADD_CONTACTITEMTYPE": "Agregar",
-    "CONTACTITEMTYPE": "Tipos de elementos de contacto",
-    "NEW_CONTACTITEMTYPE": "Nuevo tipo de elemento de contacto",
-    "ORDER_BY": "Ordenar por",
-    "RGBBACKGROUNDCOLOR": "Color de fondo RGB"
+    "EMAIL": "Correo electrónico",
+    "FILTERCHATWEBSITES": "Filtrar sitios web de chat",
+    "FILTEREMAILACCOUNTS": "Filtrar cuentas de correo electrónico",
+    "FILTERFAXACCOUNTS": "Filtrar cuentas de fax",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrar cuentas de OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtrar cuentas de SMS",
+    "FILTERWHATSAPPACCOUNTS": "Filtrar cuentas de Whatsapp",
+    "MANAGED": "Administrado",
+    "MANAGED_TEXT": "Interacciones gestionadas",
+    "OPENED": "Abrió",
+    "OPENED_TEXT": "Interacciones abiertas",
+    "IGNOREDIALERCONTACTID": "Ignorar la identificación del contacto del marcador",
+    "MAIL_SUBSTATUS": "Subestado de correo electrónico"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/et.json b/public/app/main/apps/tools/i18n/et.json
index 485a460..f5b3ca6 100644
--- a/public/app/main/apps/tools/i18n/et.json
+++ b/public/app/main/apps/tools/i18n/et.json
@@ -113,7 +113,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Väärtus peab olema suurem või võrdne",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Väärtus peab olema väiksem või võrdne",
       "TIMEOUT_REQUIRED": "Kohustuslik väli",
-      "AUTOCREATE_FIELD_REQUIRED": "Kohustuslik väli"
+      "AUTOCREATE_FIELD_REQUIRED": "Kohustuslik väli",
+      "CHANNEL_REQUIRED": "Kohustuslik väli",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignoreeri helistaja kontakti ID väli on kohustuslik"
     },
     "HOST": "Host",
     "SECRET": "Secret",
@@ -158,7 +160,9 @@
       "SCRIPT": "Sisestage skript",
       "SCRIPT_INFO": "Sisestage skripti kirjeldus",
       "SCRIPT_TYPE": "Sisestage skripti tüpoloogia (nt curl, bash ...)",
-      "TIMEOUT": "Taotle sekundit sekundit. Väärtus peab olema vahemikus 1–10 ja vaikeväärtus 5."
+      "TIMEOUT": "Taotle sekundit sekundit. Väärtus peab olema vahemikus 1–10 ja vaikeväärtus 5.",
+      "MANAGED": "Lõpetatud interaktsioonide koguarv",
+      "OPENED": "Aktiivsete interaktsioonide koguarv"
     },
     "EDIT_TRUNK": "Edit Trunk",
     "DELETE_TRUNK": "Delete Trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Teise taseme korraldus",
     "SELECT_LEVEL": "Valige tase",
     "TITLEFONTSIZE": "Fondi pealkirja suurus",
-    "ADD_CONTACTITEMTYPE": "Lisama",
-    "CONTACTITEMTYPE": "Kontaktüksuste tüübid",
-    "NEW_CONTACTITEMTYPE": "Uus kontaktüksuse tüüp",
-    "ORDER_BY": "Telli",
-    "RGBBACKGROUNDCOLOR": "RGB taustavärv"
+    "EMAIL": "E -post",
+    "FILTERCHATWEBSITES": "Filtreeri vestluse veebisaite",
+    "FILTEREMAILACCOUNTS": "E -posti kontode filtreerimine",
+    "FILTERFAXACCOUNTS": "Faksikontode filtreerimine",
+    "FILTEROPENCHANNELACCOUNTS": "Filtreerige OpenChanneli kontosid",
+    "FILTERSMSACCOUNTS": "Sms -kontode filtreerimine",
+    "FILTERWHATSAPPACCOUNTS": "Filtreerige Whatsappi kontosid",
+    "MANAGED": "Hallatud",
+    "MANAGED_TEXT": "Hallatud interaktsioonid",
+    "OPENED": "Avatud",
+    "OPENED_TEXT": "Avatud interaktsioonid",
+    "IGNOREDIALERCONTACTID": "Ignoreeri helistaja kontakti ID",
+    "MAIL_SUBSTATUS": "Meili alamolek"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/fa.json b/public/app/main/apps/tools/i18n/fa.json
index 578dada..6c7d652 100644
--- a/public/app/main/apps/tools/i18n/fa.json
+++ b/public/app/main/apps/tools/i18n/fa.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "مقدار باید بیشتر یا مساوی باشد",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "مقدار باید کمتر از یا مساوی باشد",
       "TIMEOUT_REQUIRED": "زمینه اجباری",
-      "AUTOCREATE_FIELD_REQUIRED": "زمینه اجباری"
+      "AUTOCREATE_FIELD_REQUIRED": "زمینه اجباری",
+      "CHANNEL_REQUIRED": "زمینه اجباری",
+      "IGNOREDIALERCONTACTID_REQUIRED": "نادیده گرفتن قسمت شناسه تماس با شماره گیر الزامی است"
     },
     "HOST": "کشور میزبان",
     "SECRET": "راز",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "توضیحی را برای فیلمنامه درج کنید",
       "SCRIPT_TYPE": "برای اسکریپت یک نوع شناسی درج کنید (به عنوان مثال ، حلقه ، خط ...)",
       "HEADERS": "توجه: بخش هدرها باید با فرمت RAW JSON باشد {\"key\": \"مقدار\"}\nتوجه: در صورت عدم تکمیل ، مقدار پیش فرض ارسال می شود",
-      "TIMEOUT": "ثانیه را درخواست کنید مقدار باید بین 1 تا 10 باشد و مقدار پیش فرض 5 است."
+      "TIMEOUT": "ثانیه را درخواست کنید مقدار باید بین 1 تا 10 باشد و مقدار پیش فرض 5 است.",
+      "MANAGED": "تعداد کل تعاملات تکمیل شده",
+      "OPENED": "تعداد کل فعل و انفعالات فعال"
     },
     "EDIT_TRUNK": "ویرایش تنه",
     "DELETE_TRUNK": "تنه را حذف کنید",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "دفع سطح دوم",
     "SELECT_LEVEL": "یک سطح را انتخاب کنید",
     "TITLEFONTSIZE": "اندازه عنوان قلم",
-    "ADD_CONTACTITEMTYPE": "اضافه کردن",
-    "CONTACTITEMTYPE": "تماس با انواع آیتم ها",
-    "NEW_CONTACTITEMTYPE": "نوع مورد مخاطب جدید",
-    "ORDER_BY": "سفارش توسط",
-    "RGBBACKGROUNDCOLOR": "رنگ پس زمینه RGB"
+    "EMAIL": "پست الکترونیک",
+    "FILTERCHATWEBSITES": "وب سایت های چت را فیلتر کنید",
+    "FILTEREMAILACCOUNTS": "فیلتر کردن حساب های ایمیل",
+    "FILTERFAXACCOUNTS": "فیلتر کردن حسابهای فکس",
+    "FILTEROPENCHANNELACCOUNTS": "فیلتر کردن حسابهای OpenChannel",
+    "FILTERSMSACCOUNTS": "فیلتر کردن حساب های اس ام اس",
+    "FILTERWHATSAPPACCOUNTS": "حساب های Whatsapp را فیلتر کنید",
+    "MANAGED": "اداره می شود",
+    "MANAGED_TEXT": "تعاملات مدیریت شده",
+    "OPENED": "باز شد",
+    "OPENED_TEXT": "تعاملات باز شده",
+    "IGNOREDIALERCONTACTID": "نادیده گرفتن شناسه تماس شماره گیر",
+    "MAIL_SUBSTATUS": "وضعیت فرعی ایمیل"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/fi.json b/public/app/main/apps/tools/i18n/fi.json
index abd8a37..8e33dcc 100644
--- a/public/app/main/apps/tools/i18n/fi.json
+++ b/public/app/main/apps/tools/i18n/fi.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Arvon on oltava suurempi tai yhtä suuri kuin",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Arvon on oltava pienempi tai yhtä suuri kuin",
       "TIMEOUT_REQUIRED": "Pakollinen kenttä",
-      "AUTOCREATE_FIELD_REQUIRED": "Pakollinen kenttä"
+      "AUTOCREATE_FIELD_REQUIRED": "Pakollinen kenttä",
+      "CHANNEL_REQUIRED": "Pakollinen kenttä",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ohita soittajan yhteyshenkilön tunnus -kenttä on pakollinen"
     },
     "HOST": "Host",
     "SECRET": "Salainen",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Lisää skriptin kuvaus",
       "SCRIPT_TYPE": "Lisää skriptin typologia (esim. Curl, bash ...)",
       "HEADERS": "Huomaa: Otsikkoosion on oltava RAW JSON -muodossa {\"avain\": \"arvo\"}\nHuomaa: Jos ole täytetty, oletusarvo lähetetään",
-      "TIMEOUT": "Pyydä aikakatkaisua sekunnissa. Arvon on oltava välillä 1–10 ja oletusarvo on 5."
+      "TIMEOUT": "Pyydä aikakatkaisua sekunnissa. Arvon on oltava välillä 1–10 ja oletusarvo on 5.",
+      "MANAGED": "Valmiiden vuorovaikutusten kokonaismäärä",
+      "OPENED": "Aktiivisten vuorovaikutusten kokonaismäärä"
     },
     "EDIT_TRUNK": "Muokkaa tavaratilaan",
     "DELETE_TRUNK": "Poista tavaratilaan",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Toisen tason sijoitus",
     "SELECT_LEVEL": "Valitse taso",
     "TITLEFONTSIZE": "Kirjasimen otsikon koko",
-    "ADD_CONTACTITEMTYPE": "Lisätä",
-    "CONTACTITEMTYPE": "Yhteystietojen tyypit",
-    "NEW_CONTACTITEMTYPE": "Uusi yhteyshenkilötyyppi",
-    "ORDER_BY": "Tilaa",
-    "RGBBACKGROUNDCOLOR": "RGB -taustaväri"
+    "EMAIL": "Sähköposti",
+    "FILTERCHATWEBSITES": "Suodata chat -verkkosivustot",
+    "FILTEREMAILACCOUNTS": "Suodata sähköpostitilit",
+    "FILTERFAXACCOUNTS": "Suodata faksitilit",
+    "FILTEROPENCHANNELACCOUNTS": "Suodata OpenChannel -tilit",
+    "FILTERSMSACCOUNTS": "Suodata tekstiviestit",
+    "FILTERWHATSAPPACCOUNTS": "Suodata Whatsapp -tilit",
+    "MANAGED": "Hallinnoitu",
+    "MANAGED_TEXT": "Hallitut vuorovaikutukset",
+    "OPENED": "Avattu",
+    "OPENED_TEXT": "Avatut vuorovaikutukset",
+    "IGNOREDIALERCONTACTID": "Ohita soittajan yhteystiedot",
+    "MAIL_SUBSTATUS": "Sähköpostin alitila"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/fr.json b/public/app/main/apps/tools/i18n/fr.json
index 368e973..d8daa83 100644
--- a/public/app/main/apps/tools/i18n/fr.json
+++ b/public/app/main/apps/tools/i18n/fr.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "La valeur doit être supérieure ou égale à",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "La valeur doit être inférieure ou égale à",
       "TIMEOUT_REQUIRED": "Champ obligatoire",
-      "AUTOCREATE_FIELD_REQUIRED": "Champ obligatoire"
+      "AUTOCREATE_FIELD_REQUIRED": "Champ obligatoire",
+      "CHANNEL_REQUIRED": "Champ obligatoire",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Le champ Ignorer le contact du numéroteur est requis"
     },
     "HOST": "Host",
     "SECRET": "Secret",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Insérez une description du script",
       "SCRIPT_TYPE": "Insérez une typologie pour le script (par exemple, curl, bash ...)",
       "HEADERS": "Remarque: la section des en-têtes doit être au format RAW JSON {\"clé\": \"valeur\"}\nRemarque: S'il n'est pas rempli, la valeur par défaut sera envoyée",
-      "TIMEOUT": "Délai d'expiration de la demande en secondes. La valeur doit être comprise entre 1 et 10 et la valeur par défaut est 5."
+      "TIMEOUT": "Délai d'expiration de la demande en secondes. La valeur doit être comprise entre 1 et 10 et la valeur par défaut est 5.",
+      "MANAGED": "Le nombre total d'interactions terminées",
+      "OPENED": "Le nombre total d'interactions actives"
     },
     "EDIT_TRUNK": "Tronc Modifier",
     "DELETE_TRUNK": "Supprimer Trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Disposition de deuxième niveau",
     "SELECT_LEVEL": "Sélectionnez un niveau",
     "TITLEFONTSIZE": "Taille du titre de la police",
-    "ADD_CONTACTITEMTYPE": "Ajouter",
-    "CONTACTITEMTYPE": "Types d'articles de contact",
-    "NEW_CONTACTITEMTYPE": "Nouveau type d'élément de contact",
-    "ORDER_BY": "Commandé par",
-    "RGBBACKGROUNDCOLOR": "Couleur d'arrière-plan RVB"
+    "EMAIL": "E-mail",
+    "FILTERCHATWEBSITES": "Filtrer les sites de chat",
+    "FILTEREMAILACCOUNTS": "Filtrer les comptes de messagerie",
+    "FILTERFAXACCOUNTS": "Filtrer les comptes de télécopie",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrer les comptes OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtrer les comptes SMS",
+    "FILTERWHATSAPPACCOUNTS": "Filtrer les comptes Whatsapp",
+    "MANAGED": "Géré",
+    "MANAGED_TEXT": "Interactions gérées",
+    "OPENED": "Ouvert",
+    "OPENED_TEXT": "Interactions ouvertes",
+    "IGNOREDIALERCONTACTID": "Ignorer l'identifiant du contact du numéroteur",
+    "MAIL_SUBSTATUS": "Sous-statut de l'e-mail"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/he.json b/public/app/main/apps/tools/i18n/he.json
index 9607b40..638244e 100644
--- a/public/app/main/apps/tools/i18n/he.json
+++ b/public/app/main/apps/tools/i18n/he.json
@@ -113,7 +113,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "הערך חייב להיות גדול או שווה לו",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "הערך חייב להיות פחות או שווה ל",
       "TIMEOUT_REQUIRED": "שדה חובה",
-      "AUTOCREATE_FIELD_REQUIRED": "שדה חובה"
+      "AUTOCREATE_FIELD_REQUIRED": "שדה חובה",
+      "CHANNEL_REQUIRED": "שדה חובה",
+      "IGNOREDIALERCONTACTID_REQUIRED": "נדרש שדה התעלם מזהה איש קשר חייגן"
     },
     "HOST": "מארח",
     "SECRET": "סוד",
@@ -158,7 +160,9 @@
       "SCRIPT_INFO": "הוסף תיאור לתסריט",
       "SCRIPT_TYPE": "הוסף טיפולוגיה לתסריט (למשל תלתל, bash ...)",
       "HEADERS": "הערה: קטע הכותרות חייב להיות בפורמט RAW JSON {\"key\": \"value\"}\nהערה: אם לא מולא, ערך ברירת המחדל יישלח",
-      "TIMEOUT": "בקש פסק זמן בשניות. הערך חייב להיות בין 1 ל -10 וערך ברירת המחדל הוא 5."
+      "TIMEOUT": "בקש פסק זמן בשניות. הערך חייב להיות בין 1 ל -10 וערך ברירת המחדל הוא 5.",
+      "MANAGED": "המספר הכולל של אינטראקציות שהושלמו",
+      "OPENED": "המספר הכולל של אינטראקציות פעילות"
     },
     "EDIT_TRUNK": "ערוך קו ראשי",
     "DELETE_TRUNK": "מחק קו ראשי",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "נטייה בדרגה שנייה",
     "SELECT_LEVEL": "בחר רמה",
     "TITLEFONTSIZE": "גודל כותרת הגופן",
-    "ADD_CONTACTITEMTYPE": "לְהוֹסִיף",
-    "CONTACTITEMTYPE": "סוגי פריטי איש קשר",
-    "NEW_CONTACTITEMTYPE": "סוג פריט איש קשר חדש",
-    "ORDER_BY": "מיין לפי",
-    "RGBBACKGROUNDCOLOR": "צבע רקע RGB"
+    "EMAIL": "אימייל",
+    "FILTERCHATWEBSITES": "סנן אתרי צ'אט",
+    "FILTEREMAILACCOUNTS": "סנן חשבונות דוא\"ל",
+    "FILTERFAXACCOUNTS": "סנן חשבונות פקס",
+    "FILTEROPENCHANNELACCOUNTS": "סנן חשבונות OpenChannel",
+    "FILTERSMSACCOUNTS": "סנן חשבונות SMS",
+    "FILTERWHATSAPPACCOUNTS": "סנן חשבונות וואטסאפ",
+    "MANAGED": "מנוהל",
+    "MANAGED_TEXT": "אינטראקציות מנוהלות",
+    "OPENED": "נפתח",
+    "OPENED_TEXT": "אינטראקציות פתוחות",
+    "IGNOREDIALERCONTACTID": "התעלם מזהה איש קשר חייגן",
+    "MAIL_SUBSTATUS": "תת סטטוס דוא\"ל"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/hi.json b/public/app/main/apps/tools/i18n/hi.json
index ce486cc..ec37b6f 100644
--- a/public/app/main/apps/tools/i18n/hi.json
+++ b/public/app/main/apps/tools/i18n/hi.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "मान इससे अधिक या उसके बराबर होना चाहिए",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "मान इससे कम या बराबर होना चाहिए",
       "TIMEOUT_REQUIRED": "आवश्यक स्थान",
-      "AUTOCREATE_FIELD_REQUIRED": "आवश्यक स्थान"
+      "AUTOCREATE_FIELD_REQUIRED": "आवश्यक स्थान",
+      "CHANNEL_REQUIRED": "आवश्यक स्थान",
+      "IGNOREDIALERCONTACTID_REQUIRED": "डायलर पर ध्यान न दें संपर्क आईडी फ़ील्ड आवश्यक है"
     },
     "HOST": "होस्ट",
     "SECRET": "गुप्त",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "स्क्रिप्ट के लिए विवरण डालें",
       "SCRIPT_TYPE": "स्क्रिप्ट के लिए एक टाइपोलॉजी डालें (जैसे। कर्ल, बैश ...)",
       "HEADERS": "नोट: हेडर्स खंड रॉ JSON प्रारूप में होना चाहिए {\"key\": \"value\"}\nनोट: यदि नहीं भरा गया है, तो डिफ़ॉल्ट मान भेजा जाएगा",
-      "TIMEOUT": "सेकंड में टाइमआउट का अनुरोध करें। मान 1 और 10 के बीच होना चाहिए और डिफ़ॉल्ट मान 5 है।"
+      "TIMEOUT": "सेकंड में टाइमआउट का अनुरोध करें। मान 1 और 10 के बीच होना चाहिए और डिफ़ॉल्ट मान 5 है।",
+      "MANAGED": "पूर्ण किए गए इंटरैक्शन की कुल संख्या",
+      "OPENED": "सक्रिय इंटरैक्शन की कुल संख्या"
     },
     "EDIT_TRUNK": "सूंड संपादित करें",
     "DELETE_TRUNK": "सूंड हटाएं",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "दूसरा स्तर विवाद",
     "SELECT_LEVEL": "एक स्तर चुनें",
     "TITLEFONTSIZE": "फ़ॉन्ट शीर्षक आकार",
-    "ADD_CONTACTITEMTYPE": "जोड़ें",
-    "CONTACTITEMTYPE": "संपर्क आइटम प्रकार",
-    "NEW_CONTACTITEMTYPE": "नया संपर्क आइटम प्रकार",
-    "ORDER_BY": "द्वारा आदेश",
-    "RGBBACKGROUNDCOLOR": "आरजीबी पृष्ठभूमि रंग"
+    "EMAIL": "ईमेल",
+    "FILTERCHATWEBSITES": "चैट वेबसाइटों को फ़िल्टर करें",
+    "FILTEREMAILACCOUNTS": "ईमेल खातों को फ़िल्टर करें",
+    "FILTERFAXACCOUNTS": "फ़ैक्स खाते फ़िल्टर करें",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannel खातों को फ़िल्टर करें",
+    "FILTERSMSACCOUNTS": "एसएमएस खातों को फ़िल्टर करें",
+    "FILTERWHATSAPPACCOUNTS": "व्हाट्सएप खातों को फ़िल्टर करें",
+    "MANAGED": "प्रबंधित",
+    "MANAGED_TEXT": "प्रबंधित इंटरैक्शन",
+    "OPENED": "खुल गया",
+    "OPENED_TEXT": "खुली बातचीत",
+    "IGNOREDIALERCONTACTID": "डायलर संपर्क आईडी पर ध्यान न दें",
+    "MAIL_SUBSTATUS": "ईमेल सबस्टैटस"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/hu.json b/public/app/main/apps/tools/i18n/hu.json
new file mode 100644
index 0000000..6308cde
--- /dev/null
+++ b/public/app/main/apps/tools/i18n/hu.json
@@ -0,0 +1,505 @@
+{
+  "TOOLS": {
+    "VIDEOSUPPORT": "Video support",
+    "PREVIOUSCONTACT": "Previous",
+    "BOT": "Voicebot",
+    "CLONE_TRUNK": "Clone Trunk",
+    "DISPOSITIONS": "Dispositions",
+    "NEW_DISPOSITION": "New Disposition",
+    "ADD_DISPOSITION": "Add Disposition",
+    "EDIT_DISPOSITION": "Edit Disposition",
+    "DELETE_DISPOSITION": "Delete Disposition",
+    "RUN_SCHEDULE": "Run schedule",
+    "SENDIFEMPTY": "Send if empty",
+    "NEXTCONTACT": "Next",
+    "OUTBOUND_ROUTE": "Outbound Route",
+    "EDIT_DASHBOARDITEM": "Edit Dashboard Widget",
+    "FONTSIZE": "Font Size",
+    "TITLEFONTSIZE": "Font Title Size",
+    "CLONE_CUSTOMDASHBOARD": "Clone Custom Dashboard",
+    "LINK": "Link [https://]",
+    "BACKGROUND": "Background",
+    "FOREGROUND": "Foreground",
+    "IGNOREDIALERCONTACTID": "Ignore dialer contact Id",
+    "NONE": "None",
+    "TOTAL": "Total",
+    "ABANDONED": "Abandoned",
+    "WAITING": "Waiting",
+    "TALKING": "Talking",
+    "ANSWERED": "Answered",
+    "UNMANAGED": "Unmanaged",
+    "CUSTOMTYPE": "Custom [path]",
+    "WEBREPORT": "Web Report",
+    "PIECHART": "Pie Chart",
+    "MULTIBARCHART": "Multibar Chart",
+    "MOVE_WIDGET": "Move Widget",
+    "USERADD_CUSTOMDASHBOARD": "Add User Permissions",
+    "GOTODASHBOARD_CUSTOMDASHBOARD": "Go to preview dashboard",
+    "GOTO_CUSTOMDASHBOARD": "Go to preview dashboard",
+    "METRIC": "Metric",
+    "FILTERVOICEQUEUES": "Filter Voice Queues",
+    "SERIE1": "Serie 1",
+    "SERIE2": "Serie 2",
+    "SERIE3": "Serie 3",
+    "REFRESH": "Refresh [s]",
+    "FORMAT": "Format",
+    "PATH": "Absolute Path",
+    "ALL_USERS": "All Users",
+    "SELECTED_USERS": "Selected Users",
+    "ADD_WIDGET": "Add Widget",
+    "COLOR": "Color",
+    "FAX": "Fax",
+    "INTERACTION": "Interaction",
+    "MESSAGE": "Message",
+    "T38PT_UDPTL": "T38pt Udptl",
+    "CALL": "Call",
+    "NAME": "Name",
+    "TRUNKS": "Trunks",
+    "SEARCH_FOR_ANYONE": "Search",
+    "SCRIPT": "Script",
+    "SCRIPT_INFO": "Info",
+    "SCRIPT_TYPE": "Type",
+    "ERRORS": {
+      "INFO_REQUIRED": "Mandatory field",
+      "SCRIPT_REQUIRED": "Mandatory field",
+      "NAME_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "TITLE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "REFRESH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "REFRESH_REQUIRED": "Mandatory field",
+      "FONTSIZE_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "FONTSIZE_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "FONTSIZE_REQUIRED": "Mandatory field",
+      "PATH_REQUIRED": "Mandatory field",
+      "FORMAT_REQUIRED": "Mandatory field",
+      "REPORT_REQUIRED": "Mandatory field",
+      "TYPE_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "ACCOUNT_REQUIRED": "Mandatory field",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignore dialer contact Id field is required",
+      "FIELD_REQUIRED": "Mandatory field",
+      "NAME_REQUIRED": "Mandatory field",
+      "HOST_REQUIRED": "Mandatory field",
+      "DEFAULTUSER_REQUIRED": "Mandatory field",
+      "CALLERID_REQUIRED": "Mandatory field",
+      "KEY_REQUIRED": "Mandatory field",
+      "CONFIRM_NOT_MATCH": "The Passwords don't match",
+      "VALIDITYSTART_REQUIRED": "Mandatory field",
+      "VALIDITYEND_REQUIRED": "Mandatory field",
+      "MONTHDAY_REQUIRED": "Mandatory field",
+      "HOUR_REQUIRED": "Mandatory field",
+      "CONTENT_REQUIRED": "Mandatory field",
+      "URL_REQUIRED": "Mandatory field",
+      "URL_MUST_VALID_URL": "Wrong format",
+      "APPLICATION_REQUIRED": "Mandatory field",
+      "ARGUMENTS_REQUIRED": "Mandatory field",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "POLLING_INTERVAL_REQUIRED": "Mandatory field",
+      "TITLE_REQUIRED": "Mandatory field",
+      "EMAILADDRESS_REQUIRED": "Mandatory field",
+      "EVENTVARIABLES_REQUIRED": "Mandatory field",
+      "INTEGRATION_REQUIRED": "Mandatory field",
+      "LIST_REQUIRED": "Mandatory field",
+      "TEMPLATE_REQUIRED": "Mandatory field",
+      "AUTOCREATECONTACT_REQUIRED": "Mandatory field",
+      "AUTOCREATE_FIELD_REQUIRED": "Mandatory field",
+      "OUTBOUNDROUTE_REQUIRED": "Mandatory field",
+      "QUEUE_REQUIRED": "Mandatory field",
+      "TIME_RANGE_TO_REQUIRED": "Mandatory field",
+      "WEEK_DAYS_TO_REQUIRED": "Mandatory field",
+      "MONTH_DAYS_TO_REQUIRED": "Mandatory field",
+      "MONTH_TO_REQUIRED": "Mandatory field",
+      "TIME_RANGE_FROM_INVALID": "Wrong Format",
+      "TIME_RANGE_TO_INVALID": "Wrong Format",
+      "ACTION_REQUIRED": "Mandatory field",
+      "CONFIGURATION_REQUIRED": "Mandatory field",
+      "PROJECT_REQUIRED": "Mandatory field",
+      "LOCATION_REQUIRED": "Mandatory field",
+      "OUTPUT_REQUIRED": "Mandatory field",
+      "REPORTTYPE_REQUIRED": "Mandatory field",
+      "REPORTFOLDER_REQUIRED": "Mandatory field",
+      "REPORTSUBFOLDER_REQUIRED": "Mandatory field",
+      "AGENT_REQUIRED": "Mandatory field",
+      "TIMEOUT_REQUIRED": "Mandatory field",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to"
+    },
+    "HOST": "Host",
+    "SECRET": "Secret",
+    "DEFAULTUSER": "Default User",
+    "DESCRIPTION": "Description",
+    "ADD_TRUNK": "Add Trunk",
+    "HELP": {
+      "SCRIPT_INFO": "Insert a description for the script",
+      "SCRIPT_TYPE": "Insert a typology for the script (eg. curl, bash...)",
+      "INFO": "Insert title",
+      "SCRIPT": "Insert script",
+      "T38PT_UDPTL": "Es: yes,redundancy,maxdatagram=400",
+      "SECRET": "Authentication password",
+      "HOST": "The domain or host name",
+      "DEFAULTUSER": "Authentication username",
+      "CALLERID": "The Caller ID, in the format \"name\" <number>",
+      "REGISTRY": "The registry string, if required by provider, usually defaultuser:secret@host",
+      "FROMDOMAIN": "Set default From:domain in SIP messages when acting as a SIP ua (client). Some destinations may require mandatory identity name instead of only the IP address",
+      "FROMUSER": "How your provider knows you. This is which user to put instead of callerid when placing calls to peer (another SIP proxy). Valid only for type=peer.",
+      "OUTBOUNDPROXY": "IP_address or DNS SRV name (excluding the _sip._udp prefix): SRV name, hostname, or IP address of the outbound SIP Proxy. Send outbound signaling to this proxy, not directly to the devices. Valid only for type=peer.",
+      "PORT": "The SIP port number",
+      "CONTEXT": "The context for the trunk",
+      "TYPE": "Determine the SIP role within asterisk. User: used to authenticate incoming - Peer: for outgoing calls - Friend: covers both characteristics of the above.",
+      "DTMFMODE": "How DTMF (Dual-Tone Multi-Frequency) are sent. RFC2833: the default mode, the DTMF are sent with RTP but outside the audio stream. INBAND: The DTMF is sent in audio stream of the current conversation, becoming audible from the speakers. Requires a high CPU load. INFO: Although this method is very reliable, it is not supported by all PBX devices and many SIP Trunks.",
+      "NAT": "Change the behaviour of Asterisk for clients behind a firewall. If any of the comma-separated options is 'no', Asterisk will ignore any other settings and set nat=no.",
+      "QUALIFY": "Determine when the SIP is achievable",
+      "ALLOWCODECS": "Allowed codecs in order of preference",
+      "INSECURE": "Specify how to handle connections with peer, allowing insecure settings",
+      "CALL_LIMIT": "The limit number of the inbound and outbound concurrent calls",
+      "DIRECTMEDIA": "Asterisk by default tries to redirect the RTP media stream to go directly from the caller to the callee. Some devices do not support this (especially if one of them is behind a NAT). The default setting is YES. If you have all clients behind a NAT, or for some other reason want Asterisk to stay in the audio path, you may want to turn this off.",
+      "CALLCOUNTER": "Enable call counters on devices",
+      "ADD_PHONE_TO_URI": "Define if the provider requires ';user=phone' on URL",
+      "TRUST_REMOTE_PARTY_ID": "Define if Remote-Party-ID should be trusted",
+      "SEND_REMOTE_PARTY_ID_HEADER": "Define if Remote-Party-ID should be sent (defaults is no)",
+      "ENCRYPTION": "Whether to offer SRTP encrypted media (and only SRTP encrypted media) on outgoing calls to a peer. Calls will fail with HANGUPCAUSE=58 if the peer does not support SRTP. Defaults value is No",
+      "TRANSPORT": "Set the default transports, in order of preference",
+      "OTHERFIELDS": "Other fields to add in the trunks conf files. Follow default asterisk format (key=value), each field on a single row",
+      "EMAILADDRESS": "Add one or multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "EMAILCCADDRESS": "Add one or multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "EMAILBCCADDRESS": "Add one or multiple addresses separated by commas (e.g. [email-masked], [email-masked])",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "EVENTVARIABLES": "If enabled, it adds all the event variables to the url (recommended value=No. Set to Yes only for evaluation purposes) ",
+      "HEADERS": "Note: Headers section must be in RAW JSON format {\"key\":\"value\"} \nNote: If not filled out, the default value will be sent",
+      "BODY": "Note: the body must be in RAW JSON format {\"key\":\"value\"} \nNote: If not filled out, the default value will be sent",
+      "TIMEOUT": "Request timeout in seconds. The value must be between 1 and 10 and the default value is 5."
+    },
+    "EDIT_TRUNK": "Edit Trunk",
+    "DELETE_TRUNK": "Delete Trunk",
+    "CREATED_AT": "Created At",
+    "SETTINGS": "Settings",
+    "ADVANCED": "Advanced",
+    "OTHER": "Other",
+    "ACTIVE": "Active",
+    "CONTEXT": "Context",
+    "CALLERID": "Caller ID",
+    "TYPE": "Type",
+    "DTMFMODE": "DTMF Mode",
+    "NAT": "NAT",
+    "QUALIFY": "Qualify",
+    "ALLOWCODECS": "Allowed Codecs",
+    "INSECURE": "Insecure",
+    "REGISTRY": "Registry",
+    "DIRECTMEDIA": "Direct Media",
+    "CALLCOUNTER": "Call Counter",
+    "FROMDOMAIN": "From Domain",
+    "FROMUSER": "From User",
+    "OUTBOUNDPROXY": "Outbound Proxy",
+    "ADD_PHONE_TO_URI": "Add Phone to URL",
+    "TRUST_REMOTE_PARTY_ID": "Trust Remote Party ID",
+    "SEND_REMOTE_PARTY_ID_HEADER": "Send Remote Party ID Header",
+    "ENCRYPTION": "Encryption",
+    "PORT": "Port",
+    "TRANSPORT": "Transport",
+    "SAVE": "Save",
+    "VARIABLES": "Variables",
+    "ADD_VARIABLE": "Add Variable",
+    "EDIT_VARIABLE": "Edit Variable",
+    "DELETE_VARIABLE": "Delete Variable",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "TAGS": "Tags",
+    "ADD_TAG": "Add Tag",
+    "EDIT_TAG": "Edit Tag",
+    "DELETE_TAG": "Delete Tag",
+    "PAUSES": "Pauses",
+    "ADD_PAUSE": "Add Pause",
+    "EDIT_PAUSE": "Edit Pause",
+    "DELETE_PAUSE": "Delete Pause",
+    "CANNEDANSWERS": "Canned Answers",
+    "ADD_CANNEDANSWER": "Add Canned Answer",
+    "EDIT_CANNEDANSWER": "Edit Canned Answer",
+    "DELETE_CANNEDANSWER": "Delete Canned Answer",
+    "KEY": "Key",
+    "VALUE": "Value",
+    "SOUNDS": "Sounds",
+    "EDIT_SOUND": "Edit Sound",
+    "DELETE_SOUND": "Delete Sound",
+    "CANCEL": "Cancel",
+    "FINISH": "Finish",
+    "DROP_TO_UPLOAD": "Drop To Upload",
+    "UPLOADING": "Uploading",
+    "TRIGGERS": "Triggers",
+    "EDIT_TRIGGER": "Edit Trigger",
+    "DELETE_TRIGGER": "Delete Trigger",
+    "ADD_TRIGGER": "Add Trigger",
+    "DELETE": "Delete",
+    "AUTOMATIONS": "Automations",
+    "EDIT_AUTOMATION": "Edit Automation",
+    "DELETE_AUTOMATION": "Delete Automation",
+    "ADD_AUTOMATION": "Add Automation",
+    "INTERVALS": "Intervals",
+    "EDIT_INTERVAL": "Edit Interval",
+    "DELETE_INTERVAL": "Delete Interval",
+    "ADD_INTERVAL": "Add Interval",
+    "TOOLS": "Tools",
+    "ID": "Id",
+    "AUDIO": "Audio",
+    "DOWNLOAD_SOUND": "Download Sound",
+    "UPLOAD_SOUND": "Tools",
+    "CHANNEL": "Channel",
+    "NEW_TRIGGER": "New Trigger",
+    "GENERAL": "General",
+    "STATUS": "Status",
+    "CONDITIONS&ACTIONS": "Conditions & Actions",
+    "ALLCONDITIONS": "Meet all these conditions:",
+    "ANYCONDITIONS": "Meet any of these conditions:",
+    "ACTIONS": "Actions:",
+    "NEW_AUTOMATION": "New Automation",
+    "TIMEOUT": "Timeout",
+    "PEERSTATUS": "Peer Status",
+    "CALL_LIMIT": "Calls Limit",
+    "OTHERFIELDS": "Other Fields",
+    "NEW_VARIABLE": "New Variable",
+    "NEW_TAG": "New Tag",
+    "NEW_PAUSE": "New Pause",
+    "NEW_CANNEDANSWER": "New Canned Answer",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "NEW_TRUNK": "New Trunk",
+    "FROM": "From",
+    "TO": "To",
+    "WEEKDAY": "Week Day",
+    "MONTHDAY": "Month Day",
+    "MONTH": "Month",
+    "ALWAYS": "Always",
+    "MON": "Monday",
+    "TUE": "Tuesday",
+    "WED": "Wednesday",
+    "THU": "Thursday",
+    "FRI": "Friday",
+    "SAT": "Saturday",
+    "SUN": "Sunday",
+    "JAN": "January",
+    "FEB": "February",
+    "MAR": "March",
+    "APR": "April",
+    "MAY": "May",
+    "JUN": "June",
+    "JUL": "July",
+    "AUG": "August",
+    "SEP": "September",
+    "OCT": "October",
+    "NOV": "November",
+    "DEC": "December",
+    "PASSWORD": "Password",
+    "CUSTOMDASHBOARDS": "Custom Dashboards",
+    "NEW_CUSTOMDASHBOARD": "New Custom Dashboard",
+    "ADD_CUSTOMDASHBOARD": "Add Custom Dashboard",
+    "EDIT_CUSTOMDASHBOARD": "Edit Custom Dashboard",
+    "DELETE_CUSTOMDASHBOARD": "Delete Custom Dashboard",
+    "SCHEDULER": "Scheduler",
+    "NEW_SCHEDULE": "New Schedule",
+    "ADD_SCHEDULE": "Add Schedule",
+    "EDIT_SCHEDULE": "Edit Schedule",
+    "DELETE_SCHEDULE": "Delete Schedule",
+    "SENDMAIL": "Send Email",
+    "CONFIGURATION": "Configuration",
+    "MAIL": "Email",
+    "REPORTTYPE": "Report Type",
+    "REPORT": "Report",
+    "OUTPUT": "Output",
+    "EXECUTEON": "Execute On",
+    "REPORTRANGE": "Report Range",
+    "VALIDITYSTART": "Start Time",
+    "VALIDITYEND": "End Time",
+    "EXECUTEEVERY": "Execute every",
+    "ACCOUNT": "Account",
+    "EMAILADDRESS": "Email Address",
+    "EMAILCCADDRESS": "Cc",
+    "EMAILBCCADDRESS": "Bcc",
+    "CURRENTDAY": "Current Day",
+    "DAILY": "Daily",
+    "WEEKLY": "Weekly",
+    "MONTHLY": "Monthly",
+    "PREVIOUS_DAY": "Previous Day",
+    "LAST_SEVEN_DAYS": "Last Seven Days",
+    "LAST_THIRTY_DAYS": "Last Thirthy Days",
+    "LAST_MONTH": "Last Month",
+    "WEEKDAYS": "Week Days",
+    "HOUR": "Hour",
+    "DEFAULT": "Default",
+    "CSV": "CSV",
+    "PDF": "PDF",
+    "15MIN": "15 minutes",
+    "30MIN": "30 minutes",
+    "1H": "1 hour",
+    "VOICE": "Voice",
+    "CHAT": "Chat",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Open Channel",
+    "TEMPLATES": "Templates",
+    "EDIT_TEMPLATE": "Edit Template",
+    "DELETE_TEMPLATE": "Delete Template",
+    "NEW_TEMPLATE": "New Template",
+    "ADD_TEMPLATE": "Add Template",
+    "CONTENT": "Content",
+    "FIELD": "Field",
+    "NO_ANYCONDITION_AVAILABLE": "No Conditions available",
+    "NO_ALLCONDITION_AVAILABLE": "No Conditions available",
+    "NO_ACTION_AVAILABLE": "No Actions available",
+    "ACTION": "Action",
+    "EDIT_ANYCONDITION": "Edit Condition",
+    "DELETE_ANYCONDITION": "Delete Condition",
+    "NEW_ANYCONDITION": "New Condition",
+    "ADD_ANYCONDITION": "Add Condition",
+    "EDIT_ALLCONDITION": "Edit Condition",
+    "DELETE_ALLCONDITION": "Delete Condition",
+    "NEW_ALLCONDITION": "New Condition",
+    "ADD_ALLCONDITION": "Add Condition",
+    "EDIT_ACTION": "Edit Action",
+    "DELETE_ACTION": "Delete Action",
+    "NEW_ACTION": "New Action",
+    "ADD_ACTION": "Add Action",
+    "QUEUE": "Queue",
+    "CALL_STATUS": "Call Status",
+    "OUTBOUNDROUTE": "Outbound Route",
+    "MAIL_SUBSTATUS": "Email Substatus",
+    "EQUALS": "Equals",
+    "NOT_EQUALS": "Not Equals",
+    "CONTACT_MANAGER": "Contacts Manager",
+    "INTEGRATIONS": "Integrations",
+    "MOTIONBAR": "Motion Bar",
+    "JSCRIPTY": "Jscripty",
+    "URL_FORWARD": "URL Forward",
+    "WEB_POPUP": "Web Popup",
+    "LIST": "List",
+    "INTEGRATION": "Integration",
+    "TEMPLATE": "Template",
+    "URL": "URL",
+    "APPLICATION": "Application",
+    "ARGUMENTS": "Arguments",
+    "NO_APPS_AVAILABLE": "No applications available",
+    "NEW_INTERVAL": "New Interval",
+    "OPERATOR": "Operator",
+    "NO_INTERVALS_AVAILABLE": "No intervals available",
+    "YES": "Yes",
+    "NO": "No",
+    "SUBJECT": "Subject",
+    "NO_AVAILABLE_INFO": "No available info",
+    "BROWSER": "Browser",
+    "INTERVAL": "Interval",
+    "INFO": "Info",
+    "TIME_RANGE": "Time Range",
+    "WEEK_DAYS": "Week Days",
+    "MONTH_DAYS": "Month Days",
+    "MONTHS": "Months",
+    "DROP_TO_UPLOAD_MESSAGE": "Drop audio files here to upload. Only MP3, WAV, GSM - Max. 15MB",
+    "POLLING_INTERVAL": "Polling Interval (seconds)",
+    "DASHBOARD": "Dashboard",
+    "NEW_DASHBOARDITEM": "New Dashboard Widget",
+    "COUNTER": "Counter",
+    "IFRAME": "IFrame",
+    "CLOCK": "Clock",
+    "ADD_DASHBOARDITEM": "Add Dashboard Widget",
+    "EDIT_WIDGET": "Edit Widget",
+    "DELETE_WIDGET": "Delete Widget",
+    "FLIP_WIDGET": "Flip Widget",
+    "TITLE": "Title",
+    "UPDATE": "Update",
+    "LAYOUT": "Layout",
+    "BACKGROUND_COLOR": "Background Color",
+    "FOREGROUND_COLOR": "Foreground Color",
+    "FOREGROUND_TITLE_COLOR": "Foreground Title Color",
+    "THEME": "Theme",
+    "LIGHT": "Light",
+    "DARK": "Dark",
+    "TIMEZONE": "TimeZone",
+    "DIGITAL_FORMAT": "Digital Date Format",
+    "TOOLS_QUERY": "Query",
+    "SELECT": "Select",
+    "WHERE": "Where",
+    "BACK": "Back",
+    "PROJECT": "Project",
+    "GOTOREALTIME_TRUNK": "Go To Realtime Trunk",
+    "GOTO_TRUNK": "Go To Trunk",
+    "CRON": "Cron",
+    "MINUTES": "Minutes",
+    "HOURLY": "Hourly",
+    "YEARLY": "Yearly",
+    "EVERY": "Every",
+    "MINUTE": "Minute",
+    "ON_SECOND": "On second",
+    "HOUR_ON_MINUTE": "Hour on minute",
+    "AND_SECOND": "And second",
+    "DAY_AT": "Day at",
+    "START_TIME": "Start Time",
+    "ON_THE": "On the",
+    "OF_EVERY": "Of every",
+    "MONTH_AT": "Month at",
+    "AT": "At",
+    "LAST": "Last",
+    "LASTUNIT": "Unit",
+    "MAILACCOUNT": "Email Account",
+    "OF": "of",
+    "PAST_THE_HOUR": "Past the hour",
+    "DAY": "Day",
+    "WEEK": "Week",
+    "YEAR": "Year",
+    "ON": "On",
+    "PAI": "P-Asserted-Identity",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "EVENTVARIABLES": "Event Variables",
+    "AUTOCREATECONTACT": "Create contact automatically",
+    "LOCATION": "Location",
+    "NEW_TAB": "New Tab",
+    "NEW_WINDOW": "New Window",
+    "MOTION_TAB": "New Agent Dashboard Tab",
+    "WINDOWWIDTH": "Window Width(px)",
+    "WINDOWHEIGHT": "Window Height(px)",
+    "BODY": "Body",
+    "REPORTFOLDER": "Report Folder",
+    "REPORTSUBFOLDER": "Report Subfolder",
+    "AGENT": "Agent",
+    "HEADERS": "Headers",
+    "WHATSAPP": "WhatsApp Connector",
+    "LEVEL": "Level",
+    "NOTIFICATIONS": {
+      "DISPOSITION_CREATED_SUCCESS_TITLE": "Disposition successfully created",
+      "DISPOSITION_SAVED_SUCCESS_TITLE": "Disposition successfully saved",
+      "DISPOSITION_DELETE_TITLE": "Are you sure want to delete the disposition?",
+      "DISPOSITION_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "DISPOSITION_DELETE_MESSAGE_CHILDREN": "{{ name }} will be deleted with all its sub dispositions",
+      "DISPOSITION_DELETED_SUCCESS_TITLE": "Disposition successfully deleted",
+      "DISPOSITIONS_DELETE_TITLE": "Are you sure want to delete the selected dispositions?",
+      "DISPOSITIONS_DELETE_MESSAGE": "{{ total }} dispositions will be deleted",
+      "TRIGGER_CREATED_SUCCESS_TITLE": "Trigger successfully created",
+      "TRIGGER_SAVED_SUCCESS_TITLE": "Trigger successfully saved",
+      "TRIGGER_DELETE_TITLE": "Are you sure want to delete the trigger?",
+      "TRIGGER_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "TRIGGER_DELETED_SUCCESS_TITLE": "Trigger successfully deleted",
+      "TRIGGERS_DELETE_TITLE": "Are you sure want to delete the selected triggers?",
+      "TRIGGERS_DELETE_MESSAGE": "{{ total }} triggers will be deleted",
+      "TRIGGERS_DELETED_SUCCESS_TITLE": "Triggers successfully deleted",
+      "ACTION_CREATED_SUCCESS_TITLE": "Action successfully created",
+      "ACTION_SAVED_SUCCESS_TITLE": "Action successfully saved",
+      "ACTION_DELETE_TITLE": "Are you sure want to delete the action?",
+      "ACTION_DELETED_SUCCESS_TITLE": "Action successfully deleted",
+      "ACTIONS_DELETE_TITLE": "Are you sure want to delete the selected actions?",
+      "ACTIONS_DELETE_MESSAGE": "{{ total }} actions will be deleted",
+      "ACTIONS_DELETED_SUCCESS_TITLE": "Actions successfully deleted",
+      "CONDITION_CREATED_SUCCESS_TITLE": "Condition successfully created",
+      "CONDITION_SAVED_SUCCESS_TITLE": "Condition successfully saved",
+      "CONDITION_DELETE_TITLE": "Are you sure want to delete the condition?",
+      "CONDITION_DELETED_SUCCESS_TITLE": "Condition successfully deleted",
+      "CONDITIONS_DELETE_TITLE": "Are you sure want to delete the selected conditions?",
+      "CONDITIONS_DELETE_MESSAGE": "{{ total }} conditions will be deleted",
+      "CONDITIONS_DELETED_SUCCESS_TITLE": "Conditions successfully deleted"
+    },
+    "ALL_DISPOSITIONS": "All dispositions",
+    "SELECT_LEVEL": "Select a level",
+    "ALL": "All",
+    "FIRST_LEVEL_DISPOSITION": "First Level Disposition",
+    "SECOND_LEVEL_DISPOSITION": "Second Level Disposition",
+    "SEARCH_FIELDS": "Search fields",
+    "AUTOCREATE_FIELD": "Autocreate field",
+    "STANDARD": "Standard",
+    "GLOBALS": "Globals",
+    "MOTION_BAR": "Motion Bar"
+  }
+}
diff --git a/public/app/main/apps/tools/i18n/id.json b/public/app/main/apps/tools/i18n/id.json
index 4dec2c1..8c46af4 100644
--- a/public/app/main/apps/tools/i18n/id.json
+++ b/public/app/main/apps/tools/i18n/id.json
@@ -62,7 +62,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Nilai harus lebih besar dari atau sama dengan",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Nilai harus kurang dari atau sama dengan",
       "TIMEOUT_REQUIRED": "Bidang wajib",
-      "AUTOCREATE_FIELD_REQUIRED": "Bidang wajib"
+      "AUTOCREATE_FIELD_REQUIRED": "Bidang wajib",
+      "CHANNEL_REQUIRED": "Bidang wajib",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Abaikan bidang Id kontak dialer wajib diisi"
     },
     "HELP": {
       "ADD_PHONE_TO_URI": "Tentukan jika penyedia membutuhkan '; user = phone' di URL",
@@ -102,7 +104,9 @@
       "SCRIPT_INFO": "Masukkan deskripsi untuk skrip",
       "SCRIPT_TYPE": "Masukkan tipologi untuk skrip (mis. Ikal, bash ...)",
       "HEADERS": "Catatan: Bagian tajuk harus dalam format RAW JSON {\"key\": \"value\"}\nCatatan: Jika tidak diisi, nilai default akan dikirim",
-      "TIMEOUT": "Minta batas waktu dalam hitungan detik. Nilai harus antara 1 dan 10 dan nilai standarnya adalah 5."
+      "TIMEOUT": "Minta batas waktu dalam hitungan detik. Nilai harus antara 1 dan 10 dan nilai standarnya adalah 5.",
+      "MANAGED": "Jumlah total Interaksi yang Selesai",
+      "OPENED": "Jumlah total Interaksi Aktif"
     },
     "15MIN": "15 menit",
     "1H": "1 jam",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Disposisi Tingkat Kedua",
     "SELECT_LEVEL": "Pilih level",
     "TITLEFONTSIZE": "Ukuran Judul Font",
-    "ADD_CONTACTITEMTYPE": "Menambahkan",
-    "CONTACTITEMTYPE": "Jenis item kontak",
-    "NEW_CONTACTITEMTYPE": "Jenis item kontak baru",
-    "ORDER_BY": "Dipesan oleh",
-    "RGBBACKGROUNDCOLOR": "Warna Latar RGB"
+    "EMAIL": "Surel",
+    "FILTERCHATWEBSITES": "Filter Situs Web Obrolan",
+    "FILTEREMAILACCOUNTS": "Filter Akun Email",
+    "FILTERFAXACCOUNTS": "Filter Akun Faks",
+    "FILTEROPENCHANNELACCOUNTS": "Filter Akun OpenChannel",
+    "FILTERSMSACCOUNTS": "Filter Akun Sms",
+    "FILTERWHATSAPPACCOUNTS": "Filter Akun Whatsapp",
+    "MANAGED": "Dikelola",
+    "MANAGED_TEXT": "Interaksi Terkelola",
+    "OPENED": "dibuka",
+    "OPENED_TEXT": "Interaksi Terbuka",
+    "IGNOREDIALERCONTACTID": "Abaikan Id kontak dialer",
+    "MAIL_SUBSTATUS": "Substatus Email"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/it.json b/public/app/main/apps/tools/i18n/it.json
index 46679b6..5507b29 100644
--- a/public/app/main/apps/tools/i18n/it.json
+++ b/public/app/main/apps/tools/i18n/it.json
@@ -16,15 +16,13 @@
     "FONTSIZE": "Dimensione Font",
     "TITLEFONTSIZE": "Dimensione Font Titolo",
     "CLONE_CUSTOMDASHBOARD": "Clona Dashboard Personalizzata",
-    "ORDER_BY_NUMERIC":"Il campo Ordinamento deve essere numerico!",
     "LINK": "Link [https://]",
     "BACKGROUND": "Background",
     "FOREGROUND": "Foreground",
+    "IGNOREDIALERCONTACTID": "Ignora il contact Id del dialer",
     "NONE": "Nessuno",
     "TOTAL": "Totale",
     "ABANDONED": "Abbandonate",
-    "EDIT_CONTACTITEMTYPE": "Modifica tipo di contatto",
-    "DELETE_CONTACTITEMTYPE": "Elimina tipo di contatto",
     "WAITING": "In Attesa",
     "TALKING": "Attive",
     "ANSWERED": "Risposte",
@@ -59,7 +57,20 @@
     "SCRIPT": "Script",
     "SCRIPT_INFO": "Descrizione",
     "SCRIPT_TYPE": "Tipologia",
+    "EMAIL": "Email",
+    "FILTERFAXACCOUNTS": "Filtro Fax Accounts",
+    "FILTERSMSACCOUNTS": "Filtro Sms Accounts",
+    "FILTERCHATWEBSITES": "Filtro Chat Websites",
+    "FILTERWHATSAPPACCOUNTS": "Filtro Whatsapp Accounts",
+    "FILTEREMAILACCOUNTS": "Filtro Email Accounts",
+    "FILTEROPENCHANNELACCOUNTS": "Filtro OpenChannel Accounts",
+    "OPENED": "Aperte",
+    "OPENED_TEXT": "Interazioni Aperte",
+    "MANAGED": "Gestite",
+    "MANAGED_TEXT": "Interazioni Gestite",
     "ERRORS": {
+      "OPENED": "Il numero totale di interazioni attive in coda",
+      "MANAGED": "Il numero totale di interazioni gestite in coda",
       "INFO_REQUIRED": "Campo obbligatorio",
       "SCRIPT_REQUIRED": "Campo obbligatorio",
       "NAME_MAX_LENGTH": "Il valore deve avere una lunghezza massima pari a {{max}}",
@@ -101,6 +112,7 @@
       "TYPE_REQUIRED": "Campo obbligatorio",
       "VALUE_REQUIRED": "Campo obbligatorio",
       "ACCOUNT_REQUIRED": "Campo obbligatorio",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Campo obbligatorio",
       "FIELD_REQUIRED": "Campo obbligatorio",
       "TIME_RANGE_TO_REQUIRED": "Campo obbligatorio",
       "WEEK_DAYS_TO_REQUIRED": "Campo obbligatorio",
@@ -120,7 +132,8 @@
       "TITLE_MAX_LENGTH": "Il valore deve avere una lunghezza massima pari a {{max}}",
       "TIMEOUT_REQUIRED": "Campo obbligatorio",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Il valore introdotto deve essere inferiore o uguale a",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Il valore introdotto deve essere superiore o uguale a"
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Il valore introdotto deve essere superiore o uguale a",
+      "CHANNEL_REQUIRED": "Campo obbligatorio"
     },
     "HOST": "Host",
     "SECRET": "Secret",
@@ -165,7 +178,9 @@
       "EVENTVARIABLES": "Se abilitato, aggiunge tutte le variabili dell'evento all'url (Valore suggerito=No; Usare Yes solo per test valutativi)",
       "HEADERS": "Nota: sezione Headers deve essere scritta in formato RAW JSON {\"key\":\"value\"} \nNota: Se non compilato, verrà inviato il valore default",
       "BODY": "Nota: il body deve essere scritto in formato RAW JSON {\"key\":\"value\"} \nNota: Se non compilato, verrà inviato il valore default",
-      "TIMEOUT": "Timeout della richiesta in secondi. Il valore deve essere compreso tra 1 e 10 e il valore di default è 5."
+      "TIMEOUT": "Timeout della richiesta in secondi. Il valore deve essere compreso tra 1 e 10 e il valore di default è 5.",
+      "MANAGED": "Il numero totale di interazioni completate",
+      "OPENED": "Il numero totale di interazioni attive"
     },
     "EDIT_TRUNK": "Modifica Trunk",
     "DELETE_TRUNK": "Elimina Trunk",
@@ -357,6 +372,8 @@
     "QUEUE": "Coda",
     "CALL_STATUS": "Stato chiamata",
     "OUTBOUNDROUTE": "Rotta Outbound",
+    "MAIL_SUBSTATUS": "Sotto stato Email",
+    "OFFLINE_MESSAGE": "Messaggio offline",
     "EQUALS": "Uguale a",
     "NOT_EQUALS": "Diverso da",
     "CONTACT_MANAGER": "Manager Contatti",
@@ -500,11 +517,6 @@
     "AUTOCREATE_FIELD": "Campo autocreazione",
     "STANDARD": "Standard",
     "GLOBALS": "Globali",
-    "MOTION_BAR": "Motion Bar",
-    "ADD_CONTACTITEMTYPE": "Aggiungere",
-    "CONTACTITEMTYPE": "Tipi di elementi di contatto",
-    "NEW_CONTACTITEMTYPE": "Nuovo tipo di elemento di contatto",
-    "ORDER_BY": "Ordinato da",
-    "RGBBACKGROUNDCOLOR": "Colore di sfondo RGB"
+    "MOTION_BAR": "Motion Bar"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/ja.json b/public/app/main/apps/tools/i18n/ja.json
index 3e4064c..b36acc9 100644
--- a/public/app/main/apps/tools/i18n/ja.json
+++ b/public/app/main/apps/tools/i18n/ja.json
@@ -62,7 +62,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "値は以上でなければなりません",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "値は以下でなければなりません",
       "TIMEOUT_REQUIRED": "必須フィールド",
-      "AUTOCREATE_FIELD_REQUIRED": "必須フィールド"
+      "AUTOCREATE_FIELD_REQUIRED": "必須フィールド",
+      "CHANNEL_REQUIRED": "必須フィールド",
+      "IGNOREDIALERCONTACTID_REQUIRED": "ダイヤラーの連絡先IDフィールドを無視する必要があります"
     },
     "HELP": {
       "ADD_PHONE_TO_URI": "プロバイダーがURLに\";user=phone\"を要求するかどうかを定義します",
@@ -102,7 +104,9 @@
       "SCRIPT_INFO": "スクリプトの説明を挿入します",
       "SCRIPT_TYPE": "スクリプトの類型を挿入します（例：curl、bash ...）",
       "HEADERS": "注：ヘッダーセクションはRAW JSON形式{\"key\"： \"value\"}である必要があります\n注：入力しない場合、デフォルト値が送信されます",
-      "TIMEOUT": "秒単位の要求タイムアウト。値は1から10の間でなければならず、デフォルト値は5です。"
+      "TIMEOUT": "秒単位の要求タイムアウト。値は1から10の間でなければならず、デフォルト値は5です。",
+      "MANAGED": "完了したインタラクションの総数",
+      "OPENED": "アクティブなインタラクションの総数"
     },
     "15MIN": "15分",
     "1H": "1時間",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "第2レベルの気質",
     "SELECT_LEVEL": "レベルを選択してください",
     "TITLEFONTSIZE": "フォントタイトルサイズ",
-    "ADD_CONTACTITEMTYPE": "追加",
-    "CONTACTITEMTYPE": "連絡先アイテムの種類",
-    "NEW_CONTACTITEMTYPE": "新しい連絡先アイテムタイプ",
-    "ORDER_BY": "注文する",
-    "RGBBACKGROUNDCOLOR": "RGB背景色"
+    "EMAIL": "Eメール",
+    "FILTERCHATWEBSITES": "チャットWebサイトのフィルター",
+    "FILTEREMAILACCOUNTS": "メールアカウントのフィルタリング",
+    "FILTERFAXACCOUNTS": "ファックスアカウントのフィルタリング",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannelアカウントをフィルタリングする",
+    "FILTERSMSACCOUNTS": "Smsアカウントをフィルタリングする",
+    "FILTERWHATSAPPACCOUNTS": "Whatsappアカウントをフィルタリングする",
+    "MANAGED": "管理",
+    "MANAGED_TEXT": "管理された相互作用",
+    "OPENED": "オープン",
+    "OPENED_TEXT": "開かれた相互作用",
+    "IGNOREDIALERCONTACTID": "ダイヤラーの連絡先IDを無視する",
+    "MAIL_SUBSTATUS": "メールサブステータス"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/ko.json b/public/app/main/apps/tools/i18n/ko.json
index 269fe40..240d21b 100644
--- a/public/app/main/apps/tools/i18n/ko.json
+++ b/public/app/main/apps/tools/i18n/ko.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "값은 크거나 같아야합니다",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "값은 이하 여야합니다",
       "TIMEOUT_REQUIRED": "필수 필드",
-      "AUTOCREATE_FIELD_REQUIRED": "필수 필드"
+      "AUTOCREATE_FIELD_REQUIRED": "필수 필드",
+      "CHANNEL_REQUIRED": "필수 필드",
+      "IGNOREDIALERCONTACTID_REQUIRED": "다이얼러 연락처 ID 무시 필드는 필수 항목입니다."
     },
     "HOST": "호스트",
     "SECRET": "비공개",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "스크립트에 대한 설명을 삽입하십시오",
       "SCRIPT_TYPE": "스크립트에 대한 유형을 입력하십시오 (예 : curl, bash ...).",
       "HEADERS": "참고 : 헤더 섹션은 RAW JSON 형식이어야합니다 ({ \"key\": \"value\"}).\n참고 : 작성하지 않으면 기본값이 전송됩니다",
-      "TIMEOUT": "요청 시간 초과 (초) 값은 1과 10 사이 여야하며 기본값은 5입니다."
+      "TIMEOUT": "요청 시간 초과 (초) 값은 1과 10 사이 여야하며 기본값은 5입니다.",
+      "MANAGED": "완료된 상호작용의 총 수",
+      "OPENED": "총 활성 상호작용 수"
     },
     "EDIT_TRUNK": "시외전화 수정",
     "DELETE_TRUNK": "시외전화 삭제",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "두 번째 수준 처리",
     "SELECT_LEVEL": "레벨 선택",
     "TITLEFONTSIZE": "글꼴 제목 크기",
-    "ADD_CONTACTITEMTYPE": "추가하다",
-    "CONTACTITEMTYPE": "연락처 항목 유형",
-    "NEW_CONTACTITEMTYPE": "새 연락처 항목 유형",
-    "ORDER_BY": "주문",
-    "RGBBACKGROUNDCOLOR": "RGB 배경색"
+    "EMAIL": "이메일",
+    "FILTERCHATWEBSITES": "채팅 웹사이트 필터링",
+    "FILTEREMAILACCOUNTS": "이메일 계정 필터링",
+    "FILTERFAXACCOUNTS": "팩스 계정 필터링",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannel 계정 필터링",
+    "FILTERSMSACCOUNTS": "SMS 계정 필터링",
+    "FILTERWHATSAPPACCOUNTS": "Whatsapp 계정 필터링",
+    "MANAGED": "관리",
+    "MANAGED_TEXT": "관리 상호 작용",
+    "OPENED": "열림",
+    "OPENED_TEXT": "열린 상호 작용",
+    "IGNOREDIALERCONTACTID": "다이얼러 연락처 ID 무시",
+    "MAIL_SUBSTATUS": "이메일 하위 상태"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/lt.json b/public/app/main/apps/tools/i18n/lt.json
index 066db67..eebc3b9 100644
--- a/public/app/main/apps/tools/i18n/lt.json
+++ b/public/app/main/apps/tools/i18n/lt.json
@@ -118,7 +118,9 @@
       "TIMEOUT_REQUIRED": "Privalomas laukas",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Reikšmė turi būti mažesnė arba lygi",
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Reikšmė turi būti didesnė arba lygi",
-      "AUTOCREATE_FIELD_REQUIRED": "Privalomas laukas"
+      "AUTOCREATE_FIELD_REQUIRED": "Privalomas laukas",
+      "CHANNEL_REQUIRED": "Privalomas laukas",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignoruoti rinkiklio kontakto ID lauką būtina užpildyti"
     },
     "HOST": "Savininkas",
     "SECRET": "Slėpinys",
@@ -163,7 +165,9 @@
       "EVENTVARIABLES": "Jei įjungta, prie URL pridedami visi įvykių kintamieji (rekomenduojama reikšmė = Ne. Nustatykite į Taip tik vertinimo tikslais)",
       "HEADERS": "Pastaba: Antraštės skiltis turi būti RAW JSON formato {\"raktas\":\"reikšmė\"} Pastaba: jei neužpildyta, bus išsiųsta numatytoji reikšmė",
       "BODY": "Pastaba: turinys turi būti RAW JSON formato {\"raktas\":\"reikšmė\"} Pastaba: Jei neužpildysite, bus išsiųsta numatytoji reikšmė",
-      "TIMEOUT": "Pageidaujamas skirtasis laikas sekundėmis. Reikšmė turi būti nuo 1 iki 10, o numatytoji reikšmė yra 5."
+      "TIMEOUT": "Pageidaujamas skirtasis laikas sekundėmis. Reikšmė turi būti nuo 1 iki 10, o numatytoji reikšmė yra 5.",
+      "MANAGED": "Bendras užbaigtų sąveikų skaičius",
+      "OPENED": "Bendras aktyvių sąveikų skaičius"
     },
     "EDIT_TRUNK": "Redaguoti ryšio kanalą",
     "DELETE_TRUNK": "Ištrinti ryšio kanalą",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Antro lygio disponavimas",
     "SELECT_LEVEL": "Pasirinkite lygį",
     "TITLEFONTSIZE": "Šrifto pavadinimo dydis",
-    "ADD_CONTACTITEMTYPE": "Papildyti",
-    "CONTACTITEMTYPE": "Kontaktinių elementų tipai",
-    "NEW_CONTACTITEMTYPE": "Naujas kontaktinio elemento tipas",
-    "ORDER_BY": "Rūšiuoti pagal",
-    "RGBBACKGROUNDCOLOR": "RGB fono spalva"
+    "EMAIL": "Paštu",
+    "FILTERCHATWEBSITES": "Filtruokite pokalbių svetaines",
+    "FILTEREMAILACCOUNTS": "Filtruoti el. Pašto paskyras",
+    "FILTERFAXACCOUNTS": "Filtruoti fakso paskyras",
+    "FILTEROPENCHANNELACCOUNTS": "Filtruokite „OpenChannel“ paskyras",
+    "FILTERSMSACCOUNTS": "Filtruoti SMS paskyras",
+    "FILTERWHATSAPPACCOUNTS": "Filtruokite „Whatsapp“ paskyras",
+    "MANAGED": "Tvarko",
+    "MANAGED_TEXT": "Valdomos sąveikos",
+    "OPENED": "Atidaryta",
+    "OPENED_TEXT": "Atidarytos sąveikos",
+    "IGNOREDIALERCONTACTID": "Ignoruoti rinkiklio kontakto ID",
+    "MAIL_SUBSTATUS": "El. pašto būsena"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/lv.json b/public/app/main/apps/tools/i18n/lv.json
index a06d042..de70e24 100644
--- a/public/app/main/apps/tools/i18n/lv.json
+++ b/public/app/main/apps/tools/i18n/lv.json
@@ -62,7 +62,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Vērtībai jābūt lielākai vai vienādai ar",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Vērtībai jābūt mazai vai vienādai ar",
       "TIMEOUT_REQUIRED": "Obligāts lauks",
-      "AUTOCREATE_FIELD_REQUIRED": "Obligāts lauks"
+      "AUTOCREATE_FIELD_REQUIRED": "Obligāts lauks",
+      "CHANNEL_REQUIRED": "Obligāts lauks",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignorēt zvanītāja kontaktpersonas ID lauks ir nepieciešams"
     },
     "HELP": {
       "T38PT_UDPTL": "Es: yes,redundancy,maxdatagram=400",
@@ -102,7 +104,9 @@
       "SCRIPT_INFO": "Ievietojiet skripta aprakstu",
       "SCRIPT_TYPE": "Ievietojiet skripta tipoloģiju (piemēram, čokurošanās, bash ...)",
       "HEADERS": "Piezīme: sadaļai galvenes jābūt RAW JSON formātā {\"key\": \"value\"}\nPiezīme: ja tā nav aizpildīta, tiks nosūtīta noklusējuma vērtība",
-      "TIMEOUT": "Pieprasiet noildzi sekundēs. Vērtībai jābūt no 1 līdz 10, bet noklusējuma vērtībai - 5."
+      "TIMEOUT": "Pieprasiet noildzi sekundēs. Vērtībai jābūt no 1 līdz 10, bet noklusējuma vērtībai - 5.",
+      "MANAGED": "Kopējais pabeigto mijiedarbību skaits",
+      "OPENED": "Kopējais aktīvo mijiedarbību skaits"
     },
     "OUTBOUND_ROUTE": "Izejošais maršruts",
     "EDIT_DASHBOARDITEM": "Rediģēt paneļa logrīku",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Otrā līmeņa izvietojums",
     "SELECT_LEVEL": "Atlasiet līmeni",
     "TITLEFONTSIZE": "Fonta nosaukuma lielums",
-    "ADD_CONTACTITEMTYPE": "Pievienot",
-    "CONTACTITEMTYPE": "Kontaktpersonu veidi",
-    "NEW_CONTACTITEMTYPE": "Jauns kontakta vienuma veids",
-    "ORDER_BY": "Sakārtot pēc",
-    "RGBBACKGROUNDCOLOR": "RGB fona krāsa"
+    "EMAIL": "E -pasts",
+    "FILTERCHATWEBSITES": "Filtrējiet tērzēšanas vietnes",
+    "FILTEREMAILACCOUNTS": "Filtrējiet e -pasta kontus",
+    "FILTERFAXACCOUNTS": "Filtrēt faksa kontus",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrējiet OpenChannel kontus",
+    "FILTERSMSACCOUNTS": "Filtrējiet īsziņu kontus",
+    "FILTERWHATSAPPACCOUNTS": "Filtrējiet Whatsapp kontus",
+    "MANAGED": "Pārvaldīts",
+    "MANAGED_TEXT": "Pārvaldīta mijiedarbība",
+    "OPENED": "Atvērts",
+    "OPENED_TEXT": "Atvērtā mijiedarbība",
+    "IGNOREDIALERCONTACTID": "Ignorēt zvanītāja kontaktpersonas ID",
+    "MAIL_SUBSTATUS": "E-pasta apakšstatuss"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/nl.json b/public/app/main/apps/tools/i18n/nl.json
index f2f4f75..ba34894 100644
--- a/public/app/main/apps/tools/i18n/nl.json
+++ b/public/app/main/apps/tools/i18n/nl.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "De waarde moet groter dan of gelijk zijn aan",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "De waarde moet kleiner zijn dan of gelijk zijn aan",
       "TIMEOUT_REQUIRED": "Verplicht veld",
-      "AUTOCREATE_FIELD_REQUIRED": "Verplicht veld"
+      "AUTOCREATE_FIELD_REQUIRED": "Verplicht veld",
+      "CHANNEL_REQUIRED": "Verplicht veld",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Id-veld van contactpersoon voor kiezer negeren is verplicht"
     },
     "HOST": "Host",
     "SECRET": "Geheime",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Voer een beschrijving in voor het script",
       "SCRIPT_TYPE": "Voer een typologie in voor het script (bijv. Curl, bash ...)",
       "HEADERS": "Opmerking: het gedeelte met headers moet de RAW JSON-indeling {\"key\": \"value\"} hebben\nOpmerking: indien niet ingevuld, wordt de standaardwaarde verzonden",
-      "TIMEOUT": "Verzoek time-out in seconden. De waarde moet tussen 1 en 10 liggen en de standaardwaarde is 5."
+      "TIMEOUT": "Verzoek time-out in seconden. De waarde moet tussen 1 en 10 liggen en de standaardwaarde is 5.",
+      "MANAGED": "Het totale aantal voltooide interacties",
+      "OPENED": "Het totale aantal actieve interacties"
     },
     "EDIT_TRUNK": "Edit transmissielijn",
     "DELETE_TRUNK": "Verwijderen",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Tweede niveau dispositie",
     "SELECT_LEVEL": "Kies een niveau",
     "TITLEFONTSIZE": "Lettertype titelgrootte",
-    "ADD_CONTACTITEMTYPE": "Toevoegen",
-    "CONTACTITEMTYPE": "Typen contactitems",
-    "NEW_CONTACTITEMTYPE": "Nieuw type contactitem",
-    "ORDER_BY": "Bestellen op",
-    "RGBBACKGROUNDCOLOR": "RGB-achtergrondkleur"
+    "EMAIL": "E-mail",
+    "FILTERCHATWEBSITES": "Chat-websites filteren",
+    "FILTEREMAILACCOUNTS": "E-mailaccounts filteren",
+    "FILTERFAXACCOUNTS": "Faxaccounts filteren",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannel-accounts filteren",
+    "FILTERSMSACCOUNTS": "Sms-accounts filteren",
+    "FILTERWHATSAPPACCOUNTS": "Whatsapp-accounts filteren",
+    "MANAGED": "beheerd",
+    "MANAGED_TEXT": "Beheerde interacties",
+    "OPENED": "geopend",
+    "OPENED_TEXT": "Geopende interacties",
+    "IGNOREDIALERCONTACTID": "Contact-ID van kiezer negeren",
+    "MAIL_SUBSTATUS": "Substatus e-mail"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/no.json b/public/app/main/apps/tools/i18n/no.json
index 03a72e4..a23f06a 100644
--- a/public/app/main/apps/tools/i18n/no.json
+++ b/public/app/main/apps/tools/i18n/no.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Verdien må være større enn eller lik",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Verdien må være mindre enn eller lik",
       "TIMEOUT_REQUIRED": "Obligatoriske felt",
-      "AUTOCREATE_FIELD_REQUIRED": "Obligatoriske felt"
+      "AUTOCREATE_FIELD_REQUIRED": "Obligatoriske felt",
+      "CHANNEL_REQUIRED": "Obligatoriske felt",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignorer oppringingskontakt-ID-feltet er obligatorisk"
     },
     "HOST": "Vert",
     "SECRET": "Hemmelige",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Sett inn en beskrivelse for skriptet",
       "SCRIPT_TYPE": "Sett inn en typologi for manuset (f.eks. Krøll, bash ...)",
       "HEADERS": "Merk: Headers-delen må være i RAW JSON-format {\"key\": \"value\"}\nMerk: Hvis ikke utfylt, blir standardverdien sendt",
-      "TIMEOUT": "Be om timeout i sekunder. Verdien må være mellom 1 og 10 og standardverdien er 5."
+      "TIMEOUT": "Be om timeout i sekunder. Verdien må være mellom 1 og 10 og standardverdien er 5.",
+      "MANAGED": "Det totale antallet fullførte interaksjoner",
+      "OPENED": "Det totale antallet aktive interaksjoner"
     },
     "EDIT_TRUNK": "Rediger Trunk",
     "DELETE_TRUNK": "Slette Trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Andre nivå disposisjon",
     "SELECT_LEVEL": "Velg et nivå",
     "TITLEFONTSIZE": "Skriftens tittelstørrelse",
-    "ADD_CONTACTITEMTYPE": "Legg til",
-    "CONTACTITEMTYPE": "Typer av kontaktelementer",
-    "NEW_CONTACTITEMTYPE": "Ny type kontaktelement",
-    "ORDER_BY": "Rekkefølge etter",
-    "RGBBACKGROUNDCOLOR": "RGB bakgrunnsfarge"
+    "EMAIL": "E -post",
+    "FILTERCHATWEBSITES": "Filtrer nettsteder for chat",
+    "FILTEREMAILACCOUNTS": "Filtrer e -postkontoer",
+    "FILTERFAXACCOUNTS": "Filtrer fakskontoer",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrer OpenChannel -kontoer",
+    "FILTERSMSACCOUNTS": "Filtrer sms -kontoer",
+    "FILTERWHATSAPPACCOUNTS": "Filtrer Whatsapp -kontoer",
+    "MANAGED": "Fikk til",
+    "MANAGED_TEXT": "Administrerte interaksjoner",
+    "OPENED": "Åpnet",
+    "OPENED_TEXT": "Åpne interaksjoner",
+    "IGNOREDIALERCONTACTID": "Ignorer oppringingskontakt-ID",
+    "MAIL_SUBSTATUS": "E-post understatus"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/pl.json b/public/app/main/apps/tools/i18n/pl.json
index 3844813..61b47b0 100644
--- a/public/app/main/apps/tools/i18n/pl.json
+++ b/public/app/main/apps/tools/i18n/pl.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wartość musi być większa lub równa",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wartość musi być mniejsza lub równa",
       "TIMEOUT_REQUIRED": "Pole obowiązkowe",
-      "AUTOCREATE_FIELD_REQUIRED": "Pole obowiązkowe"
+      "AUTOCREATE_FIELD_REQUIRED": "Pole obowiązkowe",
+      "CHANNEL_REQUIRED": "Pole obowiązkowe",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Ignoruj pole identyfikatora kontaktu dialera jest wymagane"
     },
     "HOST": "Hosta",
     "SECRET": "Secret",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Wstaw opis skryptu",
       "SCRIPT_TYPE": "Wstaw typologię skryptu (np. Curl, bash ...)",
       "HEADERS": "Uwaga: sekcja nagłówków musi być w formacie RAW JSON {„klucz”: „wartość”}\nUwaga: Jeśli nie zostanie wypełniona, zostanie wysłana wartość domyślna",
-      "TIMEOUT": "Limit czasu żądania w sekundach. Wartość musi wynosić od 1 do 10, a wartość domyślna to 5."
+      "TIMEOUT": "Limit czasu żądania w sekundach. Wartość musi wynosić od 1 do 10, a wartość domyślna to 5.",
+      "MANAGED": "Całkowita liczba zakończonych interakcji",
+      "OPENED": "Całkowita liczba aktywnych interakcji"
     },
     "EDIT_TRUNK": "Edycja łącza trunkingowego",
     "DELETE_TRUNK": "Usuwanie łącza trunkingowego",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Dyspozycja drugiego poziomu",
     "SELECT_LEVEL": "Wybierz poziom",
     "TITLEFONTSIZE": "Rozmiar tytułu czcionki",
-    "ADD_CONTACTITEMTYPE": "Dodać",
-    "CONTACTITEMTYPE": "Typy elementów kontaktu",
-    "NEW_CONTACTITEMTYPE": "Nowy typ elementu kontaktu",
-    "ORDER_BY": "Zamów przez",
-    "RGBBACKGROUNDCOLOR": "Kolor tła RGB"
+    "EMAIL": "E-mail",
+    "FILTERCHATWEBSITES": "Filtruj strony internetowe czatu",
+    "FILTEREMAILACCOUNTS": "Filtruj konta e-mail",
+    "FILTERFAXACCOUNTS": "Filtruj konta faksów",
+    "FILTEROPENCHANNELACCOUNTS": "Filtruj konta OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtruj konta SMS",
+    "FILTERWHATSAPPACCOUNTS": "Filtruj konta Whatsapp",
+    "MANAGED": "Zarządzany",
+    "MANAGED_TEXT": "Zarządzane interakcje",
+    "OPENED": "Otwierany",
+    "OPENED_TEXT": "Otwarte interakcje",
+    "IGNOREDIALERCONTACTID": "Ignoruj identyfikator kontaktu dialera",
+    "MAIL_SUBSTATUS": "Substancja e-mail"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/pt-BR.json b/public/app/main/apps/tools/i18n/pt-BR.json
index 565e735..139cc22 100644
--- a/public/app/main/apps/tools/i18n/pt-BR.json
+++ b/public/app/main/apps/tools/i18n/pt-BR.json
@@ -113,7 +113,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "O valor deve ser maior ou igual a",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "TIMEOUT_REQUIRED": "Campo obrigatório",
-      "AUTOCREATE_FIELD_REQUIRED": "Campo obrigatório"
+      "AUTOCREATE_FIELD_REQUIRED": "Campo obrigatório",
+      "CHANNEL_REQUIRED": "Campo obrigatório",
+      "IGNOREDIALERCONTACTID_REQUIRED": "O campo Ignore dialer contact Id é obrigatório"
     },
     "HOST": "Host",
     "SECRET": "Segredo",
@@ -158,7 +160,9 @@
       "SCRIPT_INFO": "Inserir uma descrição para o script",
       "SCRIPT_TYPE": "Insira uma tipologia para o script (por exemplo, curl, bash ...)",
       "HEADERS": "Nota: a seção Cabeçalhos deve estar no formato JSON RAW {\"key\": \"value\"}\nNota: Se não for preenchido, o valor padrão será enviado",
-      "TIMEOUT": "Solicitar tempo limite em segundos. O valor deve estar entre 1 e 10 e o valor padrão é 5."
+      "TIMEOUT": "Solicitar tempo limite em segundos. O valor deve estar entre 1 e 10 e o valor padrão é 5.",
+      "MANAGED": "O número total de interações concluídas",
+      "OPENED": "O número total de interações ativas"
     },
     "EDIT_TRUNK": "Editar Tronco",
     "DELETE_TRUNK": "Excluir Tronco",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "SELECT_LEVEL": "Selecione um nível",
     "TITLEFONTSIZE": "Tamanho do título da fonte",
-    "ADD_CONTACTITEMTYPE": "Adicionar",
-    "CONTACTITEMTYPE": "Tipos de item de contato",
-    "NEW_CONTACTITEMTYPE": "Novo tipo de item de contato",
-    "ORDER_BY": "Ordenar por",
-    "RGBBACKGROUNDCOLOR": "Cor de fundo RGB"
+    "EMAIL": "E-mail",
+    "FILTERCHATWEBSITES": "Filtrar sites de bate-papo",
+    "FILTEREMAILACCOUNTS": "Filtrar contas de e-mail",
+    "FILTERFAXACCOUNTS": "Filtrar contas de fax",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrar contas OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtrar contas de SMS",
+    "FILTERWHATSAPPACCOUNTS": "Filtrar contas do Whatsapp",
+    "MANAGED": "Gerenciou",
+    "MANAGED_TEXT": "Interações gerenciadas",
+    "OPENED": "Aberto",
+    "OPENED_TEXT": "Interações abertas",
+    "IGNOREDIALERCONTACTID": "Ignorar o ID de contato do discador",
+    "MAIL_SUBSTATUS": "Substatus do Email"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/pt-PT.json b/public/app/main/apps/tools/i18n/pt-PT.json
index e260e34..580d69f 100644
--- a/public/app/main/apps/tools/i18n/pt-PT.json
+++ b/public/app/main/apps/tools/i18n/pt-PT.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "O valor deve ser maior ou igual a",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "O valor deve ser menor ou igual a",
       "TIMEOUT_REQUIRED": "Campo obrigatório",
-      "AUTOCREATE_FIELD_REQUIRED": "Campo obrigatório"
+      "AUTOCREATE_FIELD_REQUIRED": "Campo obrigatório",
+      "CHANNEL_REQUIRED": "Campo obrigatório",
+      "IGNOREDIALERCONTACTID_REQUIRED": "O campo Ignore dialer contact Id é obrigatório"
     },
     "HOST": "Host",
     "SECRET": "Segredo",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Inserir uma descrição para o script",
       "SCRIPT_TYPE": "Insira uma tipologia para o script (por exemplo, curl, bash ...)",
       "HEADERS": "Nota: a seção Cabeçalhos deve estar no formato JSON RAW {\"key\": \"value\"}\nNota: Se não for preenchido, o valor padrão será enviado",
-      "TIMEOUT": "Solicitar tempo limite em segundos. O valor deve estar entre 1 e 10 e o valor padrão é 5."
+      "TIMEOUT": "Solicitar tempo limite em segundos. O valor deve estar entre 1 e 10 e o valor padrão é 5.",
+      "MANAGED": "O número total de interações concluídas",
+      "OPENED": "O número total de interações ativas"
     },
     "EDIT_TRUNK": "Editar tronco",
     "DELETE_TRUNK": "Excluir tronco",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "SELECT_LEVEL": "Selecione um nível",
     "TITLEFONTSIZE": "Tamanho do título da fonte",
-    "ADD_CONTACTITEMTYPE": "Adicionar",
-    "CONTACTITEMTYPE": "Tipos de item de contato",
-    "NEW_CONTACTITEMTYPE": "Novo tipo de item de contato",
-    "ORDER_BY": "Ordenar por",
-    "RGBBACKGROUNDCOLOR": "Cor de fundo RGB"
+    "EMAIL": "E-mail",
+    "FILTERCHATWEBSITES": "Filtrar sites de bate-papo",
+    "FILTEREMAILACCOUNTS": "Filtrar contas de e-mail",
+    "FILTERFAXACCOUNTS": "Filtrar contas de fax",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrar contas OpenChannel",
+    "FILTERSMSACCOUNTS": "Filtrar contas de SMS",
+    "FILTERWHATSAPPACCOUNTS": "Filtrar contas do Whatsapp",
+    "MANAGED": "Gerenciou",
+    "MANAGED_TEXT": "Interações gerenciadas",
+    "OPENED": "Aberto",
+    "OPENED_TEXT": "Interações abertas",
+    "IGNOREDIALERCONTACTID": "Ignorar o ID de contato do discador",
+    "MAIL_SUBSTATUS": "Substatus do Email"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/ru.json b/public/app/main/apps/tools/i18n/ru.json
index a365ed7..abec68d 100644
--- a/public/app/main/apps/tools/i18n/ru.json
+++ b/public/app/main/apps/tools/i18n/ru.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Значение должно быть больше или равно",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Значение должно быть меньше или равно",
       "TIMEOUT_REQUIRED": "Обязательное поле",
-      "AUTOCREATE_FIELD_REQUIRED": "Обязательное поле"
+      "AUTOCREATE_FIELD_REQUIRED": "Обязательное поле",
+      "CHANNEL_REQUIRED": "Обязательное поле",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Поле Ignore dialer contact Id обязательно для заполнения"
     },
     "HOST": "Принимающей",
     "SECRET": "Секрет",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Вставьте описание для скрипта",
       "SCRIPT_TYPE": "Вставьте типологию для сценария (например, curl, bash ...)",
       "HEADERS": "Примечание. Раздел заголовков должен быть в формате RAW JSON {\"ключ\": \"значение\"}\nПримечание: если не заполнено, будет отправлено значение по умолчанию",
-      "TIMEOUT": "Время ожидания запроса в секундах. Значение должно быть от 1 до 10, а значение по умолчанию - 5."
+      "TIMEOUT": "Время ожидания запроса в секундах. Значение должно быть от 1 до 10, а значение по умолчанию - 5.",
+      "MANAGED": "Общее количество завершенных взаимодействий",
+      "OPENED": "Общее количество активных взаимодействий"
     },
     "EDIT_TRUNK": "Редактировать СЛ",
     "DELETE_TRUNK": "Удалить СЛ",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Расположение второго уровня",
     "SELECT_LEVEL": "Выберите уровень",
     "TITLEFONTSIZE": "Размер заголовка шрифта",
-    "ADD_CONTACTITEMTYPE": "Добавлять",
-    "CONTACTITEMTYPE": "Типы контактов",
-    "NEW_CONTACTITEMTYPE": "Новый тип элемента контакта",
-    "ORDER_BY": "Сортировать по",
-    "RGBBACKGROUNDCOLOR": "Цвет фона RGB"
+    "EMAIL": "Электронное письмо",
+    "FILTERCHATWEBSITES": "Фильтр веб-сайтов чата",
+    "FILTEREMAILACCOUNTS": "Фильтр учетных записей электронной почты",
+    "FILTERFAXACCOUNTS": "Фильтр учетных записей факсов",
+    "FILTEROPENCHANNELACCOUNTS": "Фильтрация учетных записей OpenChannel",
+    "FILTERSMSACCOUNTS": "Фильтр смс аккаунтов",
+    "FILTERWHATSAPPACCOUNTS": "Фильтр учетных записей WhatsApp",
+    "MANAGED": "Удалось",
+    "MANAGED_TEXT": "Управляемые взаимодействия",
+    "OPENED": "Открыт",
+    "OPENED_TEXT": "Открытые взаимодействия",
+    "IGNOREDIALERCONTACTID": "Игнорировать идентификатор контакта номеронабирателя",
+    "MAIL_SUBSTATUS": "Подстатус электронной почты"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/sv.json b/public/app/main/apps/tools/i18n/sv.json
index bd109c9..4413252 100644
--- a/public/app/main/apps/tools/i18n/sv.json
+++ b/public/app/main/apps/tools/i18n/sv.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Värdet måste vara större än eller lika med",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Värdet måste vara mindre än eller lika med",
       "TIMEOUT_REQUIRED": "Obligatoriskt fält",
-      "AUTOCREATE_FIELD_REQUIRED": "Obligatoriskt fält"
+      "AUTOCREATE_FIELD_REQUIRED": "Obligatoriskt fält",
+      "CHANNEL_REQUIRED": "Obligatoriskt fält",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Fältet Ignorera kontakt-ID för uppringare krävs"
     },
     "HOST": "Host",
     "SECRET": "Hemlig",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Sätt in en beskrivning för skriptet",
       "SCRIPT_TYPE": "Infoga en typologi för skriptet (t.ex. curl, bash ...)",
       "HEADERS": "Obs! Rubriken för rubriker måste vara i RAW JSON-format {\"key\": \"value\"}\nObs: Om det inte fylls i skickas standardvärdet",
-      "TIMEOUT": "Begär timeout i sekunder. Värdet måste vara mellan 1 och 10 och standardvärdet är 5."
+      "TIMEOUT": "Begär timeout i sekunder. Värdet måste vara mellan 1 och 10 och standardvärdet är 5.",
+      "MANAGED": "Det totala antalet avslutade interaktioner",
+      "OPENED": "Det totala antalet aktiva interaktioner"
     },
     "EDIT_TRUNK": "Redigera trunk",
     "DELETE_TRUNK": "Ta bort trunk",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "Andra nivån disposition",
     "SELECT_LEVEL": "Välj en nivå",
     "TITLEFONTSIZE": "Teckensnittsstorlek",
-    "ADD_CONTACTITEMTYPE": "Lägg till",
-    "CONTACTITEMTYPE": "Typer av kontaktartiklar",
-    "NEW_CONTACTITEMTYPE": "Ny typ av kontaktartikel",
-    "ORDER_BY": "Sortera efter",
-    "RGBBACKGROUNDCOLOR": "RGB bakgrundsfärg"
+    "EMAIL": "E-post",
+    "FILTERCHATWEBSITES": "Filtrera chattwebbplatser",
+    "FILTEREMAILACCOUNTS": "Filtrera e -postkonton",
+    "FILTERFAXACCOUNTS": "Filtrera faxkonton",
+    "FILTEROPENCHANNELACCOUNTS": "Filtrera OpenChannel -konton",
+    "FILTERSMSACCOUNTS": "Filtrera sms -konton",
+    "FILTERWHATSAPPACCOUNTS": "Filtrera Whatsapp -konton",
+    "MANAGED": "Hanteras",
+    "MANAGED_TEXT": "Hanterade interaktioner",
+    "OPENED": "Öppnad",
+    "OPENED_TEXT": "Öppnade interaktioner",
+    "IGNOREDIALERCONTACTID": "Ignorera uppringarens kontakt-ID",
+    "MAIL_SUBSTATUS": "E-postunderstatus"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/tr.json b/public/app/main/apps/tools/i18n/tr.json
index 23d2bff..f4a556b 100644
--- a/public/app/main/apps/tools/i18n/tr.json
+++ b/public/app/main/apps/tools/i18n/tr.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Değer şuna eşit veya daha büyük olmalıdır",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Değer şuna eşit veya daha küçük olmalıdır",
       "TIMEOUT_REQUIRED": "Zorunlu alan",
-      "AUTOCREATE_FIELD_REQUIRED": "Zorunlu alan"
+      "AUTOCREATE_FIELD_REQUIRED": "Zorunlu alan",
+      "CHANNEL_REQUIRED": "Zorunlu alan",
+      "IGNOREDIALERCONTACTID_REQUIRED": "Çevirici kişi kimliğini yoksay alanı gereklidir"
     },
     "HOST": "Ana",
     "SECRET": "Gizli",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "Komut dosyası için bir açıklama ekleyin",
       "SCRIPT_TYPE": "Komut dosyası için bir tipoloji ekleyin (ör. Curl, bash ...)",
       "HEADERS": "Not: Üstbilgiler bölümü {\"key\": \"value\"} RAW JSON biçiminde olmalıdır\nNot: Doldurulmazsa, varsayılan değer gönderilir",
-      "TIMEOUT": "Saniye cinsinden zaman aşımı isteğinde bulunun. Değer 1 ile 10 arasında ve varsayılan değer 5 olmalıdır."
+      "TIMEOUT": "Saniye cinsinden zaman aşımı isteğinde bulunun. Değer 1 ile 10 arasında ve varsayılan değer 5 olmalıdır.",
+      "MANAGED": "Tamamlanan Etkileşimlerin toplam sayısı",
+      "OPENED": "Toplam Etkin Etkileşim sayısı"
     },
     "EDIT_TRUNK": "Düzenleme Santral",
     "DELETE_TRUNK": "Delete Santral",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "İkinci Düzey Tasarruf",
     "SELECT_LEVEL": "Bir seviye seçin",
     "TITLEFONTSIZE": "Yazı Tipi Başlık Boyutu",
-    "ADD_CONTACTITEMTYPE": "Ekle",
-    "CONTACTITEMTYPE": "İletişim öğesi türleri",
-    "NEW_CONTACTITEMTYPE": "Yeni kişi öğesi türü",
-    "ORDER_BY": "Tarafından sipariş",
-    "RGBBACKGROUNDCOLOR": "RGB Arkaplan rengi"
+    "EMAIL": "E-posta",
+    "FILTERCHATWEBSITES": "Sohbet Web Sitelerini Filtrele",
+    "FILTEREMAILACCOUNTS": "E-posta Hesaplarını Filtrele",
+    "FILTERFAXACCOUNTS": "Faks Hesaplarını Filtrele",
+    "FILTEROPENCHANNELACCOUNTS": "OpenChannel Hesaplarını Filtrele",
+    "FILTERSMSACCOUNTS": "Sms Hesaplarını Filtrele",
+    "FILTERWHATSAPPACCOUNTS": "Whatsapp Hesaplarını Filtrele",
+    "MANAGED": "Yönetilen",
+    "MANAGED_TEXT": "Yönetilen Etkileşimler",
+    "OPENED": "Açıldı",
+    "OPENED_TEXT": "Açık Etkileşimler",
+    "IGNOREDIALERCONTACTID": "Çevirici kişi kimliğini yoksay",
+    "MAIL_SUBSTATUS": "E-posta Alt Durumu"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/zh-CN.json b/public/app/main/apps/tools/i18n/zh-CN.json
index 11c6a3a..575d718 100644
--- a/public/app/main/apps/tools/i18n/zh-CN.json
+++ b/public/app/main/apps/tools/i18n/zh-CN.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "该值必须大于或等于",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "该值必须小于或等于",
       "TIMEOUT_REQUIRED": "必填项",
-      "AUTOCREATE_FIELD_REQUIRED": "必填项"
+      "AUTOCREATE_FIELD_REQUIRED": "必填项",
+      "CHANNEL_REQUIRED": "必填项",
+      "IGNOREDIALERCONTACTID_REQUIRED": "忽略拨号联系人 ID 字段是必需的"
     },
     "HOST": "主机",
     "SECRET": "秘密",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "插入脚本说明",
       "SCRIPT_TYPE": "插入脚本类型（例如curl，bash ...）",
       "HEADERS": "注意：标头部分必须为RAW JSON格式{“ key”：“ value”}\n注意：如果未填写，将发送默认值",
-      "TIMEOUT": "请求超时（以秒为单位）。该值必须介于1到10之间，默认值为5。"
+      "TIMEOUT": "请求超时（以秒为单位）。该值必须介于1到10之间，默认值为5。",
+      "MANAGED": "完成的交互总数",
+      "OPENED": "活跃互动总数"
     },
     "EDIT_TRUNK": "编辑中继线",
     "DELETE_TRUNK": "删除中继线",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "二级处置",
     "SELECT_LEVEL": "选择一个级别",
     "TITLEFONTSIZE": "字体标题大小",
-    "ADD_CONTACTITEMTYPE": "添加",
-    "CONTACTITEMTYPE": "联系项目类型",
-    "NEW_CONTACTITEMTYPE": "新的联系人项目类型",
-    "ORDER_BY": "订购方式",
-    "RGBBACKGROUNDCOLOR": "RGB 背景色"
+    "EMAIL": "电子邮件",
+    "FILTERCHATWEBSITES": "过滤聊天网站",
+    "FILTEREMAILACCOUNTS": "过滤电子邮件帐户",
+    "FILTERFAXACCOUNTS": "过滤传真帐户",
+    "FILTEROPENCHANNELACCOUNTS": "过滤 OpenChannel 帐户",
+    "FILTERSMSACCOUNTS": "过滤短信账户",
+    "FILTERWHATSAPPACCOUNTS": "筛选 Whatsapp 帐户",
+    "MANAGED": "管理",
+    "MANAGED_TEXT": "托管交互",
+    "OPENED": "打开",
+    "OPENED_TEXT": "打开的交互",
+    "IGNOREDIALERCONTACTID": "忽略拨号联系人 ID",
+    "MAIL_SUBSTATUS": "电子邮件子状态"
   }
 }
diff --git a/public/app/main/apps/tools/i18n/zh-TW.json b/public/app/main/apps/tools/i18n/zh-TW.json
index 19eecc7..4daf20c 100644
--- a/public/app/main/apps/tools/i18n/zh-TW.json
+++ b/public/app/main/apps/tools/i18n/zh-TW.json
@@ -66,7 +66,9 @@
       "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "該值必須大於或等於",
       "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "該值必須小於或等於",
       "TIMEOUT_REQUIRED": "必填項",
-      "AUTOCREATE_FIELD_REQUIRED": "必填項"
+      "AUTOCREATE_FIELD_REQUIRED": "必填項",
+      "CHANNEL_REQUIRED": "必填項",
+      "IGNOREDIALERCONTACTID_REQUIRED": "忽略撥號聯繫人 ID 字段是必需的"
     },
     "HOST": "主機",
     "SECRET": "秘密",
@@ -111,7 +113,9 @@
       "SCRIPT_INFO": "插入腳本說明",
       "SCRIPT_TYPE": "插入腳本類型（例如curl，bash ...）",
       "HEADERS": "注意：標頭部分必須為RAW JSON格式{“ key”：“ value”}\n注意：如果未填寫，將發送默認值",
-      "TIMEOUT": "請求超時（以秒為單位）。該值必須介於1到10之間，默認值為5。"
+      "TIMEOUT": "請求超時（以秒為單位）。該值必須介於1到10之間，默認值為5。",
+      "MANAGED": "完成的交互總數",
+      "OPENED": "活躍互動總數"
     },
     "EDIT_TRUNK": "編輯中繼線",
     "DELETE_TRUNK": "刪除中繼線",
@@ -466,10 +470,18 @@
     "SECOND_LEVEL_DISPOSITION": "二級處置",
     "SELECT_LEVEL": "選擇一個級別",
     "TITLEFONTSIZE": "字體標題大小",
-    "ADD_CONTACTITEMTYPE": "添加",
-    "CONTACTITEMTYPE": "聯繫項目類型",
-    "NEW_CONTACTITEMTYPE": "新的聯繫人項目類型",
-    "ORDER_BY": "訂購方式",
-    "RGBBACKGROUNDCOLOR": "RGB 背景色"
+    "EMAIL": "電子郵件",
+    "FILTERCHATWEBSITES": "過濾聊天網站",
+    "FILTEREMAILACCOUNTS": "過濾電子郵件帳戶",
+    "FILTERFAXACCOUNTS": "過濾傳真帳戶",
+    "FILTEROPENCHANNELACCOUNTS": "過濾 OpenChannel 帳戶",
+    "FILTERSMSACCOUNTS": "過濾短信賬戶",
+    "FILTERWHATSAPPACCOUNTS": "篩選 Whatsapp 帳戶",
+    "MANAGED": "管理",
+    "MANAGED_TEXT": "託管交互",
+    "OPENED": "打開",
+    "OPENED_TEXT": "打開的交互",
+    "IGNOREDIALERCONTACTID": "忽略撥號聯繫人 ID",
+    "MAIL_SUBSTATUS": "電子郵件子狀態"
   }
 }
diff --git a/public/app/main/apps/video/i18n/hu.json b/public/app/main/apps/video/i18n/hu.json
new file mode 100644
index 0000000..81b9c5c
--- /dev/null
+++ b/public/app/main/apps/video/i18n/hu.json
@@ -0,0 +1,40 @@
+{
+  "VIDEO": {
+    "VIDEO": "Video",
+    "SCREENRECORDINGS": "Screen Recordings",
+    "SEARCH_FOR_ANYONE": "Search",
+    "INTERACTIONID": "Interaction ID",
+    "CHANNEL": "Channel",
+    "AGENT": "Agent",
+    "RATING": "Rating",
+    "NO_RATING": "No Rating",
+    "RECORDSTARTTIME": "Record Start Time",
+    "RECORDENDTIME": "Record End Time",
+    "DURATION": "Duration",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "NO_AVAILABLE_INFO": "No Available Info",
+    "EDIT_SCREENRECORDING": "Rate Screen Recording",
+    "PLAY_SCREENRECORDING": "Play Screen Recording",
+    "DOWNLOAD_SCREENRECORDING": "Download Screen Recording",
+    "DELETE_SCREENRECORDING": "Delete Screen Recording",
+    "CANT_DOWNLOAD_THIS_FILE": "Can't download this file",
+    "WRONG_EXTENSION": "The file presents the wrong extension",
+    "FILE_NOT_FOUND": "File not found",
+    "SAVE": "Save",
+    "DELETE": "Delete",
+    "UPDATEDAT": "Last Update",
+    "PROPERTIES": "Properties",
+    "FORMAT": "Format",
+    "STARTEDAT": "Record Start Time",
+    "CLOSEDAT": "Record End Time",
+    "CREATEDAT": "Created at",
+    "ID": "Id",
+    "AGENTNAME": "Agent",
+    "CANT_PLAY_THIS_FILE": "Can't play this type of file",
+    "LEGEND": {},
+    "ERRORS": {},
+    "HELP": {}
+  }
+}
diff --git a/public/app/main/apps/voice/i18n/ar.json b/public/app/main/apps/voice/i18n/ar.json
index 91d5165..e913b7d 100644
--- a/public/app/main/apps/voice/i18n/ar.json
+++ b/public/app/main/apps/voice/i18n/ar.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "مستوى الخدمة",
     "SECOND_LEVEL_DISPOSITION": "ترتيب المستوى الثاني",
     "THIRD_LEVEL_DISPOSITION": "الترتيب الثالث",
-    "ALIAS": "الاسم المستعار"
+    "TEAMADD_VOICEPREFIX": "أضف الفريق إلى البادئة",
+    "ALIAS": "الاسم المستعار",
+    "MAXCAPACITY": "السعة القصوى",
+    "WORKING": "عمل"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/cs.json b/public/app/main/apps/voice/i18n/cs.json
index 5fe900e..acf12e0 100644
--- a/public/app/main/apps/voice/i18n/cs.json
+++ b/public/app/main/apps/voice/i18n/cs.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Úroveň služby",
     "SECOND_LEVEL_DISPOSITION": "Dispozice druhé úrovně",
     "THIRD_LEVEL_DISPOSITION": "Dispozice třetí úrovně",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Přidat tým k předponě",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Maximální kapacita",
+    "WORKING": "Pracovní"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/da.json b/public/app/main/apps/voice/i18n/da.json
index 67570a2..d178808 100644
--- a/public/app/main/apps/voice/i18n/da.json
+++ b/public/app/main/apps/voice/i18n/da.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Serviceniveau",
     "SECOND_LEVEL_DISPOSITION": "Andet niveau disposition",
     "THIRD_LEVEL_DISPOSITION": "Tredje niveau disposition",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Føj team til præfiks",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Max kapacitet",
+    "WORKING": "Arbejder"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/de.json b/public/app/main/apps/voice/i18n/de.json
index c698d09..2bf3764 100644
--- a/public/app/main/apps/voice/i18n/de.json
+++ b/public/app/main/apps/voice/i18n/de.json
@@ -1,68 +1,68 @@
 {
   "VOICE": {
-    "GOTO_VOICEQUEUE": "Zu Realtime Voice Warteschlangen gehen",
-    "GOTOREALTIME_VOICEQUEUE": "Zu Realtime Voice Warteschlangen gehen",
+    "GOTO_VOICEQUEUE": "Zur Anruf-Warteschlange gehen",
+    "GOTOREALTIME_VOICEQUEUE": "Zur Echtzeitansicht Anruf-Warteschlange gehen",
     "NAME": "Name",
     "LOGOUT": "An-/Abmelden",
-    "VOICEQUEUES": "Voice Warteschlangen",
-    "SEARCH_FOR_ANYONE": "Suche für Jedermann",
+    "VOICEQUEUES": "Anruf-Warteschlangen",
+    "SEARCH_FOR_ANYONE": "Suche",
     "BACK": "Zurück",
-    "SELECTED": "Ausgewählte",
-    "SELECT_ALL": "Alle auswählen",
-    "SELECT_NONE": "Wählen Sie \"Keine\"",
-    "DELETE_VOICEDISPOSITION": "Disposition löschen",
-    "EDIT_VOICEDISPOSITION": "Edit Voice Disposition",
-    "EDIT_VOICEQUEUE": "Edit Voice Warteschlange",
-    "DELETE_VOICEQUEUE": "Warteschlange löschen",
-    "MOHSOUNDS": "Die MOH-Sounds",
+    "SELECTED": "Ausgewählt",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
+    "DELETE_VOICEDISPOSITION": "Qualifizierung löschen",
+    "EDIT_VOICEDISPOSITION": "Qualifizierung bearbeiten",
+    "EDIT_VOICEQUEUE": "Anruf-Warteschlange bearbeiten",
+    "DELETE_VOICEQUEUE": "Anruf-Warteschlange löschen",
+    "MOHSOUNDS": "MOH-Töne",
     "STRATEGY": "Strategie",
     "DESCRIPTION": "Beschreibung",
-    "ADD_VOICEQUEUE": "Hinzufügen von Warteschlangen",
+    "ADD_VOICEQUEUE": "Warteschlangen hinzufügen",
     "CREATED_AT": "Erstellt am",
-    "CANT_PLAY_GSM_AUDIO_FILES": "Nicht gsm-Audiodateien",
+    "CANT_PLAY_GSM_AUDIO_FILES": "Nicht GSM-Audiodateien",
     "APPLICATIONS_LIST": "Liste der Anwendungen",
     "LEGEND": {
       "CUSTOM_APPLICATION": "(*) - Benutzerdefinierte Anwendung."
     },
     "ERRORS": {
-      "NAME_REQUIRED": "Der Name ist erforderlich",
-      "APPLICATION_NAME_REQUIRED": "Der Name der Anwendung ist erforderlich",
-      "TIMEOUT_REQUIRED": "Der Timeout ist erforderlich",
-      "PHONENUMBER_REQUIRED": "Die Telefonnummer ist erforderlich",
-      "CONTEXT_REQUIRED": "Der Rahmen ist erforderlich",
-      "DESTINATIONPATTERN_REQUIRED": "Das Ziel-pattern ist erforderlich",
-      "FULLNAME_REQUIRED": "Der vollständige Name ist erforderlich",
-      "EMAIL_REQUIRED": "Die E-Mail ist erforderlich",
-      "EMAIL_MUST_VALID": "Die e-Mail muss in einem gültigen Format",
-      "MAILBOX_REQUIRED": "Die Mailbox ist erforderlich",
-      "PASSWORD_REQUIRED": "Das Kennwort ist erforderlich",
-      "CONFIRM_NOT_MATCH": "Die Kennwörter stimmen nicht überein.",
-      "TIMEZONE_REQUIRED": "Die Zeitzone ist erforderlich",
-      "PREFIX_REQUIRED": "Das Präfix ist erforderlich",
-      "OPTIONS_REQUIRED": "Die Optionen sind Erforderlich",
-      "AFTERCALLWORKDURATION_REQUIRED": "Die Arbeit nach Anruf Dauer ist erforderlich",
-      "TECHNOLOGY/RESOURCE_REQUIRED": "Die Technologie/Ressource erforderlich ist",
-      "PHONE_REQUIRED": "Die Telefonnummer ist erforderlich",
-      "VALUE_REQUIRED": "Der Wert ist erforderlich",
-      "EXTENSION_REQUIRED": "Die Verlängerung ist erforderlich",
-      "PRIORITY_REQUIRED": "Die Priorität ist erforderlich",
-      "NAME_MUST_VALID_PATTERN": "Der Name muss in einem gültigen Format geschrieben werden",
-      "APPLICATION_REQUIRED": "Die Anwendung ist erforderlich",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Timeout muss größer als oder gleich",
-      "MAXLENGTH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die max. Länge muss größer als oder gleich",
-      "RETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Wiederholung muss größer als oder gleich",
-      "WRAPUPTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Nachlese Zeit muss größer als oder gleich",
-      "WEIGHT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Das Gewicht muss größer als oder gleich",
-      "ANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Häufigkeit verkünden muss größer als oder gleich",
-      "MINANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Min Frequenz ankündigen muss größer als oder gleich",
-      "PERIODICANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die periodische Frequenz ankündigen muss größer als oder gleich",
-      "AFTERCALLWORKDURATION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Arbeit nach Anruf Dauer muss größer als oder gleich",
-      "MEMBERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Verzögerung muss größer als oder gleich",
-      "POSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Position muss größer als oder gleich",
-      "CUTDIGITS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Den Schnitt stellen muss größer als oder gleich",
-      "MAXSECONDS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Muss die Max Sekunden größer als oder gleich",
-      "MAXMESSAGES_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die Max Meldungen muss größer als oder gleich",
-      "MAXMESSAGES_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Die Max Meldungen muss kleiner als oder gleich",
+      "NAME_REQUIRED": "Name ist erforderlich",
+      "APPLICATION_NAME_REQUIRED": "Name der Anwendung ist erforderlich",
+      "TIMEOUT_REQUIRED": "Timeout ist erforderlich",
+      "PHONENUMBER_REQUIRED": "Telefonnummer ist erforderlich",
+      "CONTEXT_REQUIRED": "Kontext ist erforderlich",
+      "DESTINATIONPATTERN_REQUIRED": "Ziel-Pattern ist erforderlich",
+      "FULLNAME_REQUIRED": "Vollständiger Name ist erforderlich",
+      "EMAIL_REQUIRED": "E-Mail ist erforderlich",
+      "EMAIL_MUST_VALID": "E-Mail Format ungültig",
+      "MAILBOX_REQUIRED": "Mailbox ist erforderlich",
+      "PASSWORD_REQUIRED": "Passwort ist erforderlich",
+      "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein",
+      "TIMEZONE_REQUIRED": "Zeitzone ist erforderlich",
+      "PREFIX_REQUIRED": "Präfix ist erforderlich",
+      "OPTIONS_REQUIRED": "Bedingungen sind Erforderlich",
+      "AFTERCALLWORKDURATION_REQUIRED": "Dauer Nacharbeit ist erforderlich",
+      "TECHNOLOGY/RESOURCE_REQUIRED": "Ressource ist erforderlich",
+      "PHONE_REQUIRED": "Telefonnummer ist erforderlich",
+      "VALUE_REQUIRED": "Wert ist erforderlich",
+      "EXTENSION_REQUIRED": "Nebenstelle ist erforderlich",
+      "PRIORITY_REQUIRED": "Priorität ist erforderlich",
+      "NAME_MUST_VALID_PATTERN": "Format Name ungültig",
+      "APPLICATION_REQUIRED": "Anwendung ist erforderlich",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Timeout muss größer oder gleich sein als",
+      "MAXLENGTH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Die max. Länge muss größer oder gleich sein als",
+      "RETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wiederversuche muss größer oder gleich sein als",
+      "WRAPUPTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Nacharbeit Zeit muss größer oder gleich sein als",
+      "WEIGHT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Gewichtung muss größer oder gleich sein als",
+      "ANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Frequenz der Ansagen muss größer oder gleich sein als",
+      "MINANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Min. Frequenz der Ansagen muss größer oder gleich sein als",
+      "PERIODICANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wiederholende Frequenz der Ansagen muss größer oder gleich sein als",
+      "AFTERCALLWORKDURATION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Nacharbeit Zeit muss größer oder gleich sein als",
+      "MEMBERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Verzögerung muss größer oder gleich sein als",
+      "POSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Position muss größer oder gleich sein als",
+      "CUTDIGITS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Schnitt muss größer oder gleich sein als",
+      "MAXSECONDS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Max. Sekundenmuss größer oder gleich sein als",
+      "MAXMESSAGES_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Max. Nachrichten muss größer oder gleich sein als",
+      "MAXMESSAGES_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Max. Nachrichten muss kleiner oder gleich sein als",
       "CALLERIDALL_MUST_VALID_PATTERN": "Falsches Format",
       "OUTBOUNDROUTE_REQUIRED": "Pflichtfeld",
       "VARIABLE_REQUIRED": "Pflichtfeld",
@@ -70,187 +70,187 @@
       "TRUNK_REQUIRED": "Pflichtfeld",
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Pflichtfeld",
       "PROJECT_REQUIRED": "Pflichtfeld",
-      "PENALTY_REQUIRED": "Sie müssen einen Wert für die Strafe angeben"
+      "PENALTY_REQUIRED": "Wert für Verzögerung erforderlich"
     },
     "GENERAL": "Allgemein",
     "TIMEOUT": "Timeout",
     "MAXLENGTH": "Maximale Länge",
-    "RETRY": "Versuchen Sie es erneut",
-    "WRAPUPTIME": "-Zeit",
-    "WEIGHT": "Gewicht",
-    "JOINWHENEMPTY": "Melden Sie wenn sie leer sind",
-    "LEAVEWHENEMPTY": "Wenn sie leer lassen",
+    "RETRY": "Bitte erneut versuchen",
+    "WRAPUPTIME": "Nacharbeit",
+    "WEIGHT": "Gewichtung",
+    "JOINWHENEMPTY": "Beitreten, wenn leer",
+    "LEAVEWHENEMPTY": "Verlassen, wenn leer",
     "HELP": {
-      "TIMEOUT": "Gibt die Anzahl von Sekunden an, die das Gerät.",
-      "MAXLENGTH": "Gibt die maximale Anzahl der Anrufer, die in der Warteschlange. Ein Wert von Null bedeutet, dass eine unbegrenzte Anzahl von Anrufern in der Warteschlange sind erlaubt.",
-      "RETRY": "Gibt die Anzahl der Sekunden, die gewartet wird, bevor das nächste Mitglied in die Warteschlange, wenn der Wert für die Zeitüberschreitung erschöpft ist, während versucht wird, den ein Mitglied der Warteschlange.",
-      "WRAPUPTIME": "Die Anzahl der Sekunden, die ein Mitglied in einer Warteschlange verfügbar, nachdem Sie einen Anruf.",
-      "WEIGHT": "Legt das Gewicht einer Warteschlange. Eine Warteschlange mit einem höheren Gewicht definiert werden erste Priorität, wenn Mitglieder, die mit mehreren Warteschlangen.",
-      "JOINWHENEMPTY": "Steuert, ob ein Anrufer wird zur Warteschlange hinzugefügt werden, wenn keine Mitglieder verfügbar sind.",
-      "LEAVEWHENEMPTY": "Zur Kontrolle, ob die Anrufer aus der Warteschlange, wenn die Mitglieder nicht mehr bereit sind, Anrufe zu beantworten.",
-      "ANNOUNCEFREQUENCY": "Legt fest, wie oft sollten wir den Anrufer ankündigen und/oder geschätzte Wartezeit in der Warteschlange. Setzen Sie diesen Wert auf Null, um die Funktion zu deaktivieren.",
-      "MINANNOUNCEFREQUENCY": "Gibt die minimale Zeit, die verstreichen müssen, bevor wir Ihnen die Anrufer in der Warteschlange wieder. Dieser wird verwendet, wenn der Anrufer die Position kann sich häufig ändern, um zu verhindern, dass der Anrufer hören mehrere Updates in einem kurzen Zeitraum.",
-      "PERIODICANNOUNCEFREQUENCY": "Gibt an, wie oft wir sollten regelmäßige Ansagen, die dem Anrufer vorgespielt werden.",
-      "ANNOUNCEPOSITIONLIMIT": "Sie kann verwendet werden, wenn Sie definiert haben, verkünden-Position entweder als Begrenzung oder mehr.",
-      "AFTERCALLWORKDURATION": "Die Dauer der Pause durch die Option \"Arbeit nach Anruf",
-      "MEMBERDELAY": "Sie kann verwendet werden, wenn Sie wollen, dass es eine Verzögerung, bevor der Anrufer und Mitglied der Warteschlange, die miteinander verbunden sind.",
-      "MUSICONHOLD": "Setzt die Musik klasse verwendet werden, die von einer bestimmten Warteschlange an.",
-      "ANNOUNCETOAGENT": "Für die Wiedergabe einer Ansage auf den Agenten, der den Anruf entgegengenommen hat, ihn wissen zu lassen, was der Anrufer die Warteschlange aus.",
-      "RANDOMPERIODICANNOUNCE": "Falls auf Ja eingestellt, wird die festgelegte regelmäßige Mitteilungen in einer zufälligen Reihenfolge.",
-      "ANNOUNCEHOLDTIME": "Legt fest, ob die geschätzte Wartezeit gespielt werden sollte zusammen mit den regelmäßigen Ankündigungen.",
-      "ANNOUNCECALLERPOSITION": "Legt fest, ob es sich bei dem Anrufer seine Position in der Warteschlange mitgeteilt werden sollten. Wenn die Einstellung Nein lautet, die Position wird nicht bekannt gegeben. Falls auf Ja eingestellt, wird die Position des Anrufers wird immer bekannt gegeben. Wenn der Wert überschritten wird, wird der Anrufer hört ihre Position in der Warteschlange nur, wenn er sich innerhalb der Grenze von AK-Position. Wenn der Wert auf Mehr, hört der Anrufer ihre Position, wenn es über die Zahl von AK-Position.",
-      "REPORTHOLDTIMEAGENT": "Die Berichterstattung über die CLI des Anrufers mit der Zeit in der Warteschleife in der Warteschlange vor.",
-      "PERIODICANNOUNCE": "Eine Reihe von regelmäßigen Mitteilungen gespielt zu werden, in der Reihenfolge wiedergegeben, in der sie definiert sind.",
-      "HOLDTIMEANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Hold\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "YOUARENEXTANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Sie sind jetzt in erster Linie\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "THEREAREANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Es gibt\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "WAITINGCALLSANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Wartende Anrufe\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "ESTIMATEDHOLDTIMEANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Die voraussichtliche Wartezeit ist\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "MINUTESANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"min\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "MINUTEANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"min\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "SECONDSANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Sekunden\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "THANKYOUANNOUNCE": "Wenn nicht definiert, wird die Standardeinstellung (\"Vielen Dank für Ihre Geduld.\"). Wenn Sie auf einen leeren Wert, wird die Aufforderung werden nicht gespielt.",
-      "AFTERCALLWORK": "Wenn der Agent aktiv ist, wird auf eine Pause nach einer abgeschlossenen Anruf in der Warteschlange",
-      "AUTOPAUSE": "Aktiviert/Deaktiviert die automatische Unterbrechung der Mitglieder, die es versäumen, um einen Anruf zu beantworten. Wenn aktiv, wird diese Mitgliedstaaten angehalten zu werden in allen Warteschlangen er Mitglied ist.",
-      "RINGINUSE": "Verwendet werden, um zu vermeiden, Senden von Anrufen an Mitglieder, deren Status im Einsatz ist.",
-      "TIMEOUTRESTART": "Falls auf Ja eingestellt, wird das Timeout für einen Agenten zu beantworten, wenn entweder ein Besetztzeichen oder wird mit dem Status \"Überlastung des Kanals.",
-      "CONTEXT": "Ermöglicht einem Anrufer zu beenden, die die Warteschlange durch Drücken einer einzigen Taste MFV-Ziffer. Wenn Sie einen Kontext angegeben ist und der Anrufer gibt eine Zahl, Ziffer wird versuchen, die angepasst werden können, im Rahmen festgelegt, und es wird auch weiterhin die Ausführung Nummernplan.",
-      "SETINTERFACEVARIABLES": "Falls auf Ja eingestellt, kurz vor dem Anrufer, die mit einer Warteschlange, die einige Variablen werden(siehe wiki)",
-      "SETQUEUEVARIABLES": "Falls auf Ja eingestellt, kurz vor dem Anrufer, die mit einer Warteschlange und kurz vor dem Anrufer die Warteschlange verlassen einige Variablen werden(siehe wiki)",
-      "SETQUEUEENTRYVARIABLES": "Falls auf Ja eingestellt, kurz vor dem Anrufer, die mit einer Warteschlange, die einige Variablen werden(siehe wiki)",
+      "TIMEOUT": "Zeitüberschreitung in Sekunden",
+      "MAXLENGTH": "Maximaler Anrufer in der Warteschlange. Wenn Wert 0, dann keine Begrenzung.",
+      "RETRY": "Klingelzeit in Sekunden pro Mitglied. Danach erfolgt ein weiterer Versuch bei der nächsten freien Nebenstelle.",
+      "WRAPUPTIME": "Nacharbeitszeit in Sekunden, bis ein Nutzer nach einem Anruf wieder verfügbar ist.",
+      "WEIGHT": "Gewichtung der Warteschlange. Ein höherer Wert bedeutet eine Priorisierung gegenüber anderen Warteschlangen.",
+      "JOINWHENEMPTY": "Legt fest, ob ein Anruf in die Warteschlange eintreten kann, wenn dort keine Nutzer angemeldet sind.",
+      "LEAVEWHENEMPTY": "Wirft den Anruf aus der Warteschlange, wenn dort kein Nutzer angemeldet ist.",
+      "ANNOUNCEFREQUENCY": "Intervall für automatische Ansagen der Wartezeit, Position, etc. Der Wert 0 deaktiviert diese Option.",
+      "MINANNOUNCEFREQUENCY": "Minimales Intervall für die Ansagen der Wartezeit. Verhindert, dass ein Nutzer bei häufigen Wechsel der Warteposition zu viele Ansagen erhält.",
+      "PERIODICANNOUNCEFREQUENCY": "Legt fest, wie oft die sich wiederholenden Ansagen gespielt werden sollen",
+      "ANNOUNCEPOSITIONLIMIT": "Wird verwendet, wenn der Wert für die Warteposition auf \"Limitierung\" oder \"Mehr\" gestellt wird.",
+      "AFTERCALLWORKDURATION": "Die Dauer der Nacharbeit nach einem Anruf",
+      "MEMBERDELAY": "Erstellt eine Verzögerung des Anrufes für bestimmte Agenten. Kann zum Skillbasierten Routing verwendet werden.",
+      "MUSICONHOLD": "Legt die Haltemusik auf Basis der Warteschlange fest",
+      "ANNOUNCETOAGENT": "Legt fest, ob der Agent vor Annahme des Anrufes einen Hinweis auf die eingehende Warteschlange hört",
+      "RANDOMPERIODICANNOUNCE": "Bei ja, werden die zugewiesenen Ansagen zufällig abgespielt",
+      "ANNOUNCEHOLDTIME": "Spielt die geschätzte Wartezeit zusammen oder ohne die sich wiederholenden Ansagen ab.",
+      "ANNOUNCECALLERPOSITION": "Definiert die Ansage der Warteposition für den Anrufer. Nein = Niemals; Ja = Immer; Limitierung = nur, wenn die Zeit innerhalb dem eingetragenen Wert liegt; Mehr = nur, wenn die Zeit oberhalb dem eingetragenen Wert liegt ",
+      "REPORTHOLDTIMEAGENT": "Haltezeiten der Agenten in den Berichten verwenden",
+      "PERIODICANNOUNCE": "Sich wiederholende Ansagen; können je nach Konfiguration in definierter Reihenfolge oder zufällig abgespielt werden.",
+      "HOLDTIMEANNOUNCE": "Ansage der Wartezeit. Leer lassen zum Überspringen",
+      "YOUARENEXTANNOUNCE": "Ansage \"Sie sind an erster Position der Warteschlange\", Leer lassen zum Überspringen",
+      "THEREAREANNOUNCE": "Ansage \"Es befinden sich..\" Leer lassen zum Überspringen",
+      "WAITINGCALLSANNOUNCE": "Ansage \"...Anrufe in der Warteschlange\" Leer lassen zum Überspringen",
+      "ESTIMATEDHOLDTIMEANNOUNCE": "Ansage: \"Die geschätzte Wartezeit beträgt derzeit...\" Leer lassen zum Überspringen",
+      "MINUTESANNOUNCE": "Ansage \"Minuten\"",
+      "MINUTEANNOUNCE": "Ansage \"Minute\"",
+      "SECONDSANNOUNCE": "Ansage \"Sekunden\" Leer lassen zum Überspringen",
+      "THANKYOUANNOUNCE": "Ansage \"Vielen Dank für Ihre Geduld\" Leer lassen zum Überspringen",
+      "AFTERCALLWORK": "Wenn aktiviert, erhalten die Agenten eine kurze Pause nach jedem Anruf",
+      "AUTOPAUSE": "Aktiviert/Deaktiviert die automatische Pause der Agenten, bei einem verpassten Anruf. Hinweis: bezieht sich dann auf alle Anruf-Warteschlangen des Agenten.",
+      "RINGINUSE": "Verhindert das Klingeln bei Agenten, deren Nebenstelle in Verwendung ist",
+      "TIMEOUTRESTART": "Wenn ja, wird die Zeitüberschreitung bei Agenten mit \"Besetzt\" oder \"Verbindungsfehler\"-Status übersprungen",
+      "CONTEXT": "Ermöglicht einem Anrufer, durch Drücken einer einzelnen Taste, die Warteschlange zu verlassen.",
+      "SETINTERFACEVARIABLES": "Definiert die Variablen im Interface, welche bei einem Anruf übergeben werden können. ",
+      "SETQUEUEVARIABLES": "Definiert die Variablen in der Warteschlange, welche bei einem Anruf übergeben werden können. ",
+      "SETQUEUEENTRYVARIABLES": "Definiert die Variablen beim Eintritt in die Warteschlange, welche bei einem Anruf übergeben werden können. ",
       "RECORDING": "Aktivieren der Aufzeichnung",
-      "VOICEMAIL_CONTEXT": "Im Rahmen der relativen Erweiterung.",
+      "VOICEMAIL_CONTEXT": "Kontext der verwendeten Nebenstellen",
       "NAME": "Nur Zahlen, Buchstaben und Sonderzeichen (._) werden unterstützt.",
       "CALLERIDALL": "Unterstützte Formate: \"CallerId\" & lt; number & gt;",
       "CALLER_ID": "Unterstützte Formate: \"CallerId\" & lt; number & gt;",
-      "MANDATORYDISPOSITIONPAUSEID": "Pausenstatus, der während der Zwangsdisposition festgelegt werden soll",
-      "SERVICELEVEL": "Zweite Einstellungen für Service Level (Standard = 0, kein SL). Wird für Service Level-Statistiken verwendet (Anrufe werden innerhalb des Service Level-Zeitrahmens beantwortet)",
-      "MONITORFORMAT": "Gibt das Format der Aufnahmedatei an. Wenn es auf 'inaktiv' gesetzt ist, werden Anrufe nicht aufgezeichnet",
+      "MANDATORYDISPOSITIONPAUSEID": "Pausenstatus, welcher während einer erforderlichen Qualifizierung verwendet wird",
+      "SERVICELEVEL": "Zweite Einstellungen für Service-Level (Standard = 0, kein SL). Wird für Service Level-Statistiken verwendet (Anrufe werden innerhalb des Service Level-Zeitrahmens beantwortet)",
+      "MONITORFORMAT": "Gibt das Format der Aufzeichnungsdatei an. Bei 'inaktiv', werden Anrufe nicht aufgezeichnet",
       "SAVE_ROUTES": "Die Streckenführung wurde geändert. Denken Sie daran, zu speichern, wenn Sie Ihre Änderungen nicht verlieren möchten."
     },
-    "MUSICONHOLD": "Musik auf Halten",
-    "ANNOUNCETOAGENT": "Geben Sie Agent",
-    "ANNOUNCEMENTS": "Ankündigungen",
-    "ADVANCED": "Erweiterte",
-    "ANNOUNCEFREQUENCY": "Frequenz ankündigen",
-    "MINANNOUNCEFREQUENCY": "Minimale Frequenz ankündigen",
-    "PERIODICANNOUNCEFREQUENCY": "Periodische Frequenz ankündigen",
-    "RANDOMPERIODICANNOUNCE": "Random Periodische verkünden",
-    "ANNOUNCEHOLDTIME": "Geben Sie Zeit",
-    "ANNOUNCECALLERPOSITION": "Position des Anrufers bekannt",
-    "ANNOUNCEPOSITIONLIMIT": "Geben Position Limit",
-    "REPORTHOLDTIMEAGENT": "Bericht Agenten",
-    "PERIODICANNOUNCE": "Periodische verkünden",
-    "HOLDTIMEANNOUNCE": "Zeit in der Warteschleife verkünden",
-    "YOUARENEXTANNOUNCE": "\"Sie sind weiter' verkünden",
-    "THEREAREANNOUNCE": "'Es gibt' verkünden",
-    "WAITINGCALLSANNOUNCE": "Wartende Anrufe,",
-    "ESTIMATEDHOLDTIMEANNOUNCE": "Geschätzte Zeit halten,",
-    "MINUTESANNOUNCE": "Minuten ankündigen",
-    "MINUTEANNOUNCE": "Minute verkünden",
-    "SECONDSANNOUNCE": "Sekunden,",
+    "MUSICONHOLD": "Wartemusik",
+    "ANNOUNCETOAGENT": "Ansage an Agenten",
+    "ANNOUNCEMENTS": "Ansagen",
+    "ADVANCED": "Erweitert",
+    "ANNOUNCEFREQUENCY": "Ansagefrequenz",
+    "MINANNOUNCEFREQUENCY": "Min. Ansagefrequenz",
+    "PERIODICANNOUNCEFREQUENCY": "Frequenz wiederholende Ansagen",
+    "RANDOMPERIODICANNOUNCE": "Zufällige Ansagen",
+    "ANNOUNCEHOLDTIME": "Wartezeit ansagen",
+    "ANNOUNCECALLERPOSITION": "Warteposition ansagen",
+    "ANNOUNCEPOSITIONLIMIT": "Limitierung Warteposition ansagen",
+    "REPORTHOLDTIMEAGENT": "Haltezeit in Agentenbericht",
+    "PERIODICANNOUNCE": "Wiederholende Ansagen",
+    "HOLDTIMEANNOUNCE": "Wartezeit ansagen",
+    "YOUARENEXTANNOUNCE": "Erste Position",
+    "THEREAREANNOUNCE": "Es befinden sich",
+    "WAITINGCALLSANNOUNCE": "Wartende Anrufe",
+    "ESTIMATEDHOLDTIMEANNOUNCE": "Geschätzte Wartezeit ansagen",
+    "MINUTESANNOUNCE": "Minuten",
+    "MINUTEANNOUNCE": "Minute",
+    "SECONDSANNOUNCE": "Sekunden",
     "THANKYOUANNOUNCE": "'Vielen Dank' verkünden",
     "AUTOPAUSE": "Auto Pause",
-    "AFTERCALLWORK": "Arbeit nach Anruf",
-    "AFTERCALLWORKDURATION": "Arbeit nach Anruf Dauer",
-    "RINGINUSE": "Ring in Verwendung",
-    "MEMBERDELAY": "Die Verzögerung",
-    "TIMEOUTRESTART": "Timeout starten",
+    "AFTERCALLWORK": "Nacharbeit",
+    "AFTERCALLWORKDURATION": "Dauer Nacharbeit",
+    "RINGINUSE": "Klingeln bei Besetzt",
+    "MEMBERDELAY": "Verzögerung",
+    "TIMEOUTRESTART": "Zeitüberschreitung",
     "MONITORFORMAT": "Aufzeichnungsformat",
-    "SETINTERFACEVARIABLES": "Die Interface- Variablen",
-    "SETQUEUEVARIABLES": "Die Warteschlange Variablen",
-    "SETQUEUEENTRYVARIABLES": "Die Warteschlange ENTRY-Variablen",
+    "SETINTERFACEVARIABLES": "Interface-Variablen",
+    "SETQUEUEVARIABLES": "Warteschlangen-Variablen",
+    "SETQUEUEENTRYVARIABLES": "Warteschlangen-Eintritts-Variablen",
     "VARIABLE": "Variable",
-    "CONTEXT": "Kontext",
+    "CONTEXT": "Kontext Austritt aus Warteschlange",
     "SAVE": "Speichern",
     "SETTINGS": "Einstellungen",
-    "INBOUNDROUTES": "Ankommende Routen",
+    "INBOUNDROUTES": "Eingehende Routen",
     "PHONENUMBER": "Telefonnummer",
     "ADD_INBOUNDROUTE": "Eingehende Route hinzufügen",
-    "EDIT_INBOUNDROUTE": "Route für eingehende Anrufe bearbeiten.",
-    "DELETE_INBOUNDROUTE": "Löschen der Route für eingehende Anrufe",
+    "EDIT_INBOUNDROUTE": "Eingehende Route bearbeiten",
+    "DELETE_INBOUNDROUTE": "Eingehende Route löschen",
     "ACTIONS": "Aktionen",
-    "OUTBOUNDROUTES": "Abgehende Routen",
-    "DESTINATIONPATTERN": "Ziel Muster",
+    "OUTBOUNDROUTES": "Ausgehende Routen",
+    "DESTINATIONPATTERN": "Ziel-Pattern",
     "ADD_OUTBOUNDROUTE": "Ausgehende Route hinzufügen",
-    "EDIT_OUTBOUNDROUTE": "Abgehende Route bearbeiten",
-    "DELETE_OUTBOUNDROUTE": "Abgehende Route löschen",
-    "CUTDIGITS": "Die Ziffern",
-    "RECORDING": "Aufnahme",
+    "EDIT_OUTBOUNDROUTE": "Ausgehende Route bearbeiten",
+    "DELETE_OUTBOUNDROUTE": "Ausgehende Route löschen",
+    "CUTDIGITS": "Ziffern",
+    "RECORDING": "Aufzeichnung",
     "RECORDINGFORMAT": "Aufzeichnungsformat",
     "INTERNALROUTES": "Interne Routen",
-    "ADD_INTERNALROUTE": "Fügen Sie interne Routen",
+    "ADD_INTERNALROUTE": "Interne Route hinzufügen",
     "EDIT_INTERNALROUTE": "Interne Route bearbeiten",
-    "DELETE_INTERNALROUTE": "Interne Routen löschen",
+    "DELETE_INTERNALROUTE": "Interne Route löschen",
     "CONTEXTS": "Kontexte",
-    "ADD_CONTEXT": "Rahmen hinzufügen",
+    "ADD_CONTEXT": "Kontext hinzufügen",
     "EDIT_CONTEXT": "Kontext bearbeiten",
-    "DELETE_CONTEXT": "Löschen von Rahmen",
-    "VOICEMAILS": "Von Voicemails",
-    "ADD_VOICEMAIL": "Fügen Sie Voicemail",
-    "EDIT_VOICEMAIL": "Bearbeiten von Voicemail",
+    "DELETE_CONTEXT": "Kontext löschen",
+    "VOICEMAILS": "Voicemails",
+    "ADD_VOICEMAIL": "Voicemail hinzufügen",
+    "EDIT_VOICEMAIL": "Voicemail bearbeiten",
     "DELETE_VOICEMAIL": "Voicemail löschen",
-    "FULLNAME": "Voller Name",
+    "FULLNAME": "Vollständiger Name",
     "EMAIL": "E-Mail",
     "MAILBOX": "Mailbox",
     "PASSWORD": "Passwort",
     "CONFIRM_PASSWORD": "Passwort bestätigen",
     "TIMEZONE": "Zeitzone",
-    "ATTACH": "Befestigen Sie",
+    "ATTACH": "Anhängen",
     "ENVELOPE": "Umschlag",
     "DELETE": "Löschen",
     "EMAILBODY": "E-Mail-Text",
     "EMAILSUBJECT": "Betreff der E-Mail",
-    "MAXSECONDS": "In Sekunden",
+    "MAXSECONDS": "Max. Sekunden",
     "MAXMESSAGES": "Max. Nachrichten",
     "MESSAGES": "Nachrichten",
     "SORT": "Sortieren",
-    "ADD_MUSICONHOLD": "Hinzufügen von Musik auf Halten",
-    "MUSICONHOLDS": "Musik auf Halten",
-    "EDIT_MUSICONHOLD": "Bearbeiten Musik auf Halten",
-    "DELETE_MUSICONHOLD": "Löschen Sie Musik auf Halten",
+    "ADD_MUSICONHOLD": "Wartemusik hinzufügen",
+    "MUSICONHOLDS": "Wartemusik",
+    "EDIT_MUSICONHOLD": "Wartemusik bearbeiten",
+    "DELETE_MUSICONHOLD": "Wartemusik löschen",
     "DIRECTORY": "Verzeichnis",
     "AUDIOFILES": "Audiodateien",
-    "RECORDINGS": "Aufnahmen",
-    "CHANSPY": "ChanSpy",
+    "RECORDINGS": "Aufzeichnungen",
+    "CHANSPY": "Listen-In",
     "PREFIX": "Präfix",
     "OPTIONS": "Optionen",
-    "AUTH": "Auth",
-    "ADD_CHANSPY": "Fügen Sie ChanSpy",
-    "EDIT_CHANSPY": "Bearbeiten Sie ChanSpy",
-    "DELETE_CHANSPY": "Löschen Sie ChanSpy",
+    "AUTH": "Authentifizierung",
+    "ADD_CHANSPY": "Listen-In hinzufügen",
+    "EDIT_CHANSPY": "Listen-In bearbeiten",
+    "DELETE_CHANSPY": "Listen-In löschen",
     "AGENTS": "Agenten",
     "TELEPHONES": "Telefone",
     "QUEUES": "Warteschlangen",
-    "QUEUE_CALLS": "Anrufe aus einer Warteschlange",
-    "QUEUE_PARAMETERS": "Queue Parameter",
+    "QUEUE_CALLS": "Anrufe in Warteschlange",
+    "QUEUE_PARAMETERS": "Warteschlangen Parameter",
     "ABANDONED_CALLS": "Abgebrochene Anrufe",
     "OUTBOUND_CALLS": "Ausgehende Anrufe",
     "AGI": "AGI",
-    "DIAL": "Kurzwahl",
+    "DIAL": "Wählen",
     "CALLYSQUARE": "CallySquare",
-    "INTERNALDIAL": "Interne Wahl",
-    "EXTERNALDIAL": "Externes Wählen",
-    "RINGGROUP": "Ring-Gruppe",
+    "INTERNALDIAL": "Interner Anruf",
+    "EXTERNALDIAL": "Externer Anruf",
+    "RINGGROUP": "Rufgruppe",
     "PLAYBACK": "Wiedergabe",
     "QUEUE": "Warteschlange",
     "SET": "Set",
     "VOICEMAIL": "Voicemail",
     "GOTO": "Gehe zu",
     "HANGUP": "Auflegen",
-    "CUSTOM": "Benutzerdefinierte",
+    "CUSTOM": "Benutzerdefiniert",
     "PROJECT": "Cally-Square Projekt",
     "TECHNOLOGY/RESOURCE": "Technologie-/Ressourcen",
     "URL": "URL",
-    "EDIT_APP": "Anwendung bearbeiten.",
+    "EDIT_APP": "App bearbeiten.",
     "EDIT_INTERVAL": "Intervall bearbeiten",
-    "DELETE_APP": "Anwendung löschen",
+    "DELETE_APP": "App löschen",
     "INTERVALS": "Intervalle",
     "USER": "Benutzer",
-    "TRUNK": "Amtsleitung",
+    "TRUNK": "Trunk",
     "PHONE": "Telefon",
     "AUDIO_FILES": "Audiodateien",
-    "ANNOUNCE_OVERRIDES": "Überschreibt ankündigen",
+    "ANNOUNCE_OVERRIDES": "Überschreibungen ankündigen",
     "MACRO": "Makro",
     "GOSUB": "GoSub",
     "RULE": "Regel",
@@ -258,151 +258,151 @@
     "ANSWER": "Antwort",
     "VALUE": "Wert",
     "MAILBOX@CONTEXT": "Mailbox@Kontext",
-    "EXTENSION": "Erweiterung",
+    "EXTENSION": "Nebenstelle",
     "PRIORITY": "Priorität",
-    "HANGUP_CAUSE": "Ursache auflegen",
-    "OUTBOUNDDIAL": "Wählen Sie für abgehende Anrufe",
-    "CALLER_ID": "Die Anrufer-ID",
+    "HANGUP_CAUSE": "Ablehnungsgrund",
+    "OUTBOUNDDIAL": "Extern wählen",
+    "CALLER_ID": "Anrufer-ID",
     "NO_MESSAGE_AVAILABLE": "Keine Meldungen vorhanden",
     "NO_SOUND_AVAILABLE": "Kein Ton verfügbar",
-    "VOICERECORDINGS": "Sprachaufnahmen",
-    "CHANSPIES": "Chan Spies",
-    "VOICE": "Voice",
+    "VOICERECORDINGS": "Sprachaufzeichnungen",
+    "CHANSPIES": "Listen-Ins",
+    "VOICE": "Anrufe",
     "REALTIME": "Echtzeit",
-    "ID": "Id",
+    "ID": "ID",
     "VOICEMAIL_CONTEXT": "Kontext",
     "NO_MOHSOUND_AVAILABLE": "Keine Wartemusik verfügbar",
     "FILE": "Datei",
-    "ADD_MOHSOUND": "Hinzufügen von Musik auf Halten sound",
-    "DOWNLOAD_MOHSOUND": "Download Music-on-Hold sound",
-    "DELETE_MOHSOUND": "Löschen Sie Music On Hold sound",
+    "ADD_MOHSOUND": "Musik bei Halten hinzufügen",
+    "DOWNLOAD_MOHSOUND": "Musik bei Halten herunterladen",
+    "DELETE_MOHSOUND": "Musik bei Halten löschen",
     "UNIQUEID": "Eindeutige ID",
     "AGENT": "Agent",
     "TYPE": "Typ",
     "RATING": "Bewertung",
     "AUDIO": "Audio",
     "DATE": "Datum",
-    "NEW_VOICEQUEUE": "Neue Stimme der Warteschlange",
-    "NEW_INBOUNDROUTE": "Neue Route für eingehende Anrufe",
-    "NEW_OUTBOUNDROUTE": "Neue abgehende Route",
-    "NEW_INTERNALROUTE": "Neue interne Routen",
-    "NEW_CONTEXT": "Neue Kontext",
+    "NEW_VOICEQUEUE": "Neue Anruf-Warteschlange",
+    "NEW_INBOUNDROUTE": "Neue eingehende Route",
+    "NEW_OUTBOUNDROUTE": "Neue ausgehende Route",
+    "NEW_INTERNALROUTE": "Neue interne Route",
+    "NEW_CONTEXT": "Neuer Kontext",
     "NEW_VOICEMAIL": "Neue Voicemail",
-    "NEW_MUSICONHOLD": "Neue Musik auf Halten",
-    "NEW_CHANSPY": "Neue ChanSpy",
-    "PENALTY": "Strafe",
-    "ADD_TEAM_TO_VOICEQUEUE": "Team hinzufügen, Warteschlange",
-    "ADD_AGENT_TO_VOICEQUEUE": "Hinzufügen von Agenten der Warteschlange an die Mailbox",
-    "EDIT_DIAL": "Wählen Sie Bearbeiten.",
+    "NEW_MUSICONHOLD": "Neue Haltemusik",
+    "NEW_CHANSPY": "Neuer Listen-In",
+    "PENALTY": "Verzögerung",
+    "ADD_TEAM_TO_VOICEQUEUE": "Team zur Warteschlange hinzufügen",
+    "ADD_AGENT_TO_VOICEQUEUE": "Agenten zur Warteschlange hinzufügen",
+    "EDIT_DIAL": "Wählen anpassen",
     "EDIT_AGI": "AGI bearbeiten",
-    "EDIT_INTERNALDIAL": "Interne Wahl bearbeiten.",
-    "EDIT_EXTERNALDIAL": "Wählen Sie Externen bearbeiten",
-    "EDIT_RINGGROUP": "Gruppe bearbeiten",
-    "EDIT_PLAYBACK": "Bearbeiten Sie die Wiedergabe",
-    "EDIT_QUEUE": "Bearbeiten von Warteschlangen",
-    "EDIT_SET": "Bearbeiten",
-    "EDIT_GOTO": "Gehe zu bearbeiten.",
-    "EDIT_HANGUP": "Bearbeiten Sie Auflegen",
-    "EDIT_CUSTOM": "Bearbeiten von benutzerdefinierten",
+    "EDIT_INTERNALDIAL": "Internes Wählen bearbeiten",
+    "EDIT_EXTERNALDIAL": "Externes Wählen bearbeiten",
+    "EDIT_RINGGROUP": "Rufgruppe bearbeiten",
+    "EDIT_PLAYBACK": "Wiedergabe bearbeiten",
+    "EDIT_QUEUE": "Warteschlange bearbeiten",
+    "EDIT_SET": "Set bearbeiten",
+    "EDIT_GOTO": "Gehe zu bearbeiten",
+    "EDIT_HANGUP": "Auflegen bearbeiten",
+    "EDIT_CUSTOM": "Benutzerdef. Einstellungen bearbeiten",
     "DURATION": "Dauer",
-    "RECEIVED_AT": "Empfangen am",
+    "RECEIVED_AT": "Eingegangen am",
     "YES": "Ja",
-    "NO": "Keine",
-    "HANGUPCAUSE_1": "1 = Nicht zugewiesene Nummer",
-    "HANGUPCAUSE_16": "16 = Normail Anruf löschen",
-    "HANGUPCAUSE_17": "17 = Benutzer besetzt",
-    "HANGUPCAUSE_18": "18 = Keine Reaktion (Telefon Gerät nicht verbunden)",
+    "NO": "Nein",
+    "HANGUPCAUSE_1": "1 = Nummer nicht zugewiesen",
+    "HANGUPCAUSE_16": "16 = Beenden durch Nutzer",
+    "HANGUPCAUSE_17": "17 = Besetzt",
+    "HANGUPCAUSE_18": "18 = Keine Antwort (Nebenstelle nicht verbunden)",
     "HANGUPCAUSE_21": "21 = Anruf abgelehnt",
-    "HANGUPCAUSE_22": "22 = Anzahl geändert",
-    "HANGUPCAUSE_27": "27 = Ziel nicht in Ordnung",
-    "HANGUPCAUSE_38": "38 = Netzwerk aus, um",
+    "HANGUPCAUSE_22": "22 = Nummer geändert",
+    "HANGUPCAUSE_27": "27 = Ziel nicht verfügbar",
+    "HANGUPCAUSE_38": "38 = Netzwerk nicht verfügbar",
     "HANGUPCAUSE_41": "41 = vorübergehende Störung",
-    "RANDOM": "Random",
+    "RANDOM": "Zufall",
     "ALPHABETICAL": "Alphabetisch",
     "NO_APPS_AVAILABLE": "Keine Anwendungen verfügbar",
-    "DOWNLOAD_VOICERECORDING": "Download Voice Recording",
-    "DELETE_VOICERECORDING": "Löschen von Voice Recording",
-    "INTERNAL": "Interne",
+    "DOWNLOAD_VOICERECORDING": "Sprachaufzeichnung herunterladen",
+    "DELETE_VOICERECORDING": "Sprachaufzeichnung löschen",
+    "INTERNAL": "Intern",
     "PHONE_STATE": "Telefonstatus",
     "PHONE_STATUS": "Telefonstatus",
     "TRUNK_STATUS": "Trunk Status",
     "REGISTERED": "Registriert",
-    "UNREGISTERED": "Unregistrierte",
+    "UNREGISTERED": "Nicht registriert",
     "LAGGED": "Zurück",
     "REACHABLE": "Erreichbar",
     "UNREACHABLE": "Nicht erreichbar",
     "UNKNOWN": "Unbekannt",
-    "NOT_INUSE": "Nicht in Gebrauch",
-    "INUSE": "Im Einsatz",
+    "NOT_INUSE": "Nicht in Verwendung",
+    "INUSE": "In Verwendung",
     "BUSY": "Besetzt",
     "INVALID": "Ungültig",
     "UNAVAILABLE": "Nicht verfügbar",
     "RINGING": "Klingeln",
-    "ONHOLD": "Auf Halten",
-    "RING": "Ring",
-    "UP": "Bis",
-    "INFO": "Info",
-    "TRUNKS": "Amtsleitungen",
+    "ONHOLD": "Halten",
+    "RING": "Klingeln",
+    "UP": "Nach Oben",
+    "INFO": "Information",
+    "TRUNKS": "Trunks",
     "REGISTRY": "Registrierung",
-    "NO_REGISTRY": "Keine registry",
+    "NO_REGISTRY": "Keine Registrierung",
     "LOGGED_IN": "Angemeldet",
     "PAUSED": "Angehalten",
-    "WAITING": "Warten",
-    "TALKING": "Sprechen",
-    "DID": "Haben",
+    "WAITING": "Wartezustand",
+    "TALKING": "Im Gespräch",
+    "DID": "DID",
     "CALLER": "Anrufer",
-    "TOTAL": "Insgesamt",
+    "TOTAL": "Gesamt",
     "ANSWERED": "Beantwortet",
     "ABANDONED": "Abgebrochen",
-    "UNMANAGED": "Nicht verwaltete",
-    "AVG_HOLD_TIME": "Durchschnittl. Warteschleifenzeit",
-    "AVG_DURATION": "Av-Dauer",
-    "AVG_BILLABLE": "Avg Fakturierbaren",
-    "SOURCE": "Quelle",
+    "UNMANAGED": "Nicht bearbeitet",
+    "AVG_HOLD_TIME": "Durchschnittliche Wartezeit",
+    "AVG_DURATION": "Durchschnittliche Dauer",
+    "AVG_BILLABLE": "Durchschnittliche abrechenbare Zeit",
+    "SOURCE": "Ursprung",
     "DESTINATION": "Ziel",
     "REJECTED": "Abgelehnt",
     "FAILED": "Fehlgeschlagen",
-    "CALLED": "Aufgerufen",
+    "CALLED": "Angerufen",
     "CONNECTED": "Verbunden",
     "NO_RATING": "Keine Bewertung",
-    "EDIT_VOICERECORDING": "Edit Voice Recording",
+    "EDIT_VOICERECORDING": "Sprachaufzeichnungen verwalten",
     "APPLICATION_NAME": "Name der Anwendung",
     "ARGUMENTS": "Argumente",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Info",
-    "ADD_AGENT_TO_QUEUE": "Agent zur Warteschlange hinzufügen",
-    "DEFAULT_PAUSE": "Standard PAUSE",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
+    "ADD_AGENT_TO_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "DEFAULT_PAUSE": "Standard Pause",
     "PAUSE": "Pause",
-    "UNPAUSE": "Pause",
-    "REDIRECT_TO_NUMBER": "Umleiten zu: Anzahl",
-    "REDIRECT_TO_AGENT": "Umleiten zu: Agent",
-    "AGENTADD_VOICEQUEUE": "Hinzufügen von Agenten der Warteschlange an die Mailbox",
+    "UNPAUSE": "Fortsetzen",
+    "REDIRECT_TO_NUMBER": "Weiterleiten an Nummer",
+    "REDIRECT_TO_AGENT": "Weiterleiten an Agenten",
+    "AGENTADD_VOICEQUEUE": "Agenten zu Anruf-Warteschlange hinzufügen",
     "APPLICATION": "Anwendung",
     "FILES": "Dateien",
     "FORMAT": "Format",
     "MODE": "Modus",
     "RECORD": "Datensatz",
-    "TEAMADD_VOICEQUEUE": "Hinzufügen Team voicequeue",
-    "NEW_MOHSOUND": "Neue Musik auf Halten",
-    "DOWNLOAD_MESSAGE": "Download",
+    "TEAMADD_VOICEQUEUE": "Team zur Anruf-Warteschlange hinzufügen",
+    "NEW_MOHSOUND": "Neue Wartemusik",
+    "DOWNLOAD_MESSAGE": "Herunterladen",
     "DELETE_MESSAGE": "Löschen",
     "QUEUE_PARAMS": "Queue Parameter",
-    "TOTAL_OFFERED": "Insgesamt",
+    "TOTAL_OFFERED": "Gesamt",
     "READY": "Bereit",
-    "AGENTADD_QUEUE": "Agent hinzufügen Warteschlangen zu Voice",
-    "AGENTSADD_QUEUE": "Hinzufügen von Agenten der Warteschlange an die Mailbox",
-    "ALL_TEAMS": "Alle Mannschaften",
+    "AGENTADD_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "AGENTSADD_QUEUE": "Agenten zur Warteschlangen hinzufügen",
+    "ALL_TEAMS": "Alle Teams",
     "SELECTED_TEAMS": "Ausgewählte Teams",
     "ALL_AGENTS": "Alle Agenten",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
     "CLOSING": "Schließen",
     "TAGS": "Tags",
     "WAITING_FOR_AGENT": "Warten auf Agenten",
-    "EDIT_OUTBOUNDDIAL": "Bearbeiten ausgehenden DFÜ",
-    "ACCOUNTNAME": "Konto Name",
+    "EDIT_OUTBOUNDDIAL": "Wählverhalten ausgehend bearbeiten",
+    "ACCOUNTNAME": "Kontoname",
     "PAGE": "Seite",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "OF": "Von",
-    "DISPOSITION": "Disposition",
+    "OF": "von",
+    "DISPOSITION": "Qualifizierung",
     "WAITING_FOR_AGENTS": "Warten auf Agenten",
     "CHAT": "Chat",
     "MAIL": "E-Mail",
@@ -410,72 +410,75 @@
     "OPENCHANNEL": "Offener Kanal",
     "FAX": "Fax",
     "NO_AGENT_ONLINE": "Kein Agent Online",
-    "PARTIALPAUSE": "Teilweise Pause",
+    "PARTIALPAUSE": "Teilpause",
     "STATUS": "Status",
     "TIMER": "Timer",
     "ALL": "Alle",
     "IDLE": "Leerlauf",
-    "EDIT_TRUNK": "Bearbeiten Trunk",
+    "EDIT_TRUNK": "Trunk bearbeiten",
     "ACTIVE": "Aktiv",
-    "CLEAR": "klar",
+    "CLEAR": "Leeren",
     "CALLS": "Anrufe",
-    "STARTEDAT": "Fing an bei",
-    "ENDEDAT": "Beendet bei",
-    "TAG": "Etikett",
-    "DETAILS": "Einzelheiten",
+    "STARTEDAT": "Startdatum",
+    "ENDEDAT": "Enddatum",
+    "TAG": "Tag",
+    "DETAILS": "Details",
     "BILLABLESECONDS": "Abrechenbare Sekunden",
-    "ANSWEREDAT": "Beantwortet bei",
-    "NOTE": "Hinweis",
+    "ANSWEREDAT": "Beantwortet am",
+    "NOTE": "Notiz",
     "CLOSE": "Schließen",
-    "SELECT_DATE": "Wählen Sie Startdatum",
-    "SELECT_TYPE": "Art auswählen",
-    "ABANDONEDCALLS": "Verlassene Warteschlangenanrufe",
+    "SELECT_DATE": "Startdatum auswählen",
+    "SELECT_TYPE": "Typ auswählen",
+    "ABANDONEDCALLS": "Abgebrochene Anrufe",
     "ADD_VOICEPREFIX": "Präfix hinzufügen",
-    "AGENTADD_VOICEPREFIX": "Fügen Sie Agent zu Präfix hinzu",
+    "AGENTADD_VOICEPREFIX": "Agentenpräfix hinzufügen",
     "DELETE_VOICEPREFIX": "Präfix löschen",
     "EDIT_VOICEPREFIX": "Präfix bearbeiten",
     "NEW_VOICEPREFIX": "Neues Präfix",
-    "VOICEPREFIXES": "Vorgegebene Präfixe",
+    "VOICEPREFIXES": "Präfixe für Sprachanrufe",
     "CALLERIDALL": "Anruferidentifikation",
     "OUTBOUNDROUTE": "Ausgehende Route",
-    "LOGIN_TIME": "Login-Zeit",
-    "PAUSE_TIME": "Pausenzeit",
+    "LOGIN_TIME": "Zeit angemeldet",
+    "PAUSE_TIME": "Zeit in Pause",
     "DIALER": "Dialer",
-    "INBOUND": "Eingehende",
+    "INBOUND": "Eingehend",
     "OUTBOUND": "Ausgehend",
-    "MANDATORYDISPOSITION": "Zwingende Disposition",
-    "MANDATORYDISPOSITIONPAUSEID": "Status der obligatorischen Dispositionspause",
-    "TEAMS_ASSOCIATION": "Vereinigung der Mannschaften",
+    "MANDATORYDISPOSITION": "Qualifikation erforderlich",
+    "MANDATORYDISPOSITIONPAUSEID": "PausenID bei erforderlicher Qualifizierung",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
     "CANT_DOWNLOAD_THIS_FILE": "Diese Datei kann nicht heruntergeladen werden",
     "FILE_NOT_FOUND": "Datei nicht gefunden",
     "SCREENRECORDING": "Bildschirmaufzeichnung verwalten",
-    "START_SCREENRECORDING": "Starten Sie die Bildschirmaufnahme",
-    "STOP_SCREENRECORDING": "Beenden Sie die Bildschirmaufnahme",
-    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme verfügbar",
-    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
-    "WRONG_EXTENSION": "Die Datei weist die falsche Erweiterung auf",
+    "START_SCREENRECORDING": "Bildschirmaufzeichnung starten",
+    "STOP_SCREENRECORDING": "Bildschirmaufzeichnung beenden",
+    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufzeichnung verfügbar",
+    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufzeichnung läuft",
+    "WRONG_EXTENSION": "Ungültige Dateiendung",
     "DOWNLOADTRANSCRIBE_VOICERECORDING": "Transkript herunterladen",
     "FAILUREREASON": "Fehlergrund",
-    "RUNSENTIMENT_VOICERECORDING": "Führen Sie Sentiment",
-    "RUNTRANSCRIBESENTIMENT_VOICERECORDING": "Führen Sie Transcribe & Sentiment aus",
-    "RUNTRANSCRIBE_VOICERECORDING": "Führen Sie Transcribe aus",
-    "SENTIMENT": "Gefühl",
-    "SENTIMENTANALYSIS": "Stimmungsanalyse",
+    "RUNSENTIMENT_VOICERECORDING": "Starten Sprachaufzeichnung inkl. Sentiment",
+    "RUNTRANSCRIBESENTIMENT_VOICERECORDING": "Transkription und Sentinemtaufzeichnung starten",
+    "RUNTRANSCRIBE_VOICERECORDING": "Transkription starten",
+    "SENTIMENT": "Sentiment",
+    "SENTIMENTANALYSIS": "Sentiment-Analyse",
     "SENTIMENT_MIXED": "Gemischt",
     "SENTIMENT_NEGATIVE": "Negativ",
     "SENTIMENT_NEUTRAL": "Neutral",
     "SENTIMENT_POSITIVE": "Positiv",
     "TEXT": "Text",
     "TRANSCRIBE": "Transkribieren",
-    "TRANSCRIBESTATUS_COMPLETED": "Abgeschlossen",
-    "TRANSCRIBESTATUS_FAILED": "Gescheitert",
+    "TRANSCRIBESTATUS_COMPLETED": "Transkription abgeschlossen",
+    "TRANSCRIBESTATUS_FAILED": "Transkription fehlgeschlagen",
     "TRANSCRIBESTATUS_IN_PROGRESS": "In Bearbeitung",
     "TRANSCRIBESTATUS_NEW": "Neu",
     "TRANSCRIPT": "Transkript",
     "TRANSCRIPTANALYSIS": "Transkript & Analyse",
     "SERVICELEVEL": "Service Level",
-    "SECOND_LEVEL_DISPOSITION": "Disposition der zweiten Ebene",
-    "THIRD_LEVEL_DISPOSITION": "Disposition der dritten Ebene",
-    "ALIAS": "Alias"
+    "SECOND_LEVEL_DISPOSITION": "Qualifizierung der zweiten Ebene",
+    "THIRD_LEVEL_DISPOSITION": "Qualifizierung der dritten Ebene",
+    "TEAMADD_VOICEPREFIX": "Team zum Präfix hinzufügen",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "maximale Kapazität",
+    "WORKING": "Arbeiten"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/en.json b/public/app/main/apps/voice/i18n/en.json
index 0e070f7..28d2655 100644
--- a/public/app/main/apps/voice/i18n/en.json
+++ b/public/app/main/apps/voice/i18n/en.json
@@ -347,6 +347,7 @@
     "ADD_VOICEPREFIX": "Add Prefix",
     "EDIT_VOICEPREFIX": "Edit Prefix",
     "AGENTADD_VOICEPREFIX": "Add Agent to Prefix",
+    "TEAMADD_VOICEPREFIX": "Add Team to Prefix",
     "DELETE_VOICEPREFIX": "Delete Prefix",
     "OUTBOUNDROUTE": "Outbound Route",
     "CALLERIDALL": "Caller Id",
@@ -378,6 +379,8 @@
     "RUNSENTIMENT_VOICERECORDING": "Run Sentiment",
     "SENTIMENT": "Sentiment",
     "SERVICELEVEL": "Service level",
+    "MAXCAPACITY": "Max capacity",
+    "WORKING": "Working",
     "LEGEND": {
       "CUSTOM_APPLICATION": "(*) - Custom application"
     },
diff --git a/public/app/main/apps/voice/i18n/es.json b/public/app/main/apps/voice/i18n/es.json
index 90b1016..d815a36 100644
--- a/public/app/main/apps/voice/i18n/es.json
+++ b/public/app/main/apps/voice/i18n/es.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Nivel de servicio",
     "SECOND_LEVEL_DISPOSITION": "Tipificación de segundo nivel",
     "THIRD_LEVEL_DISPOSITION": "Tipificación de tercer nivel",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Agregar equipo al prefijo",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "máxima capacidad",
+    "WORKING": "Laboral"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/et.json b/public/app/main/apps/voice/i18n/et.json
index bd75c5e..e8fc04a 100644
--- a/public/app/main/apps/voice/i18n/et.json
+++ b/public/app/main/apps/voice/i18n/et.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Teenuse tase",
     "SECOND_LEVEL_DISPOSITION": "Teise taseme korraldus",
     "THIRD_LEVEL_DISPOSITION": "Kolmanda taseme korraldus",
-    "ALIAS": "Teise nimega"
+    "TEAMADD_VOICEPREFIX": "Lisa meeskond eesliidesse",
+    "ALIAS": "Teise nimega",
+    "MAXCAPACITY": "Maksimaalne mahutavus",
+    "WORKING": "Töötab"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/fa.json b/public/app/main/apps/voice/i18n/fa.json
index 64fd7ba..eed1435 100644
--- a/public/app/main/apps/voice/i18n/fa.json
+++ b/public/app/main/apps/voice/i18n/fa.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "سطح سرویس",
     "SECOND_LEVEL_DISPOSITION": "دفع سطح دوم",
     "THIRD_LEVEL_DISPOSITION": "دفع سطح سوم",
-    "ALIAS": "نام مستعار"
+    "TEAMADD_VOICEPREFIX": "اضافه کردن تیم به پیشوند",
+    "ALIAS": "نام مستعار",
+    "MAXCAPACITY": "حداکثر ظرفیت",
+    "WORKING": "کار کردن"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/fi.json b/public/app/main/apps/voice/i18n/fi.json
index f1874d1..3745db0 100644
--- a/public/app/main/apps/voice/i18n/fi.json
+++ b/public/app/main/apps/voice/i18n/fi.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Palvelutaso",
     "SECOND_LEVEL_DISPOSITION": "Toisen tason sijoitus",
     "THIRD_LEVEL_DISPOSITION": "Kolmannen tason sijoitus",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Lisää joukkue etuliitteeseen",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Max kapasiteetti",
+    "WORKING": "Työskentely"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/fr.json b/public/app/main/apps/voice/i18n/fr.json
index ca6418d..627cf9d 100644
--- a/public/app/main/apps/voice/i18n/fr.json
+++ b/public/app/main/apps/voice/i18n/fr.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Niveau de service",
     "SECOND_LEVEL_DISPOSITION": "Disposition de deuxième niveau",
     "THIRD_LEVEL_DISPOSITION": "Disposition de troisième niveau",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Ajouter une équipe au préfixe",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "capacité maximale",
+    "WORKING": "Travail"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/he.json b/public/app/main/apps/voice/i18n/he.json
index 2da30a3..84f003f 100644
--- a/public/app/main/apps/voice/i18n/he.json
+++ b/public/app/main/apps/voice/i18n/he.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "רמת שירות",
     "SECOND_LEVEL_DISPOSITION": "נטייה בדרגה שנייה",
     "THIRD_LEVEL_DISPOSITION": "נטייה ברמה השלישית",
-    "ALIAS": "כינוי"
+    "TEAMADD_VOICEPREFIX": "הוסף צוות לקידומת",
+    "ALIAS": "כינוי",
+    "MAXCAPACITY": "קיבולת מקסימלית",
+    "WORKING": "עובד"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/hi.json b/public/app/main/apps/voice/i18n/hi.json
index 2fbd46a..1fa63c5 100644
--- a/public/app/main/apps/voice/i18n/hi.json
+++ b/public/app/main/apps/voice/i18n/hi.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "सेवा का स्तर",
     "SECOND_LEVEL_DISPOSITION": "दूसरा स्तर विवाद",
     "THIRD_LEVEL_DISPOSITION": "तीसरे स्तर का विवाद",
-    "ALIAS": "उपनाम"
+    "TEAMADD_VOICEPREFIX": "उपसर्ग में टीम जोड़ें",
+    "ALIAS": "उपनाम",
+    "MAXCAPACITY": "अधिकतम क्षमता",
+    "WORKING": "काम में हो"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/hu.json b/public/app/main/apps/voice/i18n/hu.json
new file mode 100644
index 0000000..28d2655
--- /dev/null
+++ b/public/app/main/apps/voice/i18n/hu.json
@@ -0,0 +1,507 @@
+{
+  "VOICE": {
+    "SECOND_LEVEL_DISPOSITION": "Second Level Disposition",
+    "THIRD_LEVEL_DISPOSITION": "Third Level Disposition",
+    "FAILUREREASON": "Failure reason",
+    "TEXT": "Text",
+    "DOWNLOADTRANSCRIBE_VOICERECORDING": "Download Transcript",
+    "INBOUND": "Inbound",
+    "OUTBOUND": "Outbound",
+    "DIALER": "Dialer",
+    "LOGIN_TIME": "Login time",
+    "PAUSE_TIME": "Pause time",
+    "ABANDONEDCALLS": "Abandoned Queue Calls",
+    "WAITING_FOR_AGENTS": "Waiting for agents",
+    "ACTIVE": "Active",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "PARTIALPAUSE": "Partial Pause",
+    "STATUS": "Status",
+    "TIMER": "Timer",
+    "ALIAS": "Alias",
+    "ALL": "All",
+    "IDLE": "Idle",
+    "EDIT_TRUNK": "Edit Trunk",
+    "GOTO_VOICEQUEUE": "Go To Realtime Voice Queues",
+    "GOTOREALTIME_VOICEQUEUE": "Go To Realtime Voice Queues",
+    "NAME": "Name",
+    "LOGOUT": "Logout",
+    "VOICEQUEUES": "Voice Queues",
+    "SEARCH_FOR_ANYONE": "Search",
+    "BACK": "Back",
+    "SELECTED": "Selected",
+    "SELECT_ALL": "Select All",
+    "SELECT_NONE": "Select None",
+    "DELETE_VOICEDISPOSITION": "Delete Voice Disposition",
+    "EDIT_VOICEDISPOSITION": "Edit Voice Disposition",
+    "EDIT_VOICEQUEUE": "Edit Voice Queue",
+    "DELETE_VOICEQUEUE": "Delete Voice Queue",
+    "MOHSOUNDS": "Moh Sounds",
+    "STRATEGY": "Strategy",
+    "DESCRIPTION": "Description",
+    "ADD_VOICEQUEUE": "Add Voice Queue",
+    "CREATED_AT": "Created At",
+    "CANT_PLAY_GSM_AUDIO_FILES": "Can't play gsm or wav49 audio files",
+    "APPLICATIONS_LIST": "Applications List",
+    "GENERAL": "General",
+    "TIMEOUT": "Timeout",
+    "MAXLENGTH": "Maximum Length",
+    "RETRY": "Retry",
+    "WRAPUPTIME": "Wrapup Time",
+    "WEIGHT": "Weight",
+    "JOINWHENEMPTY": "Join when empty",
+    "LEAVEWHENEMPTY": "Leave when empty",
+    "MUSICONHOLD": "Music On Hold",
+    "ANNOUNCETOAGENT": "Announce To Agent",
+    "ANNOUNCEMENTS": "Announcements",
+    "ADVANCED": "Advanced",
+    "ANNOUNCEFREQUENCY": "Announce Frequency",
+    "MINANNOUNCEFREQUENCY": "Minimum Announce Frequency",
+    "PERIODICANNOUNCEFREQUENCY": "Periodic Announce Frequency",
+    "RANDOMPERIODICANNOUNCE": "Random Periodic Announce",
+    "ANNOUNCEHOLDTIME": "Announce Hold Time",
+    "ANNOUNCECALLERPOSITION": "Announce Caller Position",
+    "ANNOUNCEPOSITIONLIMIT": "Announce Position Limit",
+    "REPORTHOLDTIMEAGENT": "Report Agent Hold Time",
+    "PERIODICANNOUNCE": "Periodic Announce",
+    "HOLDTIMEANNOUNCE": "Hold Time Announce",
+    "YOUARENEXTANNOUNCE": "'You are next' Announce",
+    "THEREAREANNOUNCE": "'There are' Announce",
+    "WAITINGCALLSANNOUNCE": "Waiting Calls Announce",
+    "ESTIMATEDHOLDTIMEANNOUNCE": "Estimated Hold Time Announce",
+    "MINUTESANNOUNCE": "Minutes Announce",
+    "MINUTEANNOUNCE": "Minute Announce",
+    "SECONDSANNOUNCE": "Seconds Announce",
+    "THANKYOUANNOUNCE": "'Thank You' Announce",
+    "AUTOPAUSE": "Auto Pause",
+    "AFTERCALLWORK": "After Call Work",
+    "AFTERCALLWORKDURATION": "After Call Work Duration",
+    "RINGINUSE": "Ring In Use",
+    "MEMBERDELAY": "Member Delay",
+    "TIMEOUTRESTART": "Timeout Restart",
+    "MONITORFORMAT": "Recording Format",
+    "SETINTERFACEVARIABLES": "Set Interface Variables",
+    "SETQUEUEVARIABLES": "Set Queue Variables",
+    "SETQUEUEENTRYVARIABLES": "Set Queue Entry Variables",
+    "VARIABLE": "Variable",
+    "CONTEXT": "Context",
+    "SAVE": "Save",
+    "SETTINGS": "Settings",
+    "INBOUNDROUTES": "Inbound Routes",
+    "PHONENUMBER": "Phone Number",
+    "ADD_INBOUNDROUTE": "Add Inbound Route",
+    "EDIT_INBOUNDROUTE": "Edit Inbound Route",
+    "DELETE_INBOUNDROUTE": "Delete Inbound Route",
+    "ACTIONS": "Actions",
+    "OUTBOUNDROUTES": "Outbound Routes",
+    "DESTINATIONPATTERN": "Destination Pattern",
+    "ADD_OUTBOUNDROUTE": "Add Outbound Route",
+    "EDIT_OUTBOUNDROUTE": "Edit Outbound Route",
+    "DELETE_OUTBOUNDROUTE": "Delete Outbound Route",
+    "CUTDIGITS": "Cut Digits",
+    "RECORDING": "Recording",
+    "RECORDINGFORMAT": "Recording format",
+    "INTERNALROUTES": "Internal Routes",
+    "ADD_INTERNALROUTE": "Add Internal Route",
+    "EDIT_INTERNALROUTE": "Edit Internal Route",
+    "DELETE_INTERNALROUTE": "Delete Internal Route",
+    "CONTEXTS": "Contexts",
+    "ADD_CONTEXT": "Add Context",
+    "EDIT_CONTEXT": "Edit Context",
+    "DELETE_CONTEXT": "Delete Context",
+    "VOICEMAILS": "Voicemails",
+    "ADD_VOICEMAIL": "Add Voicemail",
+    "EDIT_VOICEMAIL": "Edit Voicemail",
+    "DELETE_VOICEMAIL": "Delete Voicemail",
+    "FULLNAME": "Full Name",
+    "EMAIL": "Email",
+    "MAILBOX": "Mailbox",
+    "PASSWORD": "Password",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "TIMEZONE": "Timezone",
+    "ATTACH": "Attach",
+    "ENVELOPE": "Envelope",
+    "DELETE": "Delete",
+    "EMAILBODY": "Email Body",
+    "EMAILSUBJECT": "Email Subject",
+    "MAXSECONDS": "Max Seconds",
+    "MAXMESSAGES": "Max Messages",
+    "MESSAGES": "Messages",
+    "SORT": "Sort",
+    "ADD_MUSICONHOLD": "Add Music On Hold",
+    "MUSICONHOLDS": "Music On Hold",
+    "EDIT_MUSICONHOLD": "Edit Music On Hold",
+    "DELETE_MUSICONHOLD": "Delete Music On Hold",
+    "DIRECTORY": "Directory",
+    "AUDIOFILES": "Audio Files",
+    "RECORDINGS": "Recordings",
+    "CHANSPY": "ChanSpy",
+    "PREFIX": "Prefix",
+    "OPTIONS": "Options",
+    "AUTH": "Auth",
+    "ADD_CHANSPY": "Add ChanSpy",
+    "EDIT_CHANSPY": "Edit ChanSpy",
+    "DELETE_CHANSPY": "Delete ChanSpy",
+    "AGENTS": "Agents",
+    "TELEPHONES": "Telephones",
+    "QUEUES": "Queues",
+    "QUEUE_CALLS": "Queue Calls",
+    "QUEUE_PARAMETERS": "Queue Parameters",
+    "ABANDONED_CALLS": "Abandoned Calls",
+    "OUTBOUND_CALLS": "Outbound Calls",
+    "AGI": "Agi",
+    "DIAL": "Dial",
+    "CALLYSQUARE": "CallySquare",
+    "INTERNALDIAL": "Internal Dial",
+    "EXTERNALDIAL": "External Dial",
+    "RINGGROUP": "Ring Group",
+    "PLAYBACK": "Playback",
+    "QUEUE": "Queue",
+    "SET": "Set",
+    "VOICEMAIL": "Voicemail",
+    "GOTO": "GoTo",
+    "HANGUP": "Hangup",
+    "CUSTOM": "Custom",
+    "PROJECT": "Cally-Square Project",
+    "TECHNOLOGY/RESOURCE": "Technology/Resource",
+    "URL": "URL",
+    "EDIT_APP": "Edit Application",
+    "EDIT_INTERVAL": "Edit Interval",
+    "DELETE_APP": "Delete Application",
+    "INTERVALS": "Intervals",
+    "USER": "User",
+    "TRUNK": "Trunk",
+    "PHONE": "Phone",
+    "AUDIO_FILES": "Audio Files",
+    "ANNOUNCE_OVERRIDES": "Announce Overrides",
+    "MACRO": "Macro",
+    "GOSUB": "GoSub",
+    "RULE": "Rule",
+    "POSITION": "Position",
+    "ANSWER": "Answer",
+    "VALUE": "Value",
+    "MAILBOX@CONTEXT": "Mailbox@Context",
+    "EXTENSION": "Extension",
+    "PRIORITY": "Priority",
+    "HANGUP_CAUSE": "Hangup Cause",
+    "OUTBOUNDDIAL": "Outbound Dial",
+    "CALLER_ID": "Caller ID",
+    "NO_MESSAGE_AVAILABLE": "No messages available",
+    "NO_SOUND_AVAILABLE": "No sounds available",
+    "VOICERECORDINGS": "Voice Recordings",
+    "CHANSPIES": "ChanSpy",
+    "VOICE": "Voice",
+    "REALTIME": "Realtime",
+    "ID": "Id",
+    "VOICEMAIL_CONTEXT": "Context",
+    "NO_MOHSOUND_AVAILABLE": "No Music On Hold available",
+    "FILE": "File",
+    "ADD_MOHSOUND": "Add Music On Hold sound",
+    "DOWNLOAD_MOHSOUND": "Download Music On Hold sound",
+    "DELETE_MOHSOUND": "Delete Music On Hold sound",
+    "UNIQUEID": "Unique ID",
+    "AGENT": "Agent",
+    "TYPE": "Type",
+    "RATING": "Rating",
+    "AUDIO": "Audio",
+    "DATE": "Date",
+    "NEW_VOICEQUEUE": "New Voice Queue",
+    "NEW_INBOUNDROUTE": "New Inbound Route",
+    "NEW_OUTBOUNDROUTE": "New Outbound Route",
+    "NEW_INTERNALROUTE": "New Internal Route",
+    "NEW_CONTEXT": "New Context",
+    "NEW_VOICEMAIL": "New Voicemail",
+    "NEW_MUSICONHOLD": "New Music On Hold",
+    "NEW_CHANSPY": "New ChanSpy",
+    "PENALTY": "Penalty",
+    "ADD_TEAM_TO_VOICEQUEUE": "Add Team to Voice Queue",
+    "ADD_AGENT_TO_VOICEQUEUE": "Add Agent to Voice Queue",
+    "EDIT_DIAL": "Edit Dial",
+    "EDIT_AGI": "Edit AGI",
+    "EDIT_INTERNALDIAL": "Edit Internal Dial",
+    "EDIT_EXTERNALDIAL": "Edit External Dial",
+    "EDIT_RINGGROUP": "Edit Ring Group",
+    "EDIT_PLAYBACK": "Edit Playback",
+    "EDIT_QUEUE": "Edit Queue",
+    "EDIT_SET": "Edit Set",
+    "EDIT_GOTO": "Edit GoTo",
+    "EDIT_HANGUP": "Edit Hangup",
+    "EDIT_CUSTOM": "Edit Custom",
+    "DURATION": "Duration",
+    "RECEIVED_AT": "Received At",
+    "YES": "Yes",
+    "NO": "No",
+    "HANGUPCAUSE_1": "1 = Unallocated number",
+    "HANGUPCAUSE_16": "16 = Normal call clearing",
+    "HANGUPCAUSE_17": "17 = User busy",
+    "HANGUPCAUSE_18": "18 = No user responding (telehone device not connected)",
+    "HANGUPCAUSE_21": "21 = Call rejected",
+    "HANGUPCAUSE_22": "22 = Number changed",
+    "HANGUPCAUSE_27": "27 = Destination out of order",
+    "HANGUPCAUSE_38": "38 = Network out of order",
+    "HANGUPCAUSE_41": "41 = Temporary failure",
+    "RANDOM": "Random",
+    "ALPHABETICAL": "Alphabetical",
+    "NO_APPS_AVAILABLE": "No applications available",
+    "DOWNLOAD_VOICERECORDING": "Download Voice Recording",
+    "DELETE_VOICERECORDING": "Delete Voice Recording",
+    "INTERNAL": "Internal",
+    "PHONE_STATE": "Phone State",
+    "PHONE_STATUS": "Phone Status",
+    "TRUNK_STATUS": "Trunk Status",
+    "REGISTERED": "Registered",
+    "UNREGISTERED": "Unregistered",
+    "LAGGED": "Lagged",
+    "REACHABLE": "Reachable",
+    "UNREACHABLE": "Unreachable",
+    "UNKNOWN": "Unknown",
+    "NOT_INUSE": "Not In Use",
+    "INUSE": "In Use",
+    "BUSY": "Busy",
+    "INVALID": "Invalid",
+    "UNAVAILABLE": "Unavailable",
+    "RINGING": "Ringing",
+    "ONHOLD": "On Hold",
+    "RING": "Ring",
+    "UP": "Up",
+    "INFO": "Info",
+    "TRUNKS": "Trunks",
+    "REGISTRY": "Registry",
+    "NO_REGISTRY": "No Registry",
+    "LOGGED_IN": "Logged In (SIP Connected)",
+    "PAUSED": "Paused",
+    "WAITING": "Waiting",
+    "TALKING": "Talking",
+    "DID": "DID",
+    "CALLER": "Caller",
+    "TOTAL": "Total",
+    "ANSWERED": "Answered",
+    "ABANDONED": "Abandoned",
+    "UNMANAGED": "Unmanaged",
+    "AVG_HOLD_TIME": "Avg Hold Time",
+    "AVG_DURATION": "Av Duration",
+    "AVG_BILLABLE": "Avg Billable",
+    "SOURCE": "Source",
+    "DESTINATION": "Destination",
+    "REJECTED": "Rejected",
+    "FAILED": "Failed",
+    "CALLED": "Called",
+    "CONNECTED": "Connected",
+    "NO_RATING": "No rating",
+    "EDIT_VOICERECORDING": "Edit Voice Recording",
+    "APPLICATION_NAME": "Application Name",
+    "ARGUMENTS": "Arguments",
+    "NO_AVAILABLE_INFO": "No Available Info",
+    "ADD_AGENT_TO_QUEUE": "Add Agent To Queue",
+    "DEFAULT_PAUSE": "DEFAULT PAUSE",
+    "PAUSE": "Pause",
+    "UNPAUSE": "End Pause",
+    "REDIRECT_TO_NUMBER": "Redirect To Number",
+    "REDIRECT_TO_AGENT": "Redirect To Agent",
+    "AGENTADD_VOICEQUEUE": "Add Agent To Voice Queue",
+    "APPLICATION": "Application",
+    "FILES": "Files",
+    "FORMAT": "Format",
+    "MODE": "Mode",
+    "RECORD": "Record",
+    "TEAMADD_VOICEQUEUE": "Add Team To Voice Queue",
+    "NEW_MOHSOUND": "New Music On Hold sound",
+    "DOWNLOAD_MESSAGE": "Download",
+    "DELETE_MESSAGE": "Delete",
+    "QUEUE_PARAMS": "Queue Parameters",
+    "TOTAL_OFFERED": "Total Offered",
+    "READY": "Ready",
+    "AGENTADD_QUEUE": "Add Agent To Voice Queue",
+    "AGENTSADD_QUEUE": "Add Agents To Voice Queue",
+    "ALL_TEAMS": "All Teams",
+    "SELECTED_TEAMS": "Selected Teams",
+    "ALL_AGENTS": "All Agents",
+    "SELECTED_AGENTS": "Selected Agents",
+    "CLOSING": "Closing",
+    "TAGS": "Tags",
+    "WAITING_FOR_AGENT": "Waiting For Agents",
+    "EDIT_OUTBOUNDDIAL": "Edit Outbound Dial",
+    "ACCOUNTNAME": "Account Name",
+    "PAGE": "Page",
+    "ROWSPERPAGE": "Rows per page",
+    "OF": "of",
+    "DISPOSITION": "Disposition",
+    "CHAT": "Chat",
+    "MAIL": "Email",
+    "SMS": "SMS",
+    "OPENCHANNEL": "Open Channel",
+    "FAX": "Fax",
+    "CLEAR": "Clear",
+    "CALLS": "Calls",
+    "STARTEDAT": "Started At",
+    "ENDEDAT": "Ended At",
+    "TAG": "Tag",
+    "DETAILS": "Details",
+    "BILLABLESECONDS": "Billable seconds",
+    "ANSWEREDAT": "Answered At",
+    "NOTE": "Note",
+    "CLOSE": "Close",
+    "SELECT_DATE": "Select Start Date",
+    "SELECT_TYPE": "Select Type",
+    "VOICEPREFIXES": "Out Prefixes",
+    "NEW_VOICEPREFIX": "New Prefix",
+    "ADD_VOICEPREFIX": "Add Prefix",
+    "EDIT_VOICEPREFIX": "Edit Prefix",
+    "AGENTADD_VOICEPREFIX": "Add Agent to Prefix",
+    "TEAMADD_VOICEPREFIX": "Add Team to Prefix",
+    "DELETE_VOICEPREFIX": "Delete Prefix",
+    "OUTBOUNDROUTE": "Outbound Route",
+    "CALLERIDALL": "Caller Id",
+    "MANDATORYDISPOSITION": "Mandatory disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Mandatory disposition pause status",
+    "SCREENRECORDING": "Manage Screen Recording",
+    "START_SCREENRECORDING": "Start Screen Recording",
+    "STOP_SCREENRECORDING": "Stop Screen Recording",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "CANT_DOWNLOAD_THIS_FILE": "Can't download this file",
+    "WRONG_EXTENSION": "The file presents the wrong extension",
+    "FILE_NOT_FOUND": "File not found",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TRANSCRIBE": "Transcribe",
+    "TRANSCRIPT": "Transcript",
+    "SENTIMENTANALYSIS": "Sentiment Analysis",
+    "TRANSCRIBESTATUS_COMPLETED": "Completed",
+    "TRANSCRIBESTATUS_IN_PROGRESS": "In progress",
+    "TRANSCRIBESTATUS_FAILED": "Failed",
+    "TRANSCRIBESTATUS_NEW": "New",
+    "TRANSCRIPTANALYSIS": "Transcript & Analysis",
+    "SENTIMENT_POSITIVE": "Positive",
+    "SENTIMENT_NEGATIVE": "Negative",
+    "SENTIMENT_NEUTRAL": "Neutral",
+    "SENTIMENT_MIXED": "Mixed",
+    "RUNTRANSCRIBE_VOICERECORDING": "Run Transcribe",
+    "RUNTRANSCRIBESENTIMENT_VOICERECORDING": "Run Transcribe&Sentiment",
+    "RUNSENTIMENT_VOICERECORDING": "Run Sentiment",
+    "SENTIMENT": "Sentiment",
+    "SERVICELEVEL": "Service level",
+    "MAXCAPACITY": "Max capacity",
+    "WORKING": "Working",
+    "LEGEND": {
+      "CUSTOM_APPLICATION": "(*) - Custom application"
+    },
+    "ERRORS": {
+      "PROJECT_REQUIRED": "Mandatory field",
+      "TRUNK_REQUIRED": "Mandatory field",
+      "VARIABLE_REQUIRED": "Mandatory field",
+      "NAME_REQUIRED": "Mandatory field",
+      "APPLICATION_NAME_REQUIRED": "Mandatory field",
+      "TIMEOUT_REQUIRED": "Mandatory field",
+      "PHONENUMBER_REQUIRED": "Mandatory field",
+      "CONTEXT_REQUIRED": "Mandatory field",
+      "DESTINATIONPATTERN_REQUIRED": "Mandatory field",
+      "FULLNAME_REQUIRED": "Mandatory field",
+      "EMAIL_REQUIRED": "Mandatory field",
+      "EMAIL_MUST_VALID": "Wrong format",
+      "MAILBOX_REQUIRED": "Mandatory field",
+      "PASSWORD_REQUIRED": "Mandatory field",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "TIMEZONE_REQUIRED": "Mandatory field",
+      "PREFIX_REQUIRED": "Mandatory field",
+      "OPTIONS_REQUIRED": "Mandatory field",
+      "AFTERCALLWORKDURATION_REQUIRED": "Mandatory field",
+      "TECHNOLOGY/RESOURCE_REQUIRED": "Mandatory field",
+      "PHONE_REQUIRED": "Mandatory field",
+      "VALUE_REQUIRED": "Mandatory field",
+      "EXTENSION_REQUIRED": "Mandatory field",
+      "PRIORITY_REQUIRED": "Mandatory field",
+      "APPLICATION_REQUIRED": "Mandatory field",
+      "OUTBOUNDROUTE_REQUIRED": "Mandatory field",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAXLENGTH_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "RETRY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WRAPUPTIME_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "WEIGHT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "ANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MINANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "PERIODICANNOUNCEFREQUENCY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "AFTERCALLWORKDURATION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MEMBERDELAY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "POSITION_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "CUTDIGITS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAXSECONDS_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAXMESSAGES_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater than or equal to",
+      "MAXMESSAGES_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less than or equal to",
+      "NAME_MUST_VALID_PATTERN": "Wrong format",
+      "CALLERIDALL_MUST_VALID_PATTERN": "Wrong format",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory field",
+      "CALLER_ID_MUST_VALID_PATTERN": "Wrong format",
+      "PENALTY_REQUIRED": "You must specify a value for penalty"
+    },
+    "HELP": {
+      "TIMEOUT": "How many seconds to ring a device",
+      "MAXLENGTH": "Maximum number of callers allowed to wait in a queue: zero means unlimited",
+      "RETRY": "Time in seconds to wait before calling the next agent in queue when the timeout is expired",
+      "WRAPUPTIME": "Time in seconds to keep a queue member unavailable after completing a call",
+      "WEIGHT": "Weight of a queue in order to define priority if members are associated with multiple queues",
+      "JOINWHENEMPTY": "Used to control whether a caller is passed to a queue when no members are available",
+      "LEAVEWHENEMPTY": "Used to control whether callers are made leave the queue when no members are available to take calls",
+      "ANNOUNCEFREQUENCY": "How often to announce the caller’s position and/or estimated hold time in the queue (zero to disable)",
+      "MINANNOUNCEFREQUENCY": "Minimum announcement frequency (useful when the caller’s position changes frequently)",
+      "PERIODICANNOUNCEFREQUENCY": "Frequency of periodic announcements to the caller",
+      "ANNOUNCEPOSITIONLIMIT": "Used if announce-position is defined as either 'limit' or 'more'",
+      "AFTERCALLWORKDURATION": "Pause length triggered by the After Call Work option",
+      "MEMBERDELAY": "Inserts a delay prior to the caller and agent in queue get connected",
+      "MUSICONHOLD": "Sets the music class to use for a particular queue",
+      "ANNOUNCETOAGENT": "Play an announcement to the agent answering the call (typically to let him know what queue the caller is coming from)",
+      "RANDOMPERIODICANNOUNCE": "If yes, the defined periodic announcements will be played random",
+      "ANNOUNCEHOLDTIME": "Plays the estimated hold time along with the periodic announcements (Yes/No/Once)",
+      "ANNOUNCECALLERPOSITION": "Used to define if the caller’s position in the queue should be announced: No=never; Yes=always; Limit=only if it is within the limit defined by announce-position-limit; More= only if it is beyond the value defined by announce-position-limit",
+      "REPORTHOLDTIMEAGENT": "Enables reporting caller’s hold time to the agent in queue prior to connection",
+      "PERIODICANNOUNCE": "Set of periodic announcements to be played (in the order)",
+      "HOLDTIMEANNOUNCE": "Choose a Sound defined in Tools. Default=“Hold time”. Undefined=no announcement",
+      "YOUARENEXTANNOUNCE": "Choose a Sound defined in Tools. Default=“You are now first in line”. Undefined=no announcement",
+      "THEREAREANNOUNCE": "Choose a Sound defined in Tools. Default=“There are”. Undefined=no announcement",
+      "WAITINGCALLSANNOUNCE": "Choose a Sound defined in Tools. Default=“calls waiting”. Undefined=no announcement",
+      "ESTIMATEDHOLDTIMEANNOUNCE": "Choose a Sound defined in Tools. Default=“The current estimated hold time is”. Undefined=no announcement",
+      "MINUTESANNOUNCE": "Choose a Sound defined in Tools. Default=“minutes”. Undefined=no announcement",
+      "MINUTEANNOUNCE": "Choose a Sound defined in Tools. Default=“minute”. Undefined=no announcement",
+      "SECONDSANNOUNCE": "Choose a Sound defined in Tools. Default=“seconds”. Undefined=no announcement",
+      "THANKYOUANNOUNCE": "Choose a Sound defined in Tools. Default=“Thank you for your patience”. Undefined=no announcement",
+      "AFTERCALLWORK": "If enabled, the agent will be set on Pause after completing a call",
+      "AUTOPAUSE": "Enables/disables the automatic pause of agents who fail to answer a call. If enabled it causes the agent to be paused in all queues he belongs to",
+      "RINGINUSE": "To avoid/allow sending calls to members whose status is In Use",
+      "TIMEOUTRESTART": "If yes, this resets the timeout for an agent to answer when either a BUSY or CONGESTION status is received from the channel",
+      "MONITORFORMAT": "Specifies the format of the recording file. If it set to 'inactive', calls will not be recorded",
+      "CONTEXT": "Allows a caller to exit the queue by pressing a single DTMF digit. If a context is specified and the caller enters a number, that digit will attempt to be matched in the context specified, and dialplan execution will continue there",
+      "SETINTERFACEVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent some variables will be set (for more information see wiki docs)",
+      "SETQUEUEVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent and leaving the queue, some variables will be set (for more information, see wiki docs)",
+      "SETQUEUEENTRYVARIABLES": "If set to yes, just prior to the caller being connected with a queue agent some variables will be set (for more information, see wiki docs)",
+      "RECORDING": "Enable call recording",
+      "VOICEMAIL_CONTEXT": "The context of the relative extension",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "CALLERIDALL": "Supported format: \"CallerId\" &lt;number&gt;",
+      "CALLER_ID": "Supported format: \"CallerId\" &lt;number&gt;",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause status to set during mandatory disposition",
+      "SERVICELEVEL": "Second settings for service level (default=0, no SL). Used for service level statistics (calls answered within service level time frame)",
+      "SAVE_ROUTES": "The routing has been modified. Remember to save if you don't want to lose your changes."
+    },
+    "NOTIFICATIONS": {
+      "EXTENSION_CREATED_SUCCESS_TITLE": "Route successfully created",
+      "EXTENSION_SAVED_SUCCESS_TITLE": "Route successfully saved",
+      "EXTENSION_DELETE_TITLE": "Are you sure want to delete the route?",
+      "EXTENSION_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "EXTENSION_DELETED_SUCCESS_TITLE": "Route successfully deleted",
+      "EXTENSIONS_DELETE_TITLE": "Are you sure want to delete the selected routes?",
+      "EXTENSIONS_DELETE_MESSAGE": "{{ total }} routes will be deleted",
+      "ROUTING_APPLICATION_DELETE_TITLE": "Are you sure want to delete the application?",
+      "ROUTING_APPLICATION_DELETE_MESSAGE": "{{ name }} will be deleted",
+      "ROUTING_APPLICATIONS_DELETE_TITLE": "Are you sure want to delete the selected applications?",
+      "ROUTING_APPLICATIONS_DELETE_MESSAGE": "{{ total }} applications will be deleted",
+      "CALLYSQUARE_PROJECTS_GET_ERROR": "Unable to retrieve any CallySquare project",
+      "TRUNKS_GET_ERROR": "Unable to retrieve any trunk",
+      "VOICE_CONTEXTS_GET_ERROR": "Unable to retrieve any voice context",
+      "QUEUES_GET_ERROR": "Unable to retrieve any queue",
+      "SOUNDS_GET_ERROR": "Unable to retrieve any sound",
+      "USERS_GET_ERROR": "Unable to retrieve any user",
+      "VARIABLES_GET_ERROR": "Unable to retrieve any variable",
+      "VOICEMAILS_GET_ERROR": "Unable to retrieve any voicemail",
+      "TAGS_GET_ERROR": "Unable to retrieve any tag",
+      "INTERVALS_GET_ERROR": "Unable to retrieve any interval"
+    }
+  }
+}
diff --git a/public/app/main/apps/voice/i18n/id.json b/public/app/main/apps/voice/i18n/id.json
index 1fecba7..3c7b0cc 100644
--- a/public/app/main/apps/voice/i18n/id.json
+++ b/public/app/main/apps/voice/i18n/id.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Tingkat layanan",
     "SECOND_LEVEL_DISPOSITION": "Disposisi Tingkat Kedua",
     "THIRD_LEVEL_DISPOSITION": "Disposisi Tingkat Ketiga",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Tambahkan Tim ke Awalan",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "kapasitas maksimum",
+    "WORKING": "Bekerja"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/it.json b/public/app/main/apps/voice/i18n/it.json
index 3b739d4..4ad4363 100644
--- a/public/app/main/apps/voice/i18n/it.json
+++ b/public/app/main/apps/voice/i18n/it.json
@@ -253,7 +253,7 @@
     "TRUNKS": "Trunk",
     "REGISTRY": "Registrazione",
     "NO_REGISTRY": "Nessuna registrazione",
-    "LOGGED_IN": "Online (SIP Connessi)",
+    "LOGGED_IN": "Connesso",
     "PAUSED": "In pausa",
     "WAITING": "In attesa",
     "TALKING": "In conversazione",
@@ -342,6 +342,7 @@
     "ADD_VOICEPREFIX": "Aggiungi Prefisso",
     "EDIT_VOICEPREFIX": "Modifica Prefisso",
     "AGENTADD_VOICEPREFIX": "Aggiungi Agente al Prefisso",
+    "TEAMADD_VOICEPREFIX": "Aggiungi Team al Prefisso",
     "DELETE_VOICEPREFIX": "Elimina Prefisso",
     "OUTBOUNDROUTE": "Rotta Outbound",
     "CALLERIDALL": "Numero Chiamante",
@@ -372,6 +373,8 @@
     "RUNTRANSCRIBE_VOICERECORDING": "Esegui Transcribe",
     "RUNTRANSCRIBESENTIMENT_VOICERECORDING": "Esegui Transcribe&Sentiment",
     "RUNSENTIMENT_VOICERECORDING": "Esegui Sentiment",
+    "MAXCAPACITY": "Capacità massima",
+    "WORKING": "Attivo",
     "LEGEND": {
       "CUSTOM_APPLICATION": "(*) - Applicatione Custom"
     },
@@ -421,7 +424,7 @@
       "CALLERIDALL_MUST_VALID_PATTERN": "Formato errato",
       "CALLER_ID_MUST_VALID_PATTERN": "Formato errato",
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Campo obbligatorio",
-      "PENALTY_REQUIRED": "Devi specificare un valore per la penalità"
+      "PENALTY_REQUIRED": "Specificare un valore per la penalità"
     },
     "HELP": {
       "TIMEOUT": "Tempo (in secondi) in cui va fatto squillare il dispositivo dell'agente in coda",
diff --git a/public/app/main/apps/voice/i18n/ja.json b/public/app/main/apps/voice/i18n/ja.json
index c7d5d57..3aeb53a 100644
--- a/public/app/main/apps/voice/i18n/ja.json
+++ b/public/app/main/apps/voice/i18n/ja.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "サービスレベル",
     "SECOND_LEVEL_DISPOSITION": "第2レベルの気質",
     "THIRD_LEVEL_DISPOSITION": "第3レベルの気質",
-    "ALIAS": "エイリアス"
+    "TEAMADD_VOICEPREFIX": "プレフィックスにチームを追加",
+    "ALIAS": "エイリアス",
+    "MAXCAPACITY": "最大容量",
+    "WORKING": "働く"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/ko.json b/public/app/main/apps/voice/i18n/ko.json
index bc9ce6e..6792938 100644
--- a/public/app/main/apps/voice/i18n/ko.json
+++ b/public/app/main/apps/voice/i18n/ko.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "서비스 수준",
     "SECOND_LEVEL_DISPOSITION": "두 번째 수준 처리",
     "THIRD_LEVEL_DISPOSITION": "3 단계 처리",
-    "ALIAS": "별명"
+    "TEAMADD_VOICEPREFIX": "접두사에 팀 추가",
+    "ALIAS": "별명",
+    "MAXCAPACITY": "최대 용량",
+    "WORKING": "일하고있는"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/lt.json b/public/app/main/apps/voice/i18n/lt.json
index 1a07f3d..37fad45 100644
--- a/public/app/main/apps/voice/i18n/lt.json
+++ b/public/app/main/apps/voice/i18n/lt.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Aptarnavimo lygis",
     "SECOND_LEVEL_DISPOSITION": "Antro lygio disponavimas",
     "THIRD_LEVEL_DISPOSITION": "Trečiojo lygio disponavimas",
-    "ALIAS": "Pseudonimas"
+    "TEAMADD_VOICEPREFIX": "Pridėti komandą prie priešdėlio",
+    "ALIAS": "Pseudonimas",
+    "MAXCAPACITY": "Maksimali talpa",
+    "WORKING": "Darbas"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/lv.json b/public/app/main/apps/voice/i18n/lv.json
index 3e683d8..ee73c26 100644
--- a/public/app/main/apps/voice/i18n/lv.json
+++ b/public/app/main/apps/voice/i18n/lv.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Pakalpojuma līmenis",
     "SECOND_LEVEL_DISPOSITION": "Otrā līmeņa izvietojums",
     "THIRD_LEVEL_DISPOSITION": "Trešā līmeņa izvietojums",
-    "ALIAS": "Pseidonīms"
+    "TEAMADD_VOICEPREFIX": "Pievienot komandu prefiksam",
+    "ALIAS": "Pseidonīms",
+    "MAXCAPACITY": "Maksimālā ietilpība",
+    "WORKING": "Darbojas"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/nl.json b/public/app/main/apps/voice/i18n/nl.json
index 103a753..656bb91 100644
--- a/public/app/main/apps/voice/i18n/nl.json
+++ b/public/app/main/apps/voice/i18n/nl.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Service Level",
     "SECOND_LEVEL_DISPOSITION": "Tweede niveau dispositie",
     "THIRD_LEVEL_DISPOSITION": "Dispositie op het derde niveau",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Team toevoegen aan voorvoegsel",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "maximum capaciteit",
+    "WORKING": "Werken"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/no.json b/public/app/main/apps/voice/i18n/no.json
index 729522a..add2de9 100644
--- a/public/app/main/apps/voice/i18n/no.json
+++ b/public/app/main/apps/voice/i18n/no.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Service nivå",
     "SECOND_LEVEL_DISPOSITION": "Andre nivå disposisjon",
     "THIRD_LEVEL_DISPOSITION": "Tredje nivå disposisjon",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Legg Team til prefiks",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Maks kapasitet",
+    "WORKING": "Jobber"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/pl.json b/public/app/main/apps/voice/i18n/pl.json
index 3988cbe..c709395 100644
--- a/public/app/main/apps/voice/i18n/pl.json
+++ b/public/app/main/apps/voice/i18n/pl.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Poziom usług",
     "SECOND_LEVEL_DISPOSITION": "Dyspozycja drugiego poziomu",
     "THIRD_LEVEL_DISPOSITION": "Dyspozycja trzeciego poziomu",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Dodaj drużynę do prefiksu",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Maksymalna pojemność",
+    "WORKING": "Pracujący"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/pt-BR.json b/public/app/main/apps/voice/i18n/pt-BR.json
index 5113530..971bf53 100644
--- a/public/app/main/apps/voice/i18n/pt-BR.json
+++ b/public/app/main/apps/voice/i18n/pt-BR.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Nível de serviço",
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "THIRD_LEVEL_DISPOSITION": "Disposição de terceiro nível",
-    "ALIAS": "Pseudônimo"
+    "TEAMADD_VOICEPREFIX": "Adicionar equipe ao prefixo",
+    "ALIAS": "Pseudônimo",
+    "MAXCAPACITY": "capacidade máxima",
+    "WORKING": "Trabalhando"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/pt-PT.json b/public/app/main/apps/voice/i18n/pt-PT.json
index a46bf2f..faa44b9 100644
--- a/public/app/main/apps/voice/i18n/pt-PT.json
+++ b/public/app/main/apps/voice/i18n/pt-PT.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Nível de serviço",
     "SECOND_LEVEL_DISPOSITION": "Disposição de Segundo Nível",
     "THIRD_LEVEL_DISPOSITION": "Disposição de terceiro nível",
-    "ALIAS": "Pseudônimo"
+    "TEAMADD_VOICEPREFIX": "Adicionar equipe ao prefixo",
+    "ALIAS": "Pseudônimo",
+    "MAXCAPACITY": "capacidade máxima",
+    "WORKING": "Trabalhando"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/ru.json b/public/app/main/apps/voice/i18n/ru.json
index 672f53d..cc17b0e 100644
--- a/public/app/main/apps/voice/i18n/ru.json
+++ b/public/app/main/apps/voice/i18n/ru.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Уровень обслуживания",
     "SECOND_LEVEL_DISPOSITION": "Расположение второго уровня",
     "THIRD_LEVEL_DISPOSITION": "Расположение третьего уровня",
-    "ALIAS": "Псевдоним"
+    "TEAMADD_VOICEPREFIX": "Добавить команду к префиксу",
+    "ALIAS": "Псевдоним",
+    "MAXCAPACITY": "Максимальная вместимость",
+    "WORKING": "Работающий"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/sv.json b/public/app/main/apps/voice/i18n/sv.json
index 83c6c54..fa7f690 100644
--- a/public/app/main/apps/voice/i18n/sv.json
+++ b/public/app/main/apps/voice/i18n/sv.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Servicenivå",
     "SECOND_LEVEL_DISPOSITION": "Andra nivån disposition",
     "THIRD_LEVEL_DISPOSITION": "Tredje nivåens disposition",
-    "ALIAS": "Alias"
+    "TEAMADD_VOICEPREFIX": "Lägg till Team i prefixet",
+    "ALIAS": "Alias",
+    "MAXCAPACITY": "Max kapacitet",
+    "WORKING": "Arbetssätt"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/tr.json b/public/app/main/apps/voice/i18n/tr.json
index 6dd9d26..5cd2e05 100644
--- a/public/app/main/apps/voice/i18n/tr.json
+++ b/public/app/main/apps/voice/i18n/tr.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "Servis seviyesi",
     "SECOND_LEVEL_DISPOSITION": "İkinci Düzey Tasarruf",
     "THIRD_LEVEL_DISPOSITION": "Üçüncü Düzey Tasarruf",
-    "ALIAS": "takma ad"
+    "TEAMADD_VOICEPREFIX": "Önek'e Takım Ekle",
+    "ALIAS": "takma ad",
+    "MAXCAPACITY": "maksimum kapasite",
+    "WORKING": "Çalışma"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/zh-CN.json b/public/app/main/apps/voice/i18n/zh-CN.json
index 2415dcc..6792883 100644
--- a/public/app/main/apps/voice/i18n/zh-CN.json
+++ b/public/app/main/apps/voice/i18n/zh-CN.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "服务等级",
     "SECOND_LEVEL_DISPOSITION": "二级处置",
     "THIRD_LEVEL_DISPOSITION": "第三级处置",
-    "ALIAS": "别名"
+    "TEAMADD_VOICEPREFIX": "将团队添加到前缀",
+    "ALIAS": "别名",
+    "MAXCAPACITY": "最大容量",
+    "WORKING": "在职的"
   }
 }
diff --git a/public/app/main/apps/voice/i18n/zh-TW.json b/public/app/main/apps/voice/i18n/zh-TW.json
index 294b15a..62cf89c 100644
--- a/public/app/main/apps/voice/i18n/zh-TW.json
+++ b/public/app/main/apps/voice/i18n/zh-TW.json
@@ -476,6 +476,9 @@
     "SERVICELEVEL": "服務等級",
     "SECOND_LEVEL_DISPOSITION": "二級處置",
     "THIRD_LEVEL_DISPOSITION": "第三級處置",
-    "ALIAS": "別名"
+    "TEAMADD_VOICEPREFIX": "將團隊添加到前綴",
+    "ALIAS": "別名",
+    "MAXCAPACITY": "最大容量",
+    "WORKING": "在職的"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/ar.json b/public/app/main/apps/whatsapp/i18n/ar.json
index 03bcbeb..21b7425 100644
--- a/public/app/main/apps/whatsapp/i18n/ar.json
+++ b/public/app/main/apps/whatsapp/i18n/ar.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "حقل الزامي",
       "CLIENTEMAIL_REQUIRED": "حقل الزامي",
       "PRIVATEKEY_REQUIRED": "حقل الزامي",
-      "PROJECTID_REQUIRED": "حقل الزامي"
+      "PROJECTID_REQUIRED": "حقل الزامي",
+      "BASEURL_REQUIRED": "حقل الزامي"
     },
     "HELP": {
       "LIST": "تستخدم قائمة مدير جهات الاتصال لربط جهات الاتصال",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "تحرير Dialogflow V2",
     "PRIVATEKEY": "مفتاح سري",
-    "PROJECTID": "معرف المشروع"
+    "PROJECTID": "معرف المشروع",
+    "BASEURL": "عنوان URL الأساسي",
+    "DELIVERYREPORTURL": "عنوان URL لتقرير التسليم"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/cs.json b/public/app/main/apps/whatsapp/i18n/cs.json
index 07beea8..26d518e 100644
--- a/public/app/main/apps/whatsapp/i18n/cs.json
+++ b/public/app/main/apps/whatsapp/i18n/cs.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Povinné pole",
       "CLIENTEMAIL_REQUIRED": "Povinné pole",
       "PRIVATEKEY_REQUIRED": "Povinné pole",
-      "PROJECTID_REQUIRED": "Povinné pole"
+      "PROJECTID_REQUIRED": "Povinné pole",
+      "BASEURL_REQUIRED": "Povinné pole"
     },
     "HELP": {
       "LIST": "Seznam Správce kontaktů používaný k přiřazení kontaktů",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Upravit Dialogflow V2",
     "PRIVATEKEY": "Soukromý klíč",
-    "PROJECTID": "ID projektu"
+    "PROJECTID": "ID projektu",
+    "BASEURL": "Základní URL",
+    "DELIVERYREPORTURL": "Adresa URL zprávy o doručení"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/da.json b/public/app/main/apps/whatsapp/i18n/da.json
index 67fc111..4e07eb6 100644
--- a/public/app/main/apps/whatsapp/i18n/da.json
+++ b/public/app/main/apps/whatsapp/i18n/da.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Obligatorisk felt",
       "CLIENTEMAIL_REQUIRED": "Obligatorisk felt",
       "PRIVATEKEY_REQUIRED": "Obligatorisk felt",
-      "PROJECTID_REQUIRED": "Obligatorisk felt"
+      "PROJECTID_REQUIRED": "Obligatorisk felt",
+      "BASEURL_REQUIRED": "Obligatorisk felt"
     },
     "HELP": {
       "LIST": "Kontakt Manager-liste, der bruges til at knytte kontakter",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Rediger Dialogflow V2",
     "PRIVATEKEY": "Privat nøgle",
-    "PROJECTID": "Projekt-id"
+    "PROJECTID": "Projekt-id",
+    "BASEURL": "Basis URL",
+    "DELIVERYREPORTURL": "Leveringsrapportens URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/de.json b/public/app/main/apps/whatsapp/i18n/de.json
index 80b51fd..a362d79 100644
--- a/public/app/main/apps/whatsapp/i18n/de.json
+++ b/public/app/main/apps/whatsapp/i18n/de.json
@@ -3,8 +3,8 @@
     "ERRORS": {
       "ACCESSKEYID_REQUIRED": "Pflichtfeld",
       "ACCOUNTSID_REQUIRED": "Pflichtfeld",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
-      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "AGENTTRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
       "AGENT_REQUIRED": "Pflichtfeld",
       "AGENT_TIMEOUT_REQUIRED": "Pflichtfeld",
@@ -14,9 +14,9 @@
       "CONDITION_REQUIRED": "Pflichtfeld",
       "DESCRIPTION_REQUIRED": "Pflichtfeld",
       "DISPOSITION_REQUIRED": "Pflichtfeld",
-      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "FALSEPRIORITY_REQUIRED": "Pflichtfeld",
-      "KEY_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
+      "KEY_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "KEY_REQUIRED": "Pflichtfeld",
       "LANGUAGE_REQUIRED": "Pflichtfeld",
       "LEXREGION_REQUIRED": "Pflichtfeld",
@@ -24,61 +24,62 @@
       "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Pflichtfeld",
       "NAME_REQUIRED": "Pflichtfeld",
       "PHONE_REQUIRED": "Pflichtfeld",
-      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "PRIORITY_REQUIRED": "Pflichtfeld",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
-      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "QUEUETRANSFERTIMEOUT_REQUIRED": "Pflichtfeld",
       "QUEUE_REQUIRED": "Pflichtfeld",
       "SECRETACCESSKEY_REQUIRED": "Pflichtfeld",
       "TAG_REQUIRED": "Pflichtfeld",
       "TEXT_REQUIRED": "Pflichtfeld",
-      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
-      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "TIMEOUT_REQUIRED": "Pflichtfeld",
       "TIMES_REQUIRED": "Pflichtfeld",
       "TOKEN_REQUIRED": "Pflichtfeld",
-      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
       "TRUEPRIORITY_REQUIRED": "Pflichtfeld",
       "TYPE_REQUIRED": "Pflichtfeld",
       "VALUE_REQUIRED": "Pflichtfeld",
       "VARIABLE_REQUIRED": "Pflichtfeld",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Der Wert muss größer oder gleich sein als",
-      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Der Wert muss kleiner oder gleich sein",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "Wert muss größer oder gleich sein als",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "Wert muss kleiner oder gleich sein als",
       "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Pflichtfeld",
-      "WELCOMEMESSAGE_MAX_LENGTH": "Der Wert muss eine maximale Länge von {{max}} haben",
+      "WELCOMEMESSAGE_MAX_LENGTH": "Wert darf eine maximale Länge haben von {{max}} ",
       "WELCOMEMESSAGE_REQUIRED": "Pflichtfeld",
       "CLIENTEMAIL_REQUIRED": "Pflichtfeld",
       "PRIVATEKEY_REQUIRED": "Pflichtfeld",
-      "PROJECTID_REQUIRED": "Pflichtfeld"
+      "PROJECTID_REQUIRED": "Pflichtfeld",
+      "BASEURL_REQUIRED": "Pflichtfeld"
     },
     "HELP": {
-      "LIST": "Kontaktmanagerliste zum Zuordnen von Kontakten",
-      "MANDATORYDISPOSITION": "Obligatorische Disposition",
-      "MANDATORYDISPOSITIONPAUSEID": "Pause, um zu verwenden, wenn die obligatorische Disposition aktiviert ist",
+      "LIST": "Liste für die Zuordnung von Kontakten",
+      "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+      "MANDATORYDISPOSITIONPAUSEID": "PausenID bei erforderlicher Qualifizierung",
       "MOTIONPROXY": "Das Feld muss das folgende Format haben: <Protokoll>: // <IP-Adresse> [: <Port>]. Beispiel: https: //X.Y.Z.W",
       "NAME": "Es werden nur Zahlen, Buchstaben und bestimmte Zeichen (._) unterstützt",
       "RECEIVEURL": "Dies ist die automatisch generierte API-Zeichenfolge, die Sie zum Empfangen der Nachrichten in Ihrem Konto von Ihrem WhatsApp Connector-Anbieter verwenden müssen (POST-Methode muss verwendet werden): Klicken Sie auf die Schaltfläche in der Zwischenablage, um sie zu kopieren",
-      "WELCOMEMESSAGE": "Dies ist die erste Antwortnachricht, die an neue Interaktionen gesendet wird"
+      "WELCOMEMESSAGE": "Dies ist die erste Antwortnachricht, welche bei einer neuen Interaktion gesendet wird"
     },
     "ACCESSKEYID": "Zugriffsschlüssel-ID",
-    "ACCOUNTSID": "Konto-SID",
+    "ACCOUNTSID": "Konto-ID",
     "ACTIONS": "Aktionen",
     "ADD_NOTE": "Notiz hinzufügen",
-    "ADD_WHATSAPPACCOUNT": "Hinzufügen",
-    "ADD_WHATSAPPCANNEDANSWER": "Vordefinierte Antwort hinzufügen",
-    "ADD_WHATSAPPDISPOSITION": "WhatsApp Disposition hinzufügen",
+    "ADD_WHATSAPPACCOUNT": "Whatsapp Konto konzufügen",
+    "ADD_WHATSAPPCANNEDANSWER": "Textvorlage hinzufügen",
+    "ADD_WHATSAPPDISPOSITION": "Whatsapp-Qualifizierung hinzufügen",
     "ADD_WHATSAPPQUEUE": "WhatsApp-Warteschlange hinzufügen",
-    "ADVANCED": "Fortgeschrittene",
+    "ADVANCED": "Erweitert",
     "AGENT": "Agent",
-    "AGENTADD_QUEUE": "Agent zur WhatsApp-Warteschlange hinzufügen",
-    "AGENTADD_WHATSAPPACCOUNT": "Agent zum WhatsApp-Konto hinzufügen",
-    "AGENTADD_WHATSAPPQUEUE": "Agent zur WhatsApp-Warteschlange hinzufügen",
+    "AGENTADD_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "AGENTADD_WHATSAPPACCOUNT": "Agenten zum WhatsApp-Konto hinzufügen",
+    "AGENTADD_WHATSAPPQUEUE": "Agenten zur WhatsApp-Warteschlange hinzufügen",
     "AGENTS": "Agenten",
-    "AGENTSADD_QUEUE": "Hinzufügen von Agenten zur WhatsApp-Warteschlange",
-    "AGENTTRANSFER": "Agententransfer",
-    "AGENTTRANSFERTIMEOUT": "Zeitüberschreitung bei der Agentenübertragung",
-    "AGENT_TIMEOUT": "Agent Timeout",
+    "AGENTSADD_QUEUE": "Agenten zur Warteschlange hinzufügen",
+    "AGENTTRANSFER": "Transfer Agent",
+    "AGENTTRANSFERTIMEOUT": "Timeout Agententransfer",
+    "AGENT_TIMEOUT": "Timeout Agent",
     "ALL": "Alles",
     "ALL_AGENTS": "Alle Agenten",
     "ALL_TEAMS": "Alle Teams",
@@ -86,90 +87,90 @@
     "AUTHTOKEN": "Auth Token",
     "AUTOREPLY": "Automatische Antwort",
     "BACK": "Zurück",
-    "BOTNAME": "Bot Name",
+    "BOTNAME": "Botname",
     "BUSY": "Beschäftigt",
-    "CANNEDANSWERS": "Vordefinierte Antworten",
-    "CANNED_ANSWER_NOT_FOUND": "Es wurden keine vordefinierten Antworten gefunden",
-    "CANNED_ANSWER_SEARCH": "Geben Sie einen Text ein, um eine vordefinierte Antwort zu suchen",
+    "CANNEDANSWERS": "Textvorlagen",
+    "CANNED_ANSWER_NOT_FOUND": "Keine Textvorlagen gefunden",
+    "CANNED_ANSWER_SEARCH": "Suchen nach Textvorlagen",
     "CAPACITY": "Kapazität",
     "CLOSE": "Schließen",
     "CLOSED": "Geschlossen",
     "CLOSEMETHOD": "Methode schließen",
     "CLOSEURL": "URL schließen",
-    "COMMAND": "Befehl",
+    "COMMAND": "Eingabe",
     "CONDITION": "Bedingung",
     "CONTACT": "Kontakt",
-    "CREATED_AT": "Hergestellt in",
-    "DEFAULT_PAUSE": "STANDARD PAUSE",
+    "CREATED_AT": "Erstellt am",
+    "DEFAULT_PAUSE": "Standard Pause",
     "DELETE": "Löschen",
     "DELETE_INTERACTION": "Interaktion löschen",
     "DELETE_SELECTED": "Ausgewählte löschen",
     "DELETE_WHATSAPPACCOUNT": "WhatsApp-Konto löschen",
-    "DELETE_WHATSAPPCANNEDANSWER": "Vordefinierte Antwort löschen",
-    "DELETE_WHATSAPPDISPOSITION": "WhatsApp-Disposition löschen",
+    "DELETE_WHATSAPPCANNEDANSWER": "Textvorlage löschen",
+    "DELETE_WHATSAPPDISPOSITION": "Qualifizierung löschen",
     "DELETE_WHATSAPPQUEUE": "WhatsApp-Warteschlange löschen",
     "DESCRIPTION": "Beschreibung",
     "DIALOGFLOW": "DialogFlow",
-    "DISPOSITION": "Anordnung",
-    "DISPOSITIONS": "Dispositionen",
-    "DOWNLOAD_INTERACTION": "Herunterladen",
-    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Ohne Anhänge herunterladen",
-    "DOWNLOAD_WITH_ATTACHMENTS": "Mit Anhängen herunterladen",
-    "EDIT_AGENT": "Agent bearbeiten",
-    "EDIT_AMAZONLEX": "Bearbeiten Sie die Lex-Konfiguration",
+    "DISPOSITION": "Qualifizierung",
+    "DISPOSITIONS": "Qualifizierungen",
+    "DOWNLOAD_INTERACTION": "Interaktion herunterladen",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Herunterladen ohne Anhänge",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Herunterladen inkl. Anhänge",
+    "EDIT_AGENT": "Agenten bearbeiten",
+    "EDIT_AMAZONLEX": "Lex-Konfiguration bearbeiten",
     "EDIT_AUTOREPLY": "Automatische Antwort bearbeiten",
-    "EDIT_CLOSE": "Bearbeiten Schließen",
-    "EDIT_DIALOGFLOW": "Bearbeiten Sie die DialogFlow-Konfiguration",
-    "EDIT_GOTOIF": "Bearbeiten Sie Gotoif",
-    "EDIT_GOTOP": "Gotop bearbeiten",
+    "EDIT_CLOSE": "Bearbeitung abschließen",
+    "EDIT_DIALOGFLOW": "DialogFlow-Konfiguration bearbeiten",
+    "EDIT_GOTOIF": "GoToIf bearbeiten",
+    "EDIT_GOTOP": "GoTop bearbeiten",
     "EDIT_NOOP": "Noop bearbeiten",
     "EDIT_QUEUE": "Warteschlange bearbeiten",
     "EDIT_SYSTEM": "System bearbeiten",
     "EDIT_TAG": "Tag bearbeiten",
     "EDIT_WHATSAPPACCOUNT": "WhatsApp-Konto bearbeiten",
-    "EDIT_WHATSAPPCANNEDANSWER": "Vordefinierte Antwort bearbeiten",
-    "EDIT_WHATSAPPDISPOSITION": "WhatsApp-Disposition bearbeiten",
-    "EDIT_WHATSAPPQUEUE": "Bearbeiten Sie die WhatsApp-Warteschlange",
-    "FALSEPRIORITY": "Falsche Priorität",
-    "GENERAL": "Allgemeines",
+    "EDIT_WHATSAPPCANNEDANSWER": "Textvorlage bearbeiten",
+    "EDIT_WHATSAPPDISPOSITION": "Whatsapp-Qualifizierung bearbeiten",
+    "EDIT_WHATSAPPQUEUE": "Whatsapp-Warteschlange bearbeiten",
+    "FALSEPRIORITY": "Priorität falsch",
+    "GENERAL": "Allgemein",
     "GOTOIF": "Gotoif",
     "GOTOP": "Zum Seitenanfang",
-    "GOTOREALTIME_WHATSAPPQUEUE": "Wechseln Sie zur WhatsApp-Warteschlange in Echtzeit",
-    "GO_TO_WHATSAPPACCOUNTS": "Gehe zu Konto",
-    "ID": "Ich würde",
+    "GOTOREALTIME_WHATSAPPQUEUE": "Zur Echtzeitansicht gehen",
+    "GO_TO_WHATSAPPACCOUNTS": "Zum Whatsapp-Konto gehen",
+    "ID": "ID",
     "IDLE": "Leerlauf",
     "INSERT_MESSAGE_HERE": "Nachricht hier einfügen",
     "INTERACTIONS": "Interaktionen",
-    "INTERACTIONS_WHATSAPPACCOUNT": "Gehen Sie zu Interaktionen",
+    "INTERACTIONS_WHATSAPPACCOUNT": "Zu Interaktionen gehen",
     "KEY": "Schlüssel",
     "LANGUAGE": "Sprache",
     "LASTMESSAGE": "Letzte Nachricht",
-    "LEXREGION": "Region",
-    "LIST": "Aufführen",
-    "LOGGED_IN": "Eingeloggt (SIP verbunden)",
+    "LEXREGION": "LexRegion",
+    "LIST": "Liste",
+    "LOGGED_IN": "Eingeloggt (Verbunden mit SIP)",
     "LOGIN_TIME": "Anmeldezeit",
     "LOGOUT": "Ausloggen",
-    "MANDATORYDISPOSITION": "Obligatorische Disposition",
-    "MANDATORYDISPOSITIONPAUSEID": "Pause, um zu verwenden, wenn die obligatorische Disposition aktiviert ist",
+    "MANDATORYDISPOSITION": "Qualifizierung erforderlich",
+    "MANDATORYDISPOSITIONPAUSEID": "Qualifizierung pausieren, sofern erforderlich",
     "MORE": "Mehr",
-    "MOTIONPROXY": "Proxy- oder Bewegungsdomäne",
+    "MOTIONPROXY": "Proxy",
     "MULTI_SELECT_TOGGLE": "Mehrfachauswahl umschalten",
     "NAME": "Name",
     "NEW_WHATSAPPACCOUNT": "Neues WhatsApp-Konto",
-    "NEW_WHATSAPPCANNEDANSWER": "Neue vordefinierte WhatsApp-Antwort",
-    "NEW_WHATSAPPDISPOSITION": "Neue WhatsApp-Disposition",
+    "NEW_WHATSAPPCANNEDANSWER": "Neue WhatsApp-Textvorlage",
+    "NEW_WHATSAPPDISPOSITION": "Neue WhatsApp-Quailifizierung",
     "NEW_WHATSAPPQUEUE": "Neue WhatsApp-Warteschlange",
     "NOOP": "Noop",
-    "NOTE": "Hinweis",
+    "NOTE": "Anmerkung",
     "NOTIFICATION": "Benachrichtigung",
-    "NOTIFICATIONSHAKE": "Shake",
-    "NOTIFICATIONSOUND": "Klang",
+    "NOTIFICATIONSHAKE": "Schütteln",
+    "NOTIFICATIONSOUND": "Klingeln",
     "NOTIFICATIONTEMPLATE": "Vorlage",
     "NO_AGENT_ONLINE": "Kein Agent online",
-    "NO_AVAILABLE_INFO": "Keine verfügbaren Informationen",
-    "NO_INTERACTION_AVAILABLE": "Keine Interaktionen verfügbar",
-    "NO_WHATSAPPCANNEDANSWER_AVAILABLE": "Keine vordefinierten WhatsApp-Antworten verfügbar",
-    "NO_WHATSAPPDISPOSITION_AVAILABLE": "Keine WhatsApp-Dispositionen verfügbar",
+    "NO_AVAILABLE_INFO": "Keine Informationen verfügbar",
+    "NO_INTERACTION_AVAILABLE": "Keine neuen Interaktionen verfügbar",
+    "NO_WHATSAPPCANNEDANSWER_AVAILABLE": "Keine Textvorlagen verfügbar",
+    "NO_WHATSAPPDISPOSITION_AVAILABLE": "Keine Qualifizierungen verfügbar",
     "NO_WHATSAPP_ACCOUNTS_AVAILABLE": "Keine WhatsApp-Konten verfügbar",
     "OF": "von",
     "OPENED": "Geöffnet",
@@ -183,62 +184,64 @@
     "PROXY": "Proxy",
     "QUEUE": "Warteschlange",
     "QUEUES": "Warteschlangen",
-    "QUEUETRANSFER": "Warteschlangenübertragung",
-    "QUEUETRANSFERTIMEOUT": "Zeitüberschreitung bei der Warteschlangenübertragung",
+    "QUEUETRANSFER": "Transfer an Warteschlange",
+    "QUEUETRANSFERTIMEOUT": "Zeitüberschreitung bei der Warteschlangentransfer",
     "READY": "Bereit",
     "REALTIME": "Echtzeit",
-    "RECEIVEURL": "URL erhalten",
+    "RECEIVEURL": "URL für Erhalt",
     "REFRESH_INTERACTIONS": "Interaktionen aktualisieren",
-    "REMOTE": "Fernbedienung",
+    "REMOTE": "Remote",
     "ROWSPERPAGE": "Zeilen pro Seite",
-    "SAVE": "sparen",
+    "SAVE": "Speichern",
     "SCREENRECORDING": "Bildschirmaufzeichnung verwalten",
     "SEARCH_FOR_ANYONE": "Suche",
-    "SECRETACCESSKEY": "Zugriffsschlüsselgeheimnis",
+    "SECRETACCESSKEY": "Geheimer Schlüssel",
     "SELECTED": "Ausgewählt",
     "SELECTED_AGENTS": "Ausgewählte Agenten",
     "SELECTED_TEAMS": "Ausgewählte Teams",
-    "SELECT_ALL": "Wählen Sie Alle",
-    "SELECT_NONE": "Nichts ausgewählt",
+    "SELECT_ALL": "Alles auswählen",
+    "SELECT_NONE": "Nichts auswählen",
     "SEND": "Senden",
-    "SETTINGS": "die Einstellungen",
-    "SPYINTERACTION": "Spionage-Interaktion",
-    "STARTEDAT": "Fing an bei",
-    "START_SCREENRECORDING": "Bildschirmaufnahme starten",
+    "SETTINGS": "Einstellungen",
+    "SPYINTERACTION": "Mitlesen",
+    "STARTEDAT": "Startdatum",
+    "START_SCREENRECORDING": "Bildschirmaufzeichnung starten",
     "STATUS": "Status",
     "STOP_SCREENRECORDING": "Bildschirmaufzeichnung stoppen",
     "STRATEGY": "Strategie",
     "SYSTEM": "System",
-    "TAG": "Etikett",
-    "TAGS": "Stichworte",
+    "TAG": "Tag",
+    "TAGS": "Tags",
     "TEAMADD_WHATSAPPQUEUE": "Team zur WhatsApp-Warteschlange hinzufügen",
-    "TEAMS_ASSOCIATION": "Mannschaftsverband",
+    "TEAMS_ASSOCIATION": "Teamzuweisung",
     "TEXT": "Text",
-    "TIMEOUT": "Auszeit",
+    "TIMEOUT": "Zeitüberschreitung",
     "TIMER": "Timer",
-    "TIMES": "Mal",
-    "TO": "Zu",
-    "TOKEN": "Zeichen",
-    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufnahme verfügbar",
-    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufnahme läuft",
-    "TRANSFER": "Transfer",
+    "TIMES": "Zeiten",
+    "TO": "an",
+    "TOKEN": "Token",
+    "TOOLTIP_SCREENRECORDING_OFF": "Bildschirmaufzeichnung verfügbar",
+    "TOOLTIP_SCREENRECORDING_ON": "Bildschirmaufzeichnung läuft",
+    "TRANSFER": "Weiterleiten",
     "TRUEPRIORITY": "Wahre Priorität",
-    "TYPE": "Art",
+    "TYPE": "Typ",
     "UNPAUSE": "Pause beenden",
     "VALUE": "Wert",
     "VARIABLE": "Variable",
-    "WAITFORTHEASSIGNEDAGENT": "Warten Sie auf den zugewiesenen Agenten",
+    "WAITFORTHEASSIGNEDAGENT": "Auf den zugewiesenen Mitarbeiter warten",
     "WAITING": "Warten",
     "WELCOMEMESSAGE": "Willkommensnachricht",
     "WHATSAPP": "WhatsApp Connector",
     "WHATSAPPACCOUNTS": "WhatsApp-Konten",
-    "WHATSAPPCANNEDANSWERS": "WhatsApp vordefinierte Antworten",
-    "WHATSAPPDISPOSITIONS": "WhatsApp Dispositionen",
+    "WHATSAPPCANNEDANSWERS": "WhatsApp-Textvorlagen",
+    "WHATSAPPDISPOSITIONS": "WhatsApp-Qualifizierungen",
     "WHATSAPPQUEUES": "WhatsApp-Warteschlangen",
-    "CLIENTEMAIL": "Kunden-E-Mail",
+    "CLIENTEMAIL": "Kunden E-Mail",
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Dialogflow V2 bearbeiten",
-    "PRIVATEKEY": "Privat Schlüssel",
-    "PROJECTID": "Projekt-ID"
+    "PRIVATEKEY": "Privater Schlüssel",
+    "PROJECTID": "Projekt-ID",
+    "BASEURL": "Basis-URL",
+    "DELIVERYREPORTURL": "Zustellberichts-URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/en.json b/public/app/main/apps/whatsapp/i18n/en.json
index 0920067..68808ad 100644
--- a/public/app/main/apps/whatsapp/i18n/en.json
+++ b/public/app/main/apps/whatsapp/i18n/en.json
@@ -30,6 +30,7 @@
     "AUTHTOKEN": "Auth Token",
     "AUTOREPLY": "Auto Reply",
     "BACK": "Back",
+    "BASEURL": "Base URL",
     "BOTNAME": "Bot Name",
     "BUSY": "Busy",
     "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
@@ -86,6 +87,7 @@
       "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less or equal than",
       "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
       "AUTHTOKEN_REQUIRED": "Mandatory Field",
+      "BASEURL_REQUIRED": "Mandatory Field",
       "BOTNAME_REQUIRED": "Mandatory Field",
       "COMMAND_REQUIRED": "Mandatory Field",
       "CONDITION_REQUIRED": "Mandatory Field",
@@ -193,6 +195,7 @@
     "READY": "Ready",
     "REALTIME": "Realtime",
     "RECEIVEURL": "Receive URL",
+    "DELIVERYREPORTURL": "Delivery report URL",
     "REFRESH_INTERACTIONS": "Refresh Interactions",
     "REMOTE": "Remote",
     "ROWSPERPAGE": "Rows per page",
diff --git a/public/app/main/apps/whatsapp/i18n/es.json b/public/app/main/apps/whatsapp/i18n/es.json
index 03aafb4..af0bf10 100644
--- a/public/app/main/apps/whatsapp/i18n/es.json
+++ b/public/app/main/apps/whatsapp/i18n/es.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Campo obligatorio",
       "CLIENTEMAIL_REQUIRED": "Campo obligatorio",
       "PRIVATEKEY_REQUIRED": "Campo obligatorio",
-      "PROJECTID_REQUIRED": "Campo obligatorio"
+      "PROJECTID_REQUIRED": "Campo obligatorio",
+      "BASEURL_REQUIRED": "Campo obligatorio"
     },
     "HELP": {
       "LIST": "Lista de administrador de contactos utilizada para asociar contactos",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Editar Dialogflow V2",
     "PRIVATEKEY": "Llave privada",
-    "PROJECTID": "Projecto ID"
+    "PROJECTID": "Projecto ID",
+    "BASEURL": "URL base",
+    "DELIVERYREPORTURL": "URL del informe de entrega"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/et.json b/public/app/main/apps/whatsapp/i18n/et.json
index 5ff75f9..7c8316a 100644
--- a/public/app/main/apps/whatsapp/i18n/et.json
+++ b/public/app/main/apps/whatsapp/i18n/et.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Kohustuslik väli",
       "CLIENTEMAIL_REQUIRED": "Kohustuslik väli",
       "PRIVATEKEY_REQUIRED": "Kohustuslik väli",
-      "PROJECTID_REQUIRED": "Kohustuslik väli"
+      "PROJECTID_REQUIRED": "Kohustuslik väli",
+      "BASEURL_REQUIRED": "Kohustuslik väli"
     },
     "HELP": {
       "LIST": "Kontaktide halduri loend, mida kasutatakse kontaktide seostamiseks",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialoogivoog V2",
     "EDIT_DIALOGFLOWV2": "Redigeerimise dialoogivoog V2",
     "PRIVATEKEY": "Privaatne võti",
-    "PROJECTID": "Projekti ID"
+    "PROJECTID": "Projekti ID",
+    "BASEURL": "Baas-URL",
+    "DELIVERYREPORTURL": "Edastamisaruande URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/fa.json b/public/app/main/apps/whatsapp/i18n/fa.json
index 2bfad68..218417c 100644
--- a/public/app/main/apps/whatsapp/i18n/fa.json
+++ b/public/app/main/apps/whatsapp/i18n/fa.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "زمینه اجباری",
       "CLIENTEMAIL_REQUIRED": "زمینه اجباری",
       "PRIVATEKEY_REQUIRED": "زمینه اجباری",
-      "PROJECTID_REQUIRED": "زمینه اجباری"
+      "PROJECTID_REQUIRED": "زمینه اجباری",
+      "BASEURL_REQUIRED": "فیلد اجباری"
     },
     "HELP": {
       "LIST": "لیست مدیر تماس با ما برای ارتباط مخاطبین استفاده می شود",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "ویرایش Dialogflow V2",
     "PRIVATEKEY": "کلید خصوصی",
-    "PROJECTID": "شناسه پروژه"
+    "PROJECTID": "شناسه پروژه",
+    "BASEURL": "URL پایه",
+    "DELIVERYREPORTURL": "URL گزارش تحویل"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/fi.json b/public/app/main/apps/whatsapp/i18n/fi.json
index 647eabf..fbcd21f 100644
--- a/public/app/main/apps/whatsapp/i18n/fi.json
+++ b/public/app/main/apps/whatsapp/i18n/fi.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Pakollinen kenttä",
       "CLIENTEMAIL_REQUIRED": "Pakollinen kenttä",
       "PRIVATEKEY_REQUIRED": "Pakollinen kenttä",
-      "PROJECTID_REQUIRED": "Pakollinen kenttä"
+      "PROJECTID_REQUIRED": "Pakollinen kenttä",
+      "BASEURL_REQUIRED": "Pakollinen kenttä"
     },
     "HELP": {
       "LIST": "Yhteystietojen yhdistämiseen käytetty yhteyshenkilöluettelo",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Muokkaa valintaikkunaa V2",
     "PRIVATEKEY": "Yksityinen avain",
-    "PROJECTID": "Projektin tunnus"
+    "PROJECTID": "Projektin tunnus",
+    "BASEURL": "Perus-URL-osoite",
+    "DELIVERYREPORTURL": "Toimitusraportin URL-osoite"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/fr.json b/public/app/main/apps/whatsapp/i18n/fr.json
index b2e331a..38e317f 100644
--- a/public/app/main/apps/whatsapp/i18n/fr.json
+++ b/public/app/main/apps/whatsapp/i18n/fr.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Champ obligatoire",
       "CLIENTEMAIL_REQUIRED": "Champ obligatoire",
       "PRIVATEKEY_REQUIRED": "Champ obligatoire",
-      "PROJECTID_REQUIRED": "Champ obligatoire"
+      "PROJECTID_REQUIRED": "Champ obligatoire",
+      "BASEURL_REQUIRED": "Champ obligatoire"
     },
     "HELP": {
       "LIST": "Liste du gestionnaire de contacts utilisée pour associer des contacts",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Modifier Dialogflow V2",
     "PRIVATEKEY": "Clé privée",
-    "PROJECTID": "ID du projet"
+    "PROJECTID": "ID du projet",
+    "BASEURL": "URL de base",
+    "DELIVERYREPORTURL": "URL du rapport de livraison"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/he.json b/public/app/main/apps/whatsapp/i18n/he.json
index 00d0fa4..fe798b4 100644
--- a/public/app/main/apps/whatsapp/i18n/he.json
+++ b/public/app/main/apps/whatsapp/i18n/he.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "שדה חובה",
       "CLIENTEMAIL_REQUIRED": "שדה חובה",
       "PRIVATEKEY_REQUIRED": "שדה חובה",
-      "PROJECTID_REQUIRED": "שדה חובה"
+      "PROJECTID_REQUIRED": "שדה חובה",
+      "BASEURL_REQUIRED": "שדה חובה"
     },
     "HELP": {
       "LIST": "רשימת אנשי קשר המשמשת לשייך קשרים",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "ערוך את Dialogflow V2",
     "PRIVATEKEY": "מפתח פרטי",
-    "PROJECTID": "מזהה פרויקט"
+    "PROJECTID": "מזהה פרויקט",
+    "BASEURL": "כתובת האתר הבסיסית",
+    "DELIVERYREPORTURL": "כתובת האתר של דוח מסירה"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/hi.json b/public/app/main/apps/whatsapp/i18n/hi.json
index 819f531..2cf73c4 100644
--- a/public/app/main/apps/whatsapp/i18n/hi.json
+++ b/public/app/main/apps/whatsapp/i18n/hi.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "आवश्यक स्थान",
       "CLIENTEMAIL_REQUIRED": "आवश्यक स्थान",
       "PRIVATEKEY_REQUIRED": "आवश्यक स्थान",
-      "PROJECTID_REQUIRED": "आवश्यक स्थान"
+      "PROJECTID_REQUIRED": "आवश्यक स्थान",
+      "BASEURL_REQUIRED": "अनिवार्य क्षेत्र"
     },
     "HELP": {
       "LIST": "कॉन्टैक्ट मैनेजर लिस्ट का इस्तेमाल कॉन्टैक्ट्स को जोड़ने में किया जाता है",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "संवाद प्रवाह V2",
     "EDIT_DIALOGFLOWV2": "डायलॉगफ़्लो V2 संपादित करें",
     "PRIVATEKEY": "निजी चाबी",
-    "PROJECTID": "प्रोजेक्ट आईडी"
+    "PROJECTID": "प्रोजेक्ट आईडी",
+    "BASEURL": "आधार URL",
+    "DELIVERYREPORTURL": "वितरण रिपोर्ट URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/hu.json b/public/app/main/apps/whatsapp/i18n/hu.json
new file mode 100644
index 0000000..2d8b1f5
--- /dev/null
+++ b/public/app/main/apps/whatsapp/i18n/hu.json
@@ -0,0 +1,247 @@
+{
+  "WHATSAPP": {
+    "EDIT_DIALOGFLOWV2": "Edit Dialogflow V2",
+    "DIALOGFLOWV2": "Dialogflow V2",
+    "PRIVATEKEY": "Private Key",
+    "CLIENTEMAIL": "Client Email",
+    "PROJECTID": "Project ID",
+    "ACCESSKEYID": "Access Key ID",
+    "ACCOUNTSID": "Account SID",
+    "ACTIONS": "Actions",
+    "ADD_NOTE": "Add note",
+    "ADD_WHATSAPPACCOUNT": "Add",
+    "ADD_WHATSAPPCANNEDANSWER": "Add Canned Answer",
+    "ADD_WHATSAPPDISPOSITION": "Add WhatsApp Disposition",
+    "ADD_WHATSAPPQUEUE": "Add WhatsApp queue",
+    "ADVANCED": "Advanced",
+    "AGENT": "Agent",
+    "AGENT_TIMEOUT": "Agent Timeout",
+    "AGENTADD_QUEUE": "Add Agent To WhatsApp Queue",
+    "AGENTADD_WHATSAPPACCOUNT": "Add Agent To WhatsApp Account",
+    "AGENTADD_WHATSAPPQUEUE": "Add Agent To WhatsApp Queue",
+    "AGENTS": "Agents",
+    "AGENTSADD_QUEUE": "Add agents to WhatsApp queue",
+    "AGENTTRANSFER": "Agent Transfer",
+    "AGENTTRANSFERTIMEOUT": "Agent Transfer Timeout",
+    "ALL": "All",
+    "ALL_AGENTS": "All Agents",
+    "ALL_TEAMS": "All Teams",
+    "AMAZONLEX": "AmazonLex",
+    "AUTHTOKEN": "Auth Token",
+    "AUTOREPLY": "Auto Reply",
+    "BACK": "Back",
+    "BASEURL": "Base URL",
+    "BOTNAME": "Bot Name",
+    "BUSY": "Busy",
+    "CANNED_ANSWER_NOT_FOUND": "No Canned Answers were found",
+    "CANNED_ANSWER_SEARCH": "Enter a text to search a Canned Answer",
+    "CANNEDANSWERS": "Canned Answers",
+    "CAPACITY": "Capacity",
+    "CLOSE": "Close",
+    "CLOSED": "Closed",
+    "CLOSEMETHOD": "Close Method",
+    "CLOSEURL": "Close URL",
+    "COMMAND": "Command",
+    "CONDITION": "Condition",
+    "CONTACT": "Contact",
+    "CREATED_AT": "Created at",
+    "DEFAULT_PAUSE": "DEFAULT PAUSE",
+    "DELETE": "Delete",
+    "DELETE_INTERACTION": "Delete Interaction",
+    "DELETE_SELECTED": "Delete selected",
+    "DELETE_WHATSAPPACCOUNT": "Delete WhatsApp Account",
+    "DELETE_WHATSAPPCANNEDANSWER": "Deleted",
+    "DELETE_WHATSAPPDISPOSITION": "Delete WhatsApp Disposition",
+    "DELETE_WHATSAPPQUEUE": "Delete WhatsApp Queue",
+    "DESCRIPTION": "Description",
+    "DIALOGFLOW": "DialogFlow",
+    "DISPOSITION": "Disposition",
+    "DISPOSITIONS": "Dispositions",
+    "DOWNLOAD_INTERACTION": "Download",
+    "DOWNLOAD_WITH_ATTACHMENTS": "Download With Attachments",
+    "DOWNLOAD_WITHOUT_ATTACHMENTS": "Download Without Attachments",
+    "EDIT_AGENT": "Edit Agent",
+    "EDIT_AMAZONLEX": "Edit Lex configuration",
+    "EDIT_AUTOREPLY": "Edit Auto Reply",
+    "EDIT_CLOSE": "Edit Close",
+    "EDIT_DIALOGFLOW": "Edit DialogFlow configuration",
+    "EDIT_GOTOIF": "Edit Gotoif",
+    "EDIT_GOTOP": "Edit Gotop",
+    "EDIT_NOOP": "Edit Noop",
+    "EDIT_QUEUE": "Edit Queue",
+    "EDIT_SYSTEM": "Edit System",
+    "EDIT_TAG": "Edit Tag",
+    "EDIT_WHATSAPPACCOUNT": "Edit WhatsApp Account",
+    "EDIT_WHATSAPPCANNEDANSWER": "Edit",
+    "EDIT_WHATSAPPDISPOSITION": "Edit WhatsApp Disposition",
+    "EDIT_WHATSAPPQUEUE": "Edit WhatsApp Queue",
+    "ERRORS": {
+      "PROJECTID_REQUIRED": "Mandatory Field",
+      "CLIENTEMAIL_REQUIRED": "Mandatory Field",
+      "PRIVATEKEY_REQUIRED": "Mandatory Field",
+      "ACCESSKEYID_REQUIRED": "Mandatory Field",
+      "ACCOUNTSID_REQUIRED": "Mandatory Field",
+      "AGENT_REQUIRED": "Mandatory Field",
+      "AGENT_TIMEOUT_REQUIRED": "Mandatory Field",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "AGENTTRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less or equal than",
+      "AGENTTRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "AUTHTOKEN_REQUIRED": "Mandatory Field",
+      "BASEURL_REQUIRED": "Mandatory Field",
+      "BOTNAME_REQUIRED": "Mandatory Field",
+      "COMMAND_REQUIRED": "Mandatory Field",
+      "CONDITION_REQUIRED": "Mandatory Field",
+      "DESCRIPTION_REQUIRED": "Mandatory Field",
+      "DISPOSITION_REQUIRED": "Mandatory Field",
+      "FALSEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "FALSEPRIORITY_REQUIRED": "Mandatory Field",
+      "KEY_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "KEY_REQUIRED": "Mandatory Field",
+      "LANGUAGE_REQUIRED": "Mandtory Field",
+      "LEXREGION_REQUIRED": "Mandatory Field",
+      "LIST_REQUIRED": "Mandatory Field",
+      "MANDATORYDISPOSITIONPAUSEID_REQUIRED": "Mandatory Field",
+      "NAME_REQUIRED": "Mandatory Field",
+      "PHONE_REQUIRED": "Mandatory Field",
+      "PRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "PRIORITY_REQUIRED": "Mandatory Field",
+      "QUEUE_REQUIRED": "Mandatory Field",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "QUEUETRANSFERTIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less or equal than",
+      "QUEUETRANSFERTIMEOUT_REQUIRED": "Mandatory Field",
+      "SECRETACCESSKEY_REQUIRED": "Mandatory Field",
+      "TAG_REQUIRED": "Mandatory Field",
+      "TEXT_REQUIRED": "Mandatory Field",
+      "TIMEOUT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "TIMEOUT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less or equal than",
+      "TIMEOUT_REQUIRED": "Mandatory Field",
+      "TIMES_REQUIRED": "Mandatory Field",
+      "TOKEN_REQUIRED": "Mandatory Field",
+      "TRUEPRIORITY_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "TRUEPRIORITY_REQUIRED": "Mandatory Field",
+      "TYPE_REQUIRED": "Mandatory Field",
+      "VALUE_REQUIRED": "Mandatory Field",
+      "VARIABLE_REQUIRED": "Mandatory Field",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_GREATER_THAN_OR_EQUAL_TO": "The value must be greater or equal than",
+      "WAITFORTHEASSIGNEDAGENT_MUST_BE_LESS_THAN_OR_EQUAL_TO": "The value must be less or equal than",
+      "WAITFORTHEASSIGNEDAGENT_REQUIRED": "Mandatory Field",
+      "WELCOMEMESSAGE_MAX_LENGTH": "The value must have a maximum length equal to {{max}}",
+      "WELCOMEMESSAGE_REQUIRED": "Mandatory Field"
+    },
+    "FALSEPRIORITY": "False Priority",
+    "GENERAL": "General",
+    "GO_TO_WHATSAPPACCOUNTS": "Go To Account",
+    "GOTOIF": "Gotoif",
+    "GOTOP": "Gotop",
+    "GOTOREALTIME_WHATSAPPQUEUE": "Go To Realtime WhatsApp Queue",
+    "HELP": {
+      "LIST": "Contact Manager list used to associate contacts",
+      "MANDATORYDISPOSITION": "Mandatory disposition",
+      "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled",
+      "MOTIONPROXY": "The field must have the following format: <protocol>://<ipaddress>[:<port>]. Example: https://X.Y.Z.W",
+      "NAME": "Only numbers, letters and specific characters (._) are supported",
+      "RECEIVEURL": "This is the auto-generated API string you need to use to receive the messages inside your account from your WhatsApp Connector provider (POST method must be used): click the clipboard button to copy it",
+      "WELCOMEMESSAGE": "This is the first response message sent to new interactions"
+    },
+    "ID": "Id",
+    "IDLE": "Idle",
+    "INSERT_MESSAGE_HERE": "Insert message here",
+    "INTERACTIONS": "Interactions",
+    "INTERACTIONS_WHATSAPPACCOUNT": "Go to Interactions",
+    "KEY": "Key",
+    "LANGUAGE": "Language",
+    "LASTMESSAGE": "Last Message",
+    "LEXREGION": "Region",
+    "LIST": "List",
+    "LOGGED_IN": "Logged In",
+    "LOGIN_TIME": "Login Time",
+    "LOGOUT": "Logout",
+    "MANDATORYDISPOSITION": "Mandatory Disposition",
+    "MANDATORYDISPOSITIONPAUSEID": "Pause to use when mandatory disposition is enabled",
+    "MORE": "More",
+    "MOTIONPROXY": "Proxy Or Motion Domain",
+    "MULTI_SELECT_TOGGLE": "Multi select toggle",
+    "NAME": "Name",
+    "NEW_WHATSAPPACCOUNT": "New WhatsApp Account",
+    "NEW_WHATSAPPCANNEDANSWER": "New WhatsApp Canned Answer",
+    "NEW_WHATSAPPDISPOSITION": "New WhatsApp Disposition",
+    "NEW_WHATSAPPQUEUE": "New WhatsApp Queue",
+    "NO_AGENT_ONLINE": "No Agent Online",
+    "NO_AVAILABLE_INFO": "No Available Info",
+    "NO_INTERACTION_AVAILABLE": "No Interactions Available",
+    "NO_WHATSAPP_ACCOUNTS_AVAILABLE": "No WhatsApp Accounts available",
+    "NO_WHATSAPPCANNEDANSWER_AVAILABLE": "No WhatsApp Canned Answers Available",
+    "NO_WHATSAPPDISPOSITION_AVAILABLE": "No WhatsApp Dispositions Available",
+    "NOOP": "Noop",
+    "NOTE": "Note",
+    "NOTIFICATION": "Notification",
+    "NOTIFICATIONSHAKE": "Shake",
+    "NOTIFICATIONSOUND": "Sound",
+    "NOTIFICATIONTEMPLATE": "Template",
+    "OF": "of",
+    "OPENED": "Open",
+    "PAGE": "Page",
+    "PARTIALPAUSE": "Partial Pause",
+    "PAUSE": "Pause",
+    "PAUSE_TIME": "Pause Time",
+    "PAUSED": "Paused",
+    "PHONE": "Phone",
+    "PRIORITY": "Priority",
+    "PROXY": "Proxy",
+    "QUEUE": "Queue",
+    "QUEUES": "Queues",
+    "QUEUETRANSFER": "Queue Transfer",
+    "QUEUETRANSFERTIMEOUT": "Queue Transfer Timeout",
+    "READY": "Ready",
+    "REALTIME": "Realtime",
+    "RECEIVEURL": "Receive URL",
+    "DELIVERYREPORTURL": "Delivery report URL",
+    "REFRESH_INTERACTIONS": "Refresh Interactions",
+    "REMOTE": "Remote",
+    "ROWSPERPAGE": "Rows per page",
+    "SAVE": "Save",
+    "SCREENRECORDING": "Manage Screen Recording",
+    "SEARCH_FOR_ANYONE": "Search",
+    "SECRETACCESSKEY": "Access key secret",
+    "SELECT_ALL": "Select all",
+    "SELECT_NONE": "Select none",
+    "SELECTED": "Selected",
+    "SELECTED_AGENTS": "Selected Agents",
+    "SELECTED_TEAMS": "Selected Teams",
+    "SEND": "Send",
+    "SETTINGS": "Settings",
+    "SPYINTERACTION": "Spy Interaction",
+    "START_SCREENRECORDING": "Start Screen Recording",
+    "STARTEDAT": "Started at",
+    "STATUS": "Status",
+    "STOP_SCREENRECORDING": "Stop Screen Recording",
+    "STRATEGY": "Strategy",
+    "SYSTEM": "System",
+    "TAG": "Tag",
+    "TAGS": "Tags",
+    "TEAMADD_WHATSAPPQUEUE": "Add Team To WhatsApp Queue",
+    "TEAMS_ASSOCIATION": "Teams Association",
+    "TEXT": "Text",
+    "TIMEOUT": "Timeout",
+    "TIMER": "Timer",
+    "TIMES": "Times",
+    "TO": "To",
+    "TOKEN": "Token",
+    "TOOLTIP_SCREENRECORDING_OFF": "Screen Recording available",
+    "TOOLTIP_SCREENRECORDING_ON": "Screen Recording in progress",
+    "TRANSFER": "Transfer",
+    "TRUEPRIORITY": "True Priority",
+    "TYPE": "Type",
+    "UNPAUSE": "End Pause",
+    "VALUE": "Value",
+    "VARIABLE": "Variable",
+    "WAITFORTHEASSIGNEDAGENT": "Wait for the assigned agent",
+    "WAITING": "Waiting",
+    "WELCOMEMESSAGE": "Welcome Message",
+    "WHATSAPP": "WhatsApp Connector",
+    "WHATSAPPACCOUNTS": "WhatsApp Accounts",
+    "WHATSAPPCANNEDANSWERS": "WhatsApp Canned Answers",
+    "WHATSAPPDISPOSITIONS": "WhatsApp Dispositions",
+    "WHATSAPPQUEUES": "WhatsApp Queues"
+  }
+}
diff --git a/public/app/main/apps/whatsapp/i18n/id.json b/public/app/main/apps/whatsapp/i18n/id.json
index b2e703c..9a8edae 100644
--- a/public/app/main/apps/whatsapp/i18n/id.json
+++ b/public/app/main/apps/whatsapp/i18n/id.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Bidang wajib",
       "CLIENTEMAIL_REQUIRED": "Bidang wajib",
       "PRIVATEKEY_REQUIRED": "Bidang wajib",
-      "PROJECTID_REQUIRED": "Bidang wajib"
+      "PROJECTID_REQUIRED": "Bidang wajib",
+      "BASEURL_REQUIRED": "Bidang wajib"
     },
     "HELP": {
       "LIST": "Daftar Manajer Kontak digunakan untuk mengasosiasikan kontak",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Edit Dialogflow V2",
     "PRIVATEKEY": "Kunci Pribadi",
-    "PROJECTID": "ID Proyek"
+    "PROJECTID": "ID Proyek",
+    "BASEURL": "URL Dasar",
+    "DELIVERYREPORTURL": "URL laporan pengiriman"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/it.json b/public/app/main/apps/whatsapp/i18n/it.json
index 213b97e..def9326 100644
--- a/public/app/main/apps/whatsapp/i18n/it.json
+++ b/public/app/main/apps/whatsapp/i18n/it.json
@@ -244,6 +244,7 @@
     "QUEUETRANSFER": "Trasferimento in coda",
     "QUEUETRANSFERTIMEOUT": "Timeout trasferimento coda",
     "RECEIVEURL": "Ricevi URL",
+    "DELIVERYREPORTURL": "Consegna URL",
     "REFRESH_INTERACTIONS": "Aggiorna interazioni",
     "REMOTE": "A distanza",
     "SECRETACCESSKEY": "Chiave di accesso segreta",
diff --git a/public/app/main/apps/whatsapp/i18n/ja.json b/public/app/main/apps/whatsapp/i18n/ja.json
index 0350e8d..9b009b0 100644
--- a/public/app/main/apps/whatsapp/i18n/ja.json
+++ b/public/app/main/apps/whatsapp/i18n/ja.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "必須フィールド",
       "CLIENTEMAIL_REQUIRED": "必須フィールド",
       "PRIVATEKEY_REQUIRED": "必須フィールド",
-      "PROJECTID_REQUIRED": "必須フィールド"
+      "PROJECTID_REQUIRED": "必須フィールド",
+      "BASEURL_REQUIRED": "必須フィールド"
     },
     "HELP": {
       "LIST": "連絡先を関連付けるために使用される連絡先管理者リスト",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "DialogflowV2を編集する",
     "PRIVATEKEY": "秘密鍵",
-    "PROJECTID": "プロジェクトID"
+    "PROJECTID": "プロジェクトID",
+    "BASEURL": "ベースURL",
+    "DELIVERYREPORTURL": "配信レポートのURL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/ko.json b/public/app/main/apps/whatsapp/i18n/ko.json
index d6c34e1..52f1e9d 100644
--- a/public/app/main/apps/whatsapp/i18n/ko.json
+++ b/public/app/main/apps/whatsapp/i18n/ko.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "필수 필드",
       "CLIENTEMAIL_REQUIRED": "필수 필드",
       "PRIVATEKEY_REQUIRED": "필수 필드",
-      "PROJECTID_REQUIRED": "필수 필드"
+      "PROJECTID_REQUIRED": "필수 필드",
+      "BASEURL_REQUIRED": "필수 필드"
     },
     "HELP": {
       "LIST": "연락처를 연결하는 데 사용되는 연락처 관리자 목록",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Dialogflow V2 수정",
     "PRIVATEKEY": "개인 키",
-    "PROJECTID": "프로젝트 ID"
+    "PROJECTID": "프로젝트 ID",
+    "BASEURL": "기본 URL",
+    "DELIVERYREPORTURL": "배달 보고서 URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/lt.json b/public/app/main/apps/whatsapp/i18n/lt.json
index 282dd81..eb8184c 100644
--- a/public/app/main/apps/whatsapp/i18n/lt.json
+++ b/public/app/main/apps/whatsapp/i18n/lt.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Privalomas laukas",
       "CLIENTEMAIL_REQUIRED": "Privalomas laukas",
       "PRIVATEKEY_REQUIRED": "Privalomas laukas",
-      "PROJECTID_REQUIRED": "Privalomas laukas"
+      "PROJECTID_REQUIRED": "Privalomas laukas",
+      "BASEURL_REQUIRED": "Privalomas laukas"
     },
     "HELP": {
       "LIST": "Kontaktų tvarkyklės sąrašas, naudojamas kontaktams susieti",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Redaguoti „Dialogflow V2“",
     "PRIVATEKEY": "Privatus raktas",
-    "PROJECTID": "Projekto ID"
+    "PROJECTID": "Projekto ID",
+    "BASEURL": "Bazinis URL",
+    "DELIVERYREPORTURL": "Pristatymo ataskaitos URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/lv.json b/public/app/main/apps/whatsapp/i18n/lv.json
index 2389947..396be32 100644
--- a/public/app/main/apps/whatsapp/i18n/lv.json
+++ b/public/app/main/apps/whatsapp/i18n/lv.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Obligāts lauks",
       "CLIENTEMAIL_REQUIRED": "Obligāts lauks",
       "PRIVATEKEY_REQUIRED": "Obligāts lauks",
-      "PROJECTID_REQUIRED": "Obligāts lauks"
+      "PROJECTID_REQUIRED": "Obligāts lauks",
+      "BASEURL_REQUIRED": "Obligāts lauks"
     },
     "HELP": {
       "LIST": "Kontaktu pārvaldnieka saraksts, ko izmanto kontaktu saistīšanai",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Rediģēt Dialogflow V2",
     "PRIVATEKEY": "Privātā atslēga",
-    "PROJECTID": "Projekta ID"
+    "PROJECTID": "Projekta ID",
+    "BASEURL": "Pamata URL",
+    "DELIVERYREPORTURL": "Piegādes pārskata URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/nl.json b/public/app/main/apps/whatsapp/i18n/nl.json
index 85a42ac..18e8cc9 100644
--- a/public/app/main/apps/whatsapp/i18n/nl.json
+++ b/public/app/main/apps/whatsapp/i18n/nl.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Verplicht veld",
       "CLIENTEMAIL_REQUIRED": "Verplicht veld",
       "PRIVATEKEY_REQUIRED": "Verplicht veld",
-      "PROJECTID_REQUIRED": "Verplicht veld"
+      "PROJECTID_REQUIRED": "Verplicht veld",
+      "BASEURL_REQUIRED": "Verplicht veld"
     },
     "HELP": {
       "LIST": "Contact Manager-lijst gebruikt om contacten te koppelen",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Bewerk Dialogflow V2",
     "PRIVATEKEY": "Prive sleutel",
-    "PROJECTID": "Project-ID"
+    "PROJECTID": "Project-ID",
+    "BASEURL": "Basis-URL",
+    "DELIVERYREPORTURL": "URL van leveringsrapport"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/no.json b/public/app/main/apps/whatsapp/i18n/no.json
index b8c8675..e7ee9b7 100644
--- a/public/app/main/apps/whatsapp/i18n/no.json
+++ b/public/app/main/apps/whatsapp/i18n/no.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Obligatoriske felt",
       "CLIENTEMAIL_REQUIRED": "Obligatoriske felt",
       "PRIVATEKEY_REQUIRED": "Obligatoriske felt",
-      "PROJECTID_REQUIRED": "Obligatoriske felt"
+      "PROJECTID_REQUIRED": "Obligatoriske felt",
+      "BASEURL_REQUIRED": "Obligatoriske felt"
     },
     "HELP": {
       "LIST": "Kontakt managerliste som ble brukt til å knytte kontakter",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Rediger Dialogflow V2",
     "PRIVATEKEY": "Privat nøkkel",
-    "PROJECTID": "Prosjekt-ID"
+    "PROJECTID": "Prosjekt-ID",
+    "BASEURL": "Base URL",
+    "DELIVERYREPORTURL": "Nettadresse for leveringsrapport"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/pl.json b/public/app/main/apps/whatsapp/i18n/pl.json
index da5dad6..c066e25 100644
--- a/public/app/main/apps/whatsapp/i18n/pl.json
+++ b/public/app/main/apps/whatsapp/i18n/pl.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Pole obowiązkowe",
       "CLIENTEMAIL_REQUIRED": "Pole obowiązkowe",
       "PRIVATEKEY_REQUIRED": "Pole obowiązkowe",
-      "PROJECTID_REQUIRED": "Pole obowiązkowe"
+      "PROJECTID_REQUIRED": "Pole obowiązkowe",
+      "BASEURL_REQUIRED": "Pole obowiązkowe"
     },
     "HELP": {
       "LIST": "Lista menedżera kontaktów używana do kojarzenia kontaktów",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Edytuj Dialogflow V2",
     "PRIVATEKEY": "Prywatny klucz",
-    "PROJECTID": "Identyfikator projektu"
+    "PROJECTID": "Identyfikator projektu",
+    "BASEURL": "Podstawowy adres URL",
+    "DELIVERYREPORTURL": "Adres URL raportu doręczenia"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/pt-BR.json b/public/app/main/apps/whatsapp/i18n/pt-BR.json
index ec3412a..97549f4 100644
--- a/public/app/main/apps/whatsapp/i18n/pt-BR.json
+++ b/public/app/main/apps/whatsapp/i18n/pt-BR.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Campo Obrigatório",
       "CLIENTEMAIL_REQUIRED": "Campo Obrigatório",
       "PRIVATEKEY_REQUIRED": "Campo Obrigatório",
-      "PROJECTID_REQUIRED": "Campo Obrigatório"
+      "PROJECTID_REQUIRED": "Campo Obrigatório",
+      "BASEURL_REQUIRED": "Campo Obrigatório"
     },
     "HELP": {
       "LIST": "Lista do gerenciador de contatos usada para associar contatos",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Editar Dialogflow V2",
     "PRIVATEKEY": "Chave privada",
-    "PROJECTID": "ID do projeto"
+    "PROJECTID": "ID do projeto",
+    "BASEURL": "URL base",
+    "DELIVERYREPORTURL": "URL do relatório de entrega"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/pt-PT.json b/public/app/main/apps/whatsapp/i18n/pt-PT.json
index ec3412a..97549f4 100644
--- a/public/app/main/apps/whatsapp/i18n/pt-PT.json
+++ b/public/app/main/apps/whatsapp/i18n/pt-PT.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Campo Obrigatório",
       "CLIENTEMAIL_REQUIRED": "Campo Obrigatório",
       "PRIVATEKEY_REQUIRED": "Campo Obrigatório",
-      "PROJECTID_REQUIRED": "Campo Obrigatório"
+      "PROJECTID_REQUIRED": "Campo Obrigatório",
+      "BASEURL_REQUIRED": "Campo Obrigatório"
     },
     "HELP": {
       "LIST": "Lista do gerenciador de contatos usada para associar contatos",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Editar Dialogflow V2",
     "PRIVATEKEY": "Chave privada",
-    "PROJECTID": "ID do projeto"
+    "PROJECTID": "ID do projeto",
+    "BASEURL": "URL base",
+    "DELIVERYREPORTURL": "URL do relatório de entrega"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/ru.json b/public/app/main/apps/whatsapp/i18n/ru.json
index 87a083a..ad4ae06 100644
--- a/public/app/main/apps/whatsapp/i18n/ru.json
+++ b/public/app/main/apps/whatsapp/i18n/ru.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Обязательное поле",
       "CLIENTEMAIL_REQUIRED": "Обязательное поле",
       "PRIVATEKEY_REQUIRED": "Обязательное поле",
-      "PROJECTID_REQUIRED": "Обязательное поле"
+      "PROJECTID_REQUIRED": "Обязательное поле",
+      "BASEURL_REQUIRED": "Обязательное поле"
     },
     "HELP": {
       "LIST": "Список диспетчера контактов, используемый для связывания контактов",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Редактировать Dialogflow V2",
     "PRIVATEKEY": "Закрытый ключ",
-    "PROJECTID": "ID проекта"
+    "PROJECTID": "ID проекта",
+    "BASEURL": "Базовый URL",
+    "DELIVERYREPORTURL": "URL отчета о доставке"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/sv.json b/public/app/main/apps/whatsapp/i18n/sv.json
index f4f2b7e..ff6d06b 100644
--- a/public/app/main/apps/whatsapp/i18n/sv.json
+++ b/public/app/main/apps/whatsapp/i18n/sv.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Obligatoriskt fält",
       "CLIENTEMAIL_REQUIRED": "Obligatoriskt fält",
       "PRIVATEKEY_REQUIRED": "Obligatoriskt fält",
-      "PROJECTID_REQUIRED": "Obligatoriskt fält"
+      "PROJECTID_REQUIRED": "Obligatoriskt fält",
+      "BASEURL_REQUIRED": "Obligatoriskt fält"
     },
     "HELP": {
       "LIST": "Lista över kontakthanterare som används för att koppla kontakter",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Redigera Dialogflow V2",
     "PRIVATEKEY": "Privat nyckel",
-    "PROJECTID": "Projekt-ID"
+    "PROJECTID": "Projekt-ID",
+    "BASEURL": "Bas-URL",
+    "DELIVERYREPORTURL": "Leveransrapportens URL"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/tr.json b/public/app/main/apps/whatsapp/i18n/tr.json
index e867462..ffd9208 100644
--- a/public/app/main/apps/whatsapp/i18n/tr.json
+++ b/public/app/main/apps/whatsapp/i18n/tr.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "Zorunlu alan",
       "CLIENTEMAIL_REQUIRED": "Zorunlu alan",
       "PRIVATEKEY_REQUIRED": "Zorunlu alan",
-      "PROJECTID_REQUIRED": "Zorunlu alan"
+      "PROJECTID_REQUIRED": "Zorunlu alan",
+      "BASEURL_REQUIRED": "Zorunlu alan"
     },
     "HELP": {
       "LIST": "Kişileri ilişkilendirmek için kullanılan Kişi Yöneticisi listesi",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "Dialogflow V2'yi düzenle",
     "PRIVATEKEY": "Özel anahtar",
-    "PROJECTID": "Proje kimliği"
+    "PROJECTID": "Proje kimliği",
+    "BASEURL": "Temel URL",
+    "DELIVERYREPORTURL": "Teslim raporu URL'si"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/zh-CN.json b/public/app/main/apps/whatsapp/i18n/zh-CN.json
index b81f80a..8ea64c6 100644
--- a/public/app/main/apps/whatsapp/i18n/zh-CN.json
+++ b/public/app/main/apps/whatsapp/i18n/zh-CN.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "必填项",
       "CLIENTEMAIL_REQUIRED": "必填项",
       "PRIVATEKEY_REQUIRED": "必填项",
-      "PROJECTID_REQUIRED": "必填项"
+      "PROJECTID_REQUIRED": "必填项",
+      "BASEURL_REQUIRED": "必填项"
     },
     "HELP": {
       "LIST": "用于关联联系人的联系人管理器列表",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "编辑Dialogflow V2",
     "PRIVATEKEY": "私钥",
-    "PROJECTID": "专案编号"
+    "PROJECTID": "专案编号",
+    "BASEURL": "基本网址",
+    "DELIVERYREPORTURL": "送达报告网址"
   }
 }
diff --git a/public/app/main/apps/whatsapp/i18n/zh-TW.json b/public/app/main/apps/whatsapp/i18n/zh-TW.json
index cb5a2ee..54eb394 100644
--- a/public/app/main/apps/whatsapp/i18n/zh-TW.json
+++ b/public/app/main/apps/whatsapp/i18n/zh-TW.json
@@ -50,7 +50,8 @@
       "WELCOMEMESSAGE_REQUIRED": "必填項",
       "CLIENTEMAIL_REQUIRED": "必填項",
       "PRIVATEKEY_REQUIRED": "必填項",
-      "PROJECTID_REQUIRED": "必填項"
+      "PROJECTID_REQUIRED": "必填項",
+      "BASEURL_REQUIRED": "必填項"
     },
     "HELP": {
       "LIST": "用於關聯聯繫人的聯繫人管理器列表",
@@ -239,6 +240,8 @@
     "DIALOGFLOWV2": "Dialogflow V2",
     "EDIT_DIALOGFLOWV2": "編輯Dialogflow V2",
     "PRIVATEKEY": "私鑰",
-    "PROJECTID": "專案編號"
+    "PROJECTID": "專案編號",
+    "BASEURL": "基本網址",
+    "DELIVERYREPORTURL": "送達報告網址"
   }
 }
diff --git a/public/app/quick-panel/i18n/de.json b/public/app/quick-panel/i18n/de.json
index 3162f7a..fd8ccd9 100644
--- a/public/app/quick-panel/i18n/de.json
+++ b/public/app/quick-panel/i18n/de.json
@@ -23,38 +23,38 @@
     "CHAT": "CHAT",
     "ACTIVITY": "Aktivität",
     "FRIENDS": "Freunde",
-    "APP_SERVERS": "Anwendungsserver",
-    "USER_STATS": "Benutzer Stats",
-    "EVENTS": "Veranstaltungen",
-    "NOTES": "Hinweise",
-    "QUICK_SETTINGS": "Schnelle Einstellungen",
+    "APP_SERVERS": "Server Anwendung",
+    "USER_STATS": "Benutzer Statistiken",
+    "EVENTS": "Ereignisse",
+    "NOTES": "Notizen",
+    "QUICK_SETTINGS": "Schnelleinstellungen",
     "NOTIFICATIONS": "Benachrichtigungen",
     "CLOUD_SYNC": "Cloud Synchronisieren",
-    "RETRO_THRUSTERS": "Retro Triebwerke",
-    "RECENT": "Die jüngsten",
+    "RETRO_THRUSTERS": "Retro Thrusters",
+    "RECENT": "Neuste",
     "START_NEW_CHAT": "Neuen Chat starten",
     "BACK": "Zurück",
-    "CALL": "Anruf",
+    "CALL": "Anrufen",
     "MORE": "Mehr",
     "SEND_MESSAGE": "Nachricht senden",
-    "REPLY_PLACEHOLDER": "Geben Sie ein, und drücken Sie die Eingabetaste, um Nachricht senden",
-    "CONTACT_XCALLY_MOTION_SUPPORT": "Kontakt xCALLY Motion Support",
+    "REPLY_PLACEHOLDER": "Nachricht eingeben und Enter drücken zum Senden",
+    "CONTACT_XCALLY_MOTION_SUPPORT": "Support kontaktieren",
     "EXPIRATION_DATE": "Ablaufdatum",
     "EXPIRATION_REASON": "Ablauf Grund",
     "LICENSE": "Lizenz",
-    "NEW_TOKEN": "Neue Token",
-    "OLD_TOKEN": "Alte Token",
+    "NEW_TOKEN": "Neuer Token",
+    "OLD_TOKEN": "Alter Token",
     "SEND_EMAIL_TO": "E-Mail senden an",
     "TOKEN": "Token",
-    "EXPIRATION_REASON_MESSAGE": "Ihre Lizenz ist abgelaufen oder Ihre Maschine eindeutige Id wurde aufgrund einer Änderung an Ihrem System aktualisiert. Die xCALLY Motion Support Team Ihre alte und Ihre neue uuid senden Kontakt.",
-    "GRAY_PERIOD_EXPIRATION": "Grau Zeitraum Ablauf",
+    "EXPIRATION_REASON_MESSAGE": "Ihre Lizenz ist abgelaufen oder Ihre eindeutige ID wurde aufgrund einer Änderung an Ihrem System aktualisiert. Bitte den Support kontaktieren",
+    "GRAY_PERIOD_EXPIRATION": "Ablauf Testphase",
     "ERRORS": {
       "NAME_REQUIRED": "Pflichtfeld"
     },
-    "EXPIRATION_GRAY_PERIOD": "Ablauf Grauzeit",
-    "NO_AVAILABLE_GROUPS": "Keine verfügbaren Gruppen",
-    "SAVE": "sparen",
-    "INFO": "Info",
+    "EXPIRATION_GRAY_PERIOD": "Ablauf Testphase",
+    "NO_AVAILABLE_GROUPS": "Keine Gruppen verfügbar",
+    "SAVE": "Speichern",
+    "INFO": "Information",
     "NEW_CHATGROUP": "Neue Gruppe",
     "NAME": "Name",
     "MEMBERS": "Mitglieder",
@@ -65,9 +65,9 @@
     "DELETE": "Löschen",
     "SEARCH": "Suche",
     "USERS": "Benutzer",
-    "EXPIRATION_REASON_MESSAGE_GRAY": "Ihre Lizenz ist abgelaufen oder wurde deaktiviert. Kontaktieren Sie xCALLY Motion Support Team.",
-    "EXPIRATION_REASON_MESSAGE_CHANGED": "Die eindeutige ID Ihres Rechners wurde aufgrund einer Änderung Ihres Systems aktualisiert. Kontaktieren Sie xCALLY Motion Support Team, das sowohl Ihren alten als auch Ihren neuen UUID sendet.",
-    "MESSENGER_DISABLED": "Das interne Messaging ist für diesen Agenten deaktiviert!",
+    "EXPIRATION_REASON_MESSAGE_GRAY": "Ihre Lizenz ist abgelaufen oder wurde deaktiviert. Bitte den Support kontaktieren.",
+    "EXPIRATION_REASON_MESSAGE_CHANGED": "Ihre Lizenz ist abgelaufen oder Ihre eindeutige ID wurde aufgrund einer Änderung an Ihrem System aktualisiert. Bitte den Support kontaktieren",
+    "MESSENGER_DISABLED": "Internes Messaging für diesen Benutzer nicht aktiviert",
     "WARNING": "Warnung"
   }
 }
diff --git a/public/app/quick-panel/i18n/hu.json b/public/app/quick-panel/i18n/hu.json
new file mode 100644
index 0000000..fd2a755
--- /dev/null
+++ b/public/app/quick-panel/i18n/hu.json
@@ -0,0 +1,73 @@
+{
+  "QUICKPANEL": {
+    "EXPIRATION_GRAY_PERIOD": "Expiration Gray Period",
+    "NO_AVAILABLE_GROUPS": "No Available Groups",
+    "SAVE": "Save",
+    "INFO": "Info",
+    "NEW_CHATGROUP": "New Group",
+    "NAME": "Name",
+    "MEMBERS": "Members",
+    "ENABLE_WRITING": "Enable Writing",
+    "GROUPS": "Groups",
+    "YOU": "You + {{participants}}",
+    "NEW_INTERNAL_MESSAGE": "New internal message",
+    "DELETE": "Delete",
+    "SEARCH": "Search",
+    "USERS": "Users",
+    "TODAY": "TODAY",
+    "MONDAY": "Monday",
+    "TUESDAY": "Tuesday",
+    "WEDNESDAY": "Wednesday",
+    "THURSDAY": "Thursday",
+    "FRIDAY": "Friday",
+    "SATURDAY": "Saturday",
+    "SUNDAY": "Sunday",
+    "JANUARY": "January",
+    "FEBRUARY": "February",
+    "MARCH": "March",
+    "APRIL": "April",
+    "MAY": "May",
+    "JUNE": "June",
+    "JULY": "July",
+    "AUGUST": "August",
+    "SEPTEMBER": "September",
+    "OCTOBER": "October",
+    "NOVEMBER": "November",
+    "DECEMBER": "December",
+    "CHAT": "CHAT",
+    "ACTIVITY": "ACTIVITY",
+    "FRIENDS": "Friends",
+    "APP_SERVERS": "Application Servers",
+    "USER_STATS": "User Stats",
+    "EVENTS": "Events",
+    "NOTES": "Notes",
+    "QUICK_SETTINGS": "Quick Settings",
+    "NOTIFICATIONS": "Notifications",
+    "CLOUD_SYNC": "Cloud Sync",
+    "RETRO_THRUSTERS": "Retro Thrusters",
+    "RECENT": "Recent",
+    "START_NEW_CHAT": "Start New Chat",
+    "BACK": "Back",
+    "CALL": "Call",
+    "MORE": "More",
+    "SEND_MESSAGE": "Send message",
+    "REPLY_PLACEHOLDER": "Type and hit enter to send message",
+    "CONTACT_XCALLY_MOTION_SUPPORT": "Contact xCALLY Motion Support",
+    "EXPIRATION_DATE": "Expiration Date",
+    "EXPIRATION_REASON": "Expiration Reason",
+    "LICENSE": "License",
+    "NEW_TOKEN": "New Token",
+    "OLD_TOKEN": "Old Token",
+    "SEND_EMAIL_TO": "Send Email To",
+    "TOKEN": "Token",
+    "EXPIRATION_REASON_MESSAGE": "Your license has expired or your machine unique id has been updated due to a change to your system. Contact xCALLY Motion Support Team sending both your old and your new uuid.",
+    "GRAY_PERIOD_EXPIRATION": "Gray Period Expiration",
+    "EXPIRATION_REASON_MESSAGE_GRAY": "Your license has expired or has been disabled. Contact xCALLY Motion Support Team.",
+    "EXPIRATION_REASON_MESSAGE_CHANGED": "Your machine unique id has been updated due to a change to your system. Contact xCALLY Motion Support Team sending both your old and your new uuid.",
+    "MESSENGER_DISABLED": "The internal messaging is disabled for this agent!",
+    "WARNING": "Warning",
+    "ERRORS": {
+      "NAME_REQUIRED": "Mandatory Field"
+    }
+  }
+}
diff --git a/public/app/reset/i18n/de.json b/public/app/reset/i18n/de.json
index 1d7248b..6eb58fc 100644
--- a/public/app/reset/i18n/de.json
+++ b/public/app/reset/i18n/de.json
@@ -1,20 +1,20 @@
 {
   "RESETPASSWORD": {
-    "TITLE": "Ihr Kennwort zurücksetzen",
-    "EMAIL_ADRESS": "E-mail Adresse",
-    "PASSWORD": "Kennwort",
-    "PASSWORD_CONFIRM": "Kennwort (bestätigen)",
-    "UPDATE_PASSWORD": "Kennwort zurücksetzen",
+    "TITLE": "Passwort zurücksetzen",
+    "EMAIL_ADRESS": "E-Mail Adresse",
+    "PASSWORD": "Passwort",
+    "PASSWORD_CONFIRM": "Passwort bestätigen",
+    "UPDATE_PASSWORD": "Passwort zurücksetzen",
     "GO_BACK": "Zurück zum Login",
-    "PASSWORD_RESET": "Kennwort zurücksetzen",
-    "PASSWORD_RESET_MESSAGE": "Ihr Passwort wurde korrekt zurückgesetzt wurde, können Sie sich jetzt!",
-    "PASSWORD_RESET_ERROR": "Passwort Fehler zurücksetzen",
+    "PASSWORD_RESET": "Passwort zurücksetzen",
+    "PASSWORD_RESET_MESSAGE": "Das Passwort wurde erfolgreich zurückgesetzt. Sie können sich nun erneut anmelden",
+    "PASSWORD_RESET_ERROR": "Fehler beim Zurücksetzen des Passwortes",
     "ERRORS": {
-      "EMAIL_REQUIRED": "Im Feld \"E-Mail ist erforderlich",
-      "EMAIL_MUST_VALID": "E-Mail muss eine gültige e-mail Adresse",
-      "PASSWORD_REQUIRED": "Kennwort Feld ist erforderlich.",
+      "EMAIL_REQUIRED": "E-Mail Adresse erfoderlich",
+      "EMAIL_MUST_VALID": "E-Mail Adresse ungültig",
+      "PASSWORD_REQUIRED": "Passwort erforderlich",
       "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein.",
-      "SECURE_PASSWORD_PATTERN": "Muss mindestens 8 Zeichen enthalten, mit einem Minimum von 1 Kleinbuchstaben, Großbuchstaben, 1 numerisches und 1 Sonderzeichen ~!?*@#$%^&-_=+[{]}."
+      "SECURE_PASSWORD_PATTERN": "Muss mindestens 8 Zeichen enthalten, Minimum von 1 Kleinbuchstabe, 1 Großbuchstabe, 1 Zahl und 1 Sonderzeichen ~!?*@#$%^&-_=+[{]}."
     }
   }
 }
diff --git a/public/app/reset/i18n/hu.json b/public/app/reset/i18n/hu.json
new file mode 100644
index 0000000..c3cf8da
--- /dev/null
+++ b/public/app/reset/i18n/hu.json
@@ -0,0 +1,20 @@
+{
+  "RESETPASSWORD": {
+    "TITLE": "Reset your password",
+    "EMAIL_ADRESS": "Email address",
+    "PASSWORD": "Password",
+    "PASSWORD_CONFIRM": "Password (Confirm)",
+    "UPDATE_PASSWORD": "RESET MY PASSWORD",
+    "GO_BACK": "Go back to login",
+    "PASSWORD_RESET": "Password Reset",
+    "PASSWORD_RESET_MESSAGE": "Your password has been correctly reset, you can now login!",
+    "PASSWORD_RESET_ERROR": "Password Reset Error",
+    "ERRORS": {
+      "EMAIL_REQUIRED": "Email field is required",
+      "EMAIL_MUST_VALID": "Email must be a valid e-mail address",
+      "PASSWORD_REQUIRED": "Password field is required",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "SECURE_PASSWORD_PATTERN": "Must contain at least 8 characters, with a minimum of 1 lowercase letter, 1 uppercase letter, 1 numeric character and 1 special character ~!?*@#$%^&-_=+[{]}."
+    }
+  }
+}
diff --git a/public/app/toolbar/i18n/ar.json b/public/app/toolbar/i18n/ar.json
index 1eca15e..f210070 100644
--- a/public/app/toolbar/i18n/ar.json
+++ b/public/app/toolbar/i18n/ar.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "قام {{ip}} بتسجيل الدخول باستخدام بيانات الاعتماد الخاصة بك.\nغير مسموح بتسجيل الدخول المتعدد",
     "LOGOUT": "تسجيل خروج",
     "SESSION_TIMEOUT": "سيتم إغلاق الجلسة تلقائيًا بعد 60 ثانية",
-    "PHONE2CALL": "هاتف للاتصال"
+    "HUNGARIAN": "المجرية"
   }
 }
diff --git a/public/app/toolbar/i18n/cs.json b/public/app/toolbar/i18n/cs.json
index d4113cb..f93aa2e 100644
--- a/public/app/toolbar/i18n/cs.json
+++ b/public/app/toolbar/i18n/cs.json
@@ -105,6 +105,6 @@
     "WEBRTC_SPEAKER_NOT_AVAILABLE": "Není k dispozici žádný reproduktor",
     "LOGOUT": "Odhlásit se",
     "SESSION_TIMEOUT": "Relace bude automaticky ukončena po 60 sekundách",
-    "PHONE2CALL": "Telefon na zavolání"
+    "HUNGARIAN": "maďarský"
   }
 }
diff --git a/public/app/toolbar/i18n/da.json b/public/app/toolbar/i18n/da.json
index 0363877..cdc81a8 100644
--- a/public/app/toolbar/i18n/da.json
+++ b/public/app/toolbar/i18n/da.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} er logget ind med dine legitimationsoplysninger.\nFlere login er ikke tilladt",
     "LOGOUT": "Log ud",
     "SESSION_TIMEOUT": "Sessionen lukkes automatisk efter 60 sekunder",
-    "PHONE2CALL": "Telefon for at ringe"
+    "HUNGARIAN": "ungarsk"
   }
 }
diff --git a/public/app/toolbar/i18n/de.json b/public/app/toolbar/i18n/de.json
index 6ac0598..a8dc576 100644
--- a/public/app/toolbar/i18n/de.json
+++ b/public/app/toolbar/i18n/de.json
@@ -1,11 +1,11 @@
 {
   "TOOLBAR": {
-    "TOGGLE_NAVIGATION": "Navigation wechseln",
-    "TOGGLE_NAVIGATION_FOLD": "Navigation wechseln Fach",
-    "TOGGLE_NAVIGATION_MODE": "Navigation Modus umschalten",
+    "TOGGLE_NAVIGATION": "Navigation umschalten",
+    "TOGGLE_NAVIGATION_FOLD": "Navigation einklappen",
+    "TOGGLE_NAVIGATION_MODE": "Navigation Moduswechsel",
     "SEARCH": "Suche",
-    "USER_SETTINGS": "Benutzereinstellungen",
-    "TOGGLE_QUICK_PANEL": "Um schnelle Panel",
+    "USER_SETTINGS": "Nutzereinstellungen",
+    "TOGGLE_QUICK_PANEL": "Schnelles Panel umschalten",
     "ENGLISH": "Englisch",
     "ITALIAN": "Italienisch",
     "FRENCH": "Französisch",
@@ -18,93 +18,93 @@
     "CHINESESIMPLIFIED": "Vereinfachtes Chinesisch",
     "CHINESETRADITIONAL": "Traditionelles Chinesisch",
     "DUTCH": "Niederländisch",
-    "FINNISH": "Finnische",
+    "FINNISH": "Finnisch",
     "DANISH": "Dänisch",
     "PORTUGUESE": "Portugiesisch",
     "NORWEGIAN": "Norwegisch",
     "HINDI": "Hindi",
     "TURKISH": "Türkisch",
     "PERSIAN": "Persisch",
-    "LOGIN_TIME": "Login Zeit",
-    "PAUSE_TIME": "Pausenzeit",
+    "LOGIN_TIME": "Zeit angemeldet",
+    "PAUSE_TIME": "Zeit in Pause",
     "PREVIEW": "Vorschau",
     "CONFIRM_PASSWORD": "Passwort bestätigen",
     "NEW_PASSWORD": "Neues Passwort",
     "OLD_PASSWORD": "Altes Passwort",
     "SAVE": "Speichern",
     "TRIAL_VERSION": "Testversion",
-    "SOMEONE_LOGGED_YOU_OUT": "Jemand eingeloggt haben, möchten Sie angemeldet bleiben?",
+    "SOMEONE_LOGGED_YOU_OUT": "Sie wurden von einem anderen Benutzer abgemeldet. Erneut anmelden?",
     "STAY_LOGGED": "Angemeldet bleiben",
     "WARNING": "Warnung",
     "PAUSE": "Pause",
-    "RESUME": "Lebenslauf",
-    "NO_PAUSES_AVAILABLE": "Keine Pausen zur Verfügung",
-    "LATVIAN": "Lettische",
+    "RESUME": "Fortsetzen",
+    "NO_PAUSES_AVAILABLE": "Keine Pausen verfügbar",
+    "LATVIAN": "Lettisch",
     "POLISH": "Polnisch",
     "ERRORS": {
       "FIELD_REQUIRED": "Pflichtfeld",
       "PASSWORD_REQUIRED": "Pflichtfeld",
       "CONFIRM_NOT_MATCH": "Die Passwörter stimmen nicht überein",
-      "SECURE_PASSWORD_PATTERN": "Das Passwort muss mindestens 8 Zeichen lang sein und 1 Kleinbuchstabe, 1 Großbuchstabe, 1 Zahl und 1 Sonderzeichen haben ~! @",
-      "PASSWORD_OLDPASSWORD_MATCH": "Das neue Passwort muss sich vom vorherigen Passwort unterscheiden"
+      "SECURE_PASSWORD_PATTERN": "Das Passwort muss mindestens 8 Zeichen lang sein und 1 Kleinbuchstaben, 1 Großbuchstaben, 1 Zahl und 1 Sonderzeichen enthalten.",
+      "PASSWORD_OLDPASSWORD_MATCH": "Die Passwörter stimmen nicht überein"
     },
     "RESETPASSWORD": "Passwort zurücksetzen",
-    "PASSWORD_EXPIRE_REMAINING_DAYS": "Verbleibende Tage, bevor Ihr Passwort abläuft",
+    "PASSWORD_EXPIRE_REMAINING_DAYS": "Verbleibende Tage, bis zum Ablauf des Passwortes",
     "BROWSER_COMPATIBILITY": "Browserkompatibilität [Chrome, Opera, Safari]",
     "RECORDING": "Aufzeichnung",
-    "INVALID_LICENSE": "Ungültige Lizenz",
+    "INVALID_LICENSE": "Lizenz ungültig",
     "BROWSER": "Browser",
     "OS": "Betriebssystem",
-    "REQUIREMENTS": "Bedarf",
+    "REQUIREMENTS": "Anforderungen",
     "LICENSE": "Lizenz",
     "HTTPS": "HTTPS",
     "WEBRTCSUPPORT": "WebRTC-Unterstützung",
-    "REGISTERED": "Eingetragen",
+    "REGISTERED": "Registriert",
     "NOT_REGISTERED": "Nicht registriert",
-    "WEBRTC_LICENSE_NOT_ENABELD": "Die WebRTC-Lizenz ist nicht aktiviert",
-    "ATTENDED_TRANSFER": "Begleiteter Tranfer",
+    "WEBRTC_LICENSE_NOT_ENABELD": "WebRTC-Lizenz ist nicht aktiviert",
+    "ATTENDED_TRANSFER": "Warmer Transfer",
     "TRANSFER": "Transfer",
     "TARGET": "Ziel",
-    "CANCEL": "Stornieren",
+    "CANCEL": "Abbrechen",
     "FILENAME": "Dateiname",
     "STATUS": "Status",
     "ACTIONS": "Aktionen",
-    "SPEAKER": "Redner",
-    "RINGING": "Klingelton",
+    "SPEAKER": "Lautsprecher",
+    "RINGING": "Klingeln",
     "MICROPHONE": "Mikrofon",
     "PROFILE": "Profil",
-    "SERVICES": "Dienstleistungen",
+    "SERVICES": "Dienste",
     "AUDIO": "Audio",
     "FULLNAME": "Vollständiger Name",
     "NAME": "Name",
     "INTERNAL": "Intern",
-    "RINGINGDEVICE": "Klingelgerät",
-    "SPEAKERDEVICE": "Lautsprechergerät",
-    "MICROPHONEDEVICE": "Mikrofon Gerät",
+    "RINGINGDEVICE": "Klingeln auf Gerät",
+    "SPEAKERDEVICE": "Verwendeter Lautsprecher",
+    "MICROPHONEDEVICE": "Verwendetes Mikrofon",
     "CHANGEPASSWORD": "Passwort ändern",
-    "SETTINGS": "die Einstellungen",
+    "SETTINGS": "Einstellungen",
     "AUTOANSWER": "Automatische Antwort",
     "INDONESIAN": "Indonesisch",
     "ARABIC": "Arabisch",
-    "CALL": "Anruf",
+    "CALL": "Anrufen",
     "PREFIXES": "Präfixe",
     "HEBREW": "Hebräisch",
-    "ESTONIAN": "estnisch",
+    "ESTONIAN": "Estnisch",
     "CZECH": "Tschechisch",
-    "BRAZILIAN": "Brasilianer",
-    "CONFERENCE": "Konferenz mit 2 aktiven Sessions",
-    "CHANGE_LANGUAGE_MESSAGE": "Denken Sie daran, die Seite zu aktualisieren, um die RTL-Unterstützung anzuwenden (falls aktiviert).",
+    "BRAZILIAN": "Brasilianisch",
+    "CONFERENCE": "Konferenz mit 2 aktiven Sitzungen",
+    "CHANGE_LANGUAGE_MESSAGE": "Bitte Seite aktualisieren, um Änderungen zu übernehmen",
     "CHANGE_LANGUAGE_TITLE": "Sprache ändern",
     "WEBRTC_AUDIO_DEVICES_NOT_AVAILABLE": "Keine Audiogeräte verfügbar",
     "WEBRTC_MICROPHONE_NOT_AVAILABLE": "Kein Mikrofon vorhanden",
     "WEBRTC_SPEAKER_NOT_AVAILABLE": "Kein Lautsprecher verfügbar",
     "NO_AVAILABLE_INFO": "Keine verfügbaren Informationen",
-    "LITHUANIAN": "litauisch",
+    "LITHUANIAN": "Litauisch",
     "NOTIFICATION_TITLE": "Neue Benachrichtigung von {{Absender}}",
     "NOTIFICATION_TITLE_RECIPIENT": "an {{Empfänger}}",
     "USER_FORCE_LOGOUT": "{{ip}} hat sich mit Ihren Anmeldeinformationen angemeldet.\nMehrfachanmeldungen sind nicht zulässig",
     "LOGOUT": "Ausloggen",
     "SESSION_TIMEOUT": "Die Sitzung wird nach 60 Sekunden automatisch geschlossen",
-    "PHONE2CALL": "Telefon zum Anrufen"
+    "HUNGARIAN": "ungarisch"
   }
 }
diff --git a/public/app/toolbar/i18n/en.json b/public/app/toolbar/i18n/en.json
index 89ac174..1e9a532 100644
--- a/public/app/toolbar/i18n/en.json
+++ b/public/app/toolbar/i18n/en.json
@@ -17,7 +17,6 @@
     "REQUIREMENTS": "Requirements",
     "LICENSE": "License",
     "HTTPS": "HTTPS",
-    "PHONE2CALL": "Phone to call",
     "WEBRTCSUPPORT": "WebRTC Support",
     "REGISTERED": "Registered",
     "NOT_REGISTERED": "Not registered",
@@ -71,6 +70,7 @@
     "PORTUGUESE": "Portuguese",
     "NORWEGIAN": "Norwegian",
     "HINDI": "Hindi",
+    "HUNGARIAN": "Hungarian",
     "TURKISH": "Turkish",
     "PERSIAN": "Persian",
     "LATVIAN": "Latvian",
@@ -105,6 +105,9 @@
     "NOTIFICATION_TITLE_RECIPIENT": "to {{recipient}}",
     "USER_FORCE_LOGOUT": "{{ip}} has logged in with your credentials. \nMultiple logins are not allowed",
     "LOGOUT": "Logout",
-    "SESSION_TIMEOUT": "The session will be automatically closed after 60 seconds"
+    "SESSION_TIMEOUT": "The session will be automatically closed after 60 seconds",
+    "HELP": {
+      "PREVIEW_RECALLME": "This is a Recall Me call scheduled for {{date}}"
+    }
   }
 }
diff --git a/public/app/toolbar/i18n/es.json b/public/app/toolbar/i18n/es.json
index 48e718d..5418385 100644
--- a/public/app/toolbar/i18n/es.json
+++ b/public/app/toolbar/i18n/es.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} ha iniciado sesión con sus credenciales.\nNo se permiten múltiples inicios de sesión",
     "LOGOUT": "Cerrar sesión",
     "SESSION_TIMEOUT": "La sesión se cerrará automáticamente después de 60 segundos.",
-    "PHONE2CALL": "Teléfono para llamar"
+    "HUNGARIAN": "húngaro"
   }
 }
diff --git a/public/app/toolbar/i18n/et.json b/public/app/toolbar/i18n/et.json
index 70bfe9f..b919cf8 100644
--- a/public/app/toolbar/i18n/et.json
+++ b/public/app/toolbar/i18n/et.json
@@ -105,6 +105,6 @@
     "WEBRTC_SPEAKER_NOT_AVAILABLE": "Kõlarit pole saadaval",
     "LOGOUT": "Logi välja",
     "SESSION_TIMEOUT": "Seanss suletakse 60 sekundi pärast automaatselt",
-    "PHONE2CALL": "Telefon helistamiseks"
+    "HUNGARIAN": "ungari"
   }
 }
diff --git a/public/app/toolbar/i18n/fa.json b/public/app/toolbar/i18n/fa.json
index 569f559..1d0e188 100644
--- a/public/app/toolbar/i18n/fa.json
+++ b/public/app/toolbar/i18n/fa.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip} with با اعتبار خود وارد شوید.\nورود چندگانه مجاز نیست",
     "LOGOUT": "خروج",
     "SESSION_TIMEOUT": "جلسه پس از 60 ثانیه به طور خودکار بسته می شود",
-    "PHONE2CALL": "تلفن جهت تماس"
+    "HUNGARIAN": "مجارستانی"
   }
 }
diff --git a/public/app/toolbar/i18n/fi.json b/public/app/toolbar/i18n/fi.json
index 5115726..5273a46 100644
--- a/public/app/toolbar/i18n/fi.json
+++ b/public/app/toolbar/i18n/fi.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} on kirjautunut sisään käyttöoikeustietosi.\nUseita kirjautumisia ei sallita",
     "LOGOUT": "Kirjautua ulos",
     "SESSION_TIMEOUT": "Istunto suljetaan automaattisesti 60 sekunnin kuluttua",
-    "PHONE2CALL": "Puhelin soittaa"
+    "HUNGARIAN": "Unkarin kieli"
   }
 }
diff --git a/public/app/toolbar/i18n/fr.json b/public/app/toolbar/i18n/fr.json
index dd5d0a2..b16db07 100644
--- a/public/app/toolbar/i18n/fr.json
+++ b/public/app/toolbar/i18n/fr.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} s'est connecté avec vos identifiants.\nLes connexions multiples ne sont pas autorisées",
     "LOGOUT": "Se déconnecter",
     "SESSION_TIMEOUT": "La session sera automatiquement fermée après 60 secondes",
-    "PHONE2CALL": "Téléphone pour appeler"
+    "HUNGARIAN": "hongrois"
   }
 }
diff --git a/public/app/toolbar/i18n/he.json b/public/app/toolbar/i18n/he.json
index 02fc6b7..9ee1848 100644
--- a/public/app/toolbar/i18n/he.json
+++ b/public/app/toolbar/i18n/he.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} התחבר עם האישורים שלך.\nאין להכניס כניסות מרובות",
     "LOGOUT": "להתנתק",
     "SESSION_TIMEOUT": "ההפעלה תיסגר אוטומטית לאחר 60 שניות",
-    "PHONE2CALL": "טלפון להתקשרות"
+    "HUNGARIAN": "הוּנגָרִי"
   }
 }
diff --git a/public/app/toolbar/i18n/hi.json b/public/app/toolbar/i18n/hi.json
index 9d1ca92..dfb3d60 100644
--- a/public/app/toolbar/i18n/hi.json
+++ b/public/app/toolbar/i18n/hi.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} ने आपकी साख के साथ लॉग इन किया है।\nएकाधिक लॉगिन की अनुमति नहीं है",
     "LOGOUT": "लॉग आउट",
     "SESSION_TIMEOUT": "60 सेकंड के बाद सत्र स्वचालित रूप से बंद हो जाएगा",
-    "PHONE2CALL": "कॉल करने के लिए फोन"
+    "HUNGARIAN": "हंगेरी"
   }
 }
diff --git a/public/app/toolbar/i18n/hu.json b/public/app/toolbar/i18n/hu.json
new file mode 100644
index 0000000..cb6cc4a
--- /dev/null
+++ b/public/app/toolbar/i18n/hu.json
@@ -0,0 +1,113 @@
+{
+  "TOOLBAR": {
+    "CHANGE_LANGUAGE_TITLE": "Change language",
+    "CHANGE_LANGUAGE_MESSAGE": "Remember to refresh the page to apply RTL Support (if enabled)",
+    "HEBREW": "Hebrew",
+    "PREFIXES": "Prefixes",
+    "CALL": "Call",
+    "ARABIC": "Arabic",
+    "INDONESIAN": "Indonesian",
+    "RESETPASSWORD": "Reset Password",
+    "PASSWORD_EXPIRE_REMAINING_DAYS": "Remaining days before your password expires",
+    "BROWSER_COMPATIBILITY": "Browser Compatibility [Chrome, Opera, Safari]",
+    "RECORDING": "Recording",
+    "INVALID_LICENSE": "Invalid License",
+    "BROWSER": "Browser",
+    "OS": "Operating System",
+    "REQUIREMENTS": "Requirements",
+    "LICENSE": "License",
+    "HTTPS": "HTTPS",
+    "WEBRTCSUPPORT": "WebRTC Support",
+    "REGISTERED": "Registered",
+    "NOT_REGISTERED": "Not registered",
+    "WEBRTC_LICENSE_NOT_ENABELD": "WebRTC License is not enabled",
+    "ATTENDED_TRANSFER": "Attended Tranfer",
+    "TRANSFER": "Transfer",
+    "TARGET": "Target",
+    "CANCEL": "Cancel",
+    "FILENAME": "File name",
+    "STATUS": "Status",
+    "ACTIONS": "Actions",
+    "SPEAKER": "Speaker",
+    "RINGING": "Ringing tone",
+    "MICROPHONE": "Microphone",
+    "CONFERENCE": "Conference with 2 active sessions",
+    "PROFILE": "Profile",
+    "SERVICES": "Services",
+    "AUDIO": "Audio",
+    "FULLNAME": "Fullname",
+    "NAME": "Name",
+    "INTERNAL": "Internal",
+    "RINGINGDEVICE": "Ringing Device",
+    "SPEAKERDEVICE": "Speaker Device",
+    "MICROPHONEDEVICE": "Microphone Device",
+    "CHANGEPASSWORD": "Change password",
+    "SETTINGS": "Settings",
+    "AUTOANSWER": "Auto answer",
+    "TOGGLE_NAVIGATION": "Toggle navigation",
+    "TOGGLE_NAVIGATION_FOLD": "Toggle navigation fold",
+    "TOGGLE_NAVIGATION_MODE": "Toggle navigation mode",
+    "SEARCH": "Search",
+    "USER_SETTINGS": "User settings",
+    "TOGGLE_QUICK_PANEL": "Toggle quick panel",
+    "SOMEONE_LOGGED_YOU_OUT": "Someone logged out, do you want to stay logged?",
+    "STAY_LOGGED": "Stay logged",
+    "WARNING": "Warning",
+    "ENGLISH": "English",
+    "ITALIAN": "Italian",
+    "FRENCH": "French",
+    "KOREAN": "Korean",
+    "SPANISH": "Spanish",
+    "SWEDISH": "Swedish",
+    "RUSSIAN": "Russian",
+    "GERMAN": "German",
+    "JAPANESE": "Japanese",
+    "CHINESESIMPLIFIED": "Chinese Simplified",
+    "CHINESETRADITIONAL": "Chinese Traditional",
+    "DUTCH": "Dutch",
+    "FINNISH": "Finnish",
+    "DANISH": "Danish",
+    "PORTUGUESE": "Portuguese",
+    "NORWEGIAN": "Norwegian",
+    "HINDI": "Hindi",
+    "TURKISH": "Turkish",
+    "PERSIAN": "Persian",
+    "LATVIAN": "Latvian",
+    "POLISH": "Polish",
+    "LOGIN_TIME": "Login Time",
+    "PAUSE_TIME": "Pause Time",
+    "PREVIEW": "Preview",
+    "CONFIRM_PASSWORD": "Confirm Password",
+    "NEW_PASSWORD": "New Password",
+    "OLD_PASSWORD": "Old Password",
+    "SAVE": "Save",
+    "TRIAL_VERSION": "Trial Version",
+    "PAUSE": "Pause",
+    "RESUME": "End Pause",
+    "NO_PAUSES_AVAILABLE": "No pauses available",
+    "CZECH": "Czech",
+    "ERRORS": {
+      "FIELD_REQUIRED": "Mandatory Field",
+      "PASSWORD_REQUIRED": "Mandatory Field",
+      "CONFIRM_NOT_MATCH": "The passwords don't match",
+      "SECURE_PASSWORD_PATTERN": "The password must be at least 8 characters long and have 1 lowercase character, 1 uppercase character, 1 number and 1 special character ~!?*@#$%^&-_=+[{]}.",
+      "PASSWORD_OLDPASSWORD_MATCH": "New password must be different from previous one"
+    },
+    "BRAZILIAN": "Brazilian",
+    "ESTONIAN": "Estonian",
+    "WEBRTC_MICROPHONE_NOT_AVAILABLE": "No microphone available",
+    "WEBRTC_SPEAKER_NOT_AVAILABLE": "No speaker available",
+    "WEBRTC_AUDIO_DEVICES_NOT_AVAILABLE": "No audio devices available",
+    "NO_AVAILABLE_INFO": "No available info",
+    "LITHUANIAN": "Lithuanian",
+    "NOTIFICATION_TITLE": "New notification from {{sender}}",
+    "NOTIFICATION_TITLE_RECIPIENT": "to {{recipient}}",
+    "USER_FORCE_LOGOUT": "{{ip}} has logged in with your credentials. \nMultiple logins are not allowed",
+    "LOGOUT": "Logout",
+    "SESSION_TIMEOUT": "The session will be automatically closed after 60 seconds",
+    "HELP": {
+      "PREVIEW_RECALLME": "This is a Recall Me call scheduled for {{date}}"
+    },
+    "HUNGARIAN": "Magyar"
+  }
+}
diff --git a/public/app/toolbar/i18n/id.json b/public/app/toolbar/i18n/id.json
index a096fad..7b7dbfe 100644
--- a/public/app/toolbar/i18n/id.json
+++ b/public/app/toolbar/i18n/id.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} telah masuk dengan kredensial Anda.\nBanyak login tidak diperbolehkan",
     "LOGOUT": "Keluar",
     "SESSION_TIMEOUT": "Sesi akan ditutup secara otomatis setelah 60 detik",
-    "PHONE2CALL": "Telepon untuk dihubungi"
+    "HUNGARIAN": "Hongaria"
   }
 }
diff --git a/public/app/toolbar/i18n/it.json b/public/app/toolbar/i18n/it.json
index 869bc47..b64b351 100644
--- a/public/app/toolbar/i18n/it.json
+++ b/public/app/toolbar/i18n/it.json
@@ -61,6 +61,7 @@
     "PORTUGUESE": "Portoghese",
     "NORWEGIAN": "Norwegian",
     "HINDI": "Hindi",
+    "HUNGARIAN": "Ungherese",
     "TURKISH": "Turco",
     "PERSIAN": "Persiano",
     "LATVIAN": "Lettone",
@@ -105,6 +106,8 @@
     "USER_FORCE_LOGOUT": "{{ip}} si è connesso con le tue credenziali. \nNon sono consentite connessioni multiple",
     "LOGOUT": "Disconnettersi",
     "SESSION_TIMEOUT": "La sessione verrà chiusa automaticamente dopo 60 secondi",
-    "PHONE2CALL": "Telefono per chiamare"
+    "HELP": {
+      "PREVIEW_RECALLME": "Questa è una chiamata Recall Me programmata per il {{date}}"
+    }
   }
 }
diff --git a/public/app/toolbar/i18n/ja.json b/public/app/toolbar/i18n/ja.json
index 1a89cfe..6af0cf2 100644
--- a/public/app/toolbar/i18n/ja.json
+++ b/public/app/toolbar/i18n/ja.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}}はあなたの認証情報でログインしています。\n複数のログインは許可されていません",
     "LOGOUT": "ログアウト",
     "SESSION_TIMEOUT": "セッションは60秒後に自動的に閉じられます",
-    "PHONE2CALL": "電話する"
+    "HUNGARIAN": "ハンガリー語"
   }
 }
diff --git a/public/app/toolbar/i18n/ko.json b/public/app/toolbar/i18n/ko.json
index e868aeb..98eef79 100644
--- a/public/app/toolbar/i18n/ko.json
+++ b/public/app/toolbar/i18n/ko.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}}이 (가) 귀하의 자격 증명으로 로그인했습니다.\n다중 로그인은 허용되지 않습니다.",
     "LOGOUT": "로그 아웃",
     "SESSION_TIMEOUT": "세션은 60 초 후에 자동으로 닫힙니다.",
-    "PHONE2CALL": "전화 걸기"
+    "HUNGARIAN": "헝가리 인"
   }
 }
diff --git a/public/app/toolbar/i18n/lt.json b/public/app/toolbar/i18n/lt.json
index 92e62b1..35d16c6 100644
--- a/public/app/toolbar/i18n/lt.json
+++ b/public/app/toolbar/i18n/lt.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} prisijungė naudodamas savo įgaliojimus. Keli prisijungimai neleidžiami",
     "LOGOUT": "Atsijungti",
     "SESSION_TIMEOUT": "Po 60 sekundžių sesija bus automatiškai uždaryta",
-    "PHONE2CALL": "Telefonas skambinti"
+    "HUNGARIAN": "vengrų"
   }
 }
diff --git a/public/app/toolbar/i18n/lv.json b/public/app/toolbar/i18n/lv.json
index 5c63665..575c558 100644
--- a/public/app/toolbar/i18n/lv.json
+++ b/public/app/toolbar/i18n/lv.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} ir pieteicies ar jūsu akreditācijas datiem.\nVairāki pieteikumi nav atļauti",
     "LOGOUT": "Izlogoties",
     "SESSION_TIMEOUT": "Sesija tiks automātiski slēgta pēc 60 sekundēm",
-    "PHONE2CALL": "Tālrunis, lai zvanītu"
+    "HUNGARIAN": "ungāru"
   }
 }
diff --git a/public/app/toolbar/i18n/nl.json b/public/app/toolbar/i18n/nl.json
index 4601d6b..f14bae2 100644
--- a/public/app/toolbar/i18n/nl.json
+++ b/public/app/toolbar/i18n/nl.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} is ingelogd met uw inloggegevens.\nMeerdere aanmeldingen zijn niet toegestaan",
     "LOGOUT": "Uitloggen",
     "SESSION_TIMEOUT": "De sessie wordt automatisch na 60 seconden afgesloten",
-    "PHONE2CALL": "Telefoon om te bellen"
+    "HUNGARIAN": "Hongaars"
   }
 }
diff --git a/public/app/toolbar/i18n/no.json b/public/app/toolbar/i18n/no.json
index ab1fdfb..4e25e26 100644
--- a/public/app/toolbar/i18n/no.json
+++ b/public/app/toolbar/i18n/no.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} har logget på med legitimasjonsbeskrivelsen.\nFlere pålogginger er ikke tillatt",
     "LOGOUT": "Logg ut",
     "SESSION_TIMEOUT": "Økten lukkes automatisk etter 60 sekunder",
-    "PHONE2CALL": "Telefon for å ringe"
+    "HUNGARIAN": "ungarsk"
   }
 }
diff --git a/public/app/toolbar/i18n/pl.json b/public/app/toolbar/i18n/pl.json
index 25e81fd..3cec861 100644
--- a/public/app/toolbar/i18n/pl.json
+++ b/public/app/toolbar/i18n/pl.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} zalogował się przy użyciu Twoich danych logowania.\nWielokrotne logowanie jest niedozwolone",
     "LOGOUT": "Wyloguj",
     "SESSION_TIMEOUT": "Sesja zostanie automatycznie zamknięta po 60 sekundach",
-    "PHONE2CALL": "Telefon, aby zadzwonić"
+    "HUNGARIAN": "język węgierski"
   }
 }
diff --git a/public/app/toolbar/i18n/pt-BR.json b/public/app/toolbar/i18n/pt-BR.json
index 419cb06..f2548f0 100644
--- a/public/app/toolbar/i18n/pt-BR.json
+++ b/public/app/toolbar/i18n/pt-BR.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} fez login com suas credenciais.\nVários logins não são permitidos",
     "LOGOUT": "Sair",
     "SESSION_TIMEOUT": "A sessão será fechada automaticamente após 60 segundos",
-    "PHONE2CALL": "Telefone para ligar"
+    "HUNGARIAN": "húngaro"
   }
 }
diff --git a/public/app/toolbar/i18n/pt-PT.json b/public/app/toolbar/i18n/pt-PT.json
index 0d1d4dd..9ae53f1 100644
--- a/public/app/toolbar/i18n/pt-PT.json
+++ b/public/app/toolbar/i18n/pt-PT.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} fez login com suas credenciais.\nVários logins não são permitidos",
     "LOGOUT": "Sair",
     "SESSION_TIMEOUT": "A sessão será fechada automaticamente após 60 segundos",
-    "PHONE2CALL": "Telefone para ligar"
+    "HUNGARIAN": "húngaro"
   }
 }
diff --git a/public/app/toolbar/i18n/ru.json b/public/app/toolbar/i18n/ru.json
index a7da067..b720718 100644
--- a/public/app/toolbar/i18n/ru.json
+++ b/public/app/toolbar/i18n/ru.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} вошел в систему с вашими учетными данными.\nМножественные входы не разрешены",
     "LOGOUT": "Выйти",
     "SESSION_TIMEOUT": "Сессия будет автоматически закрыта через 60 секунд.",
-    "PHONE2CALL": "Телефон для звонка"
+    "HUNGARIAN": "венгерский язык"
   }
 }
diff --git a/public/app/toolbar/i18n/sv.json b/public/app/toolbar/i18n/sv.json
index 3d237c5..67189c4 100644
--- a/public/app/toolbar/i18n/sv.json
+++ b/public/app/toolbar/i18n/sv.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} har loggat in med dina referenser.\nFlera inloggningar är inte tillåtna",
     "LOGOUT": "Logga ut",
     "SESSION_TIMEOUT": "Sessionen stängs automatiskt efter 60 sekunder",
-    "PHONE2CALL": "Telefon för att ringa"
+    "HUNGARIAN": "ungerska"
   }
 }
diff --git a/public/app/toolbar/i18n/tr.json b/public/app/toolbar/i18n/tr.json
index 0ed972d..677e733 100644
--- a/public/app/toolbar/i18n/tr.json
+++ b/public/app/toolbar/i18n/tr.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}} kimlik bilgilerinizle giriş yaptı.\nBirden çok girişe izin verilmez",
     "LOGOUT": "Çıkış Yap",
     "SESSION_TIMEOUT": "60 saniye sonra oturum otomatik olarak kapatılacaktır",
-    "PHONE2CALL": "Aranacak telefon"
+    "HUNGARIAN": "Macarca"
   }
 }
diff --git a/public/app/toolbar/i18n/zh-CN.json b/public/app/toolbar/i18n/zh-CN.json
index c60f14a..ae3295a 100644
--- a/public/app/toolbar/i18n/zh-CN.json
+++ b/public/app/toolbar/i18n/zh-CN.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}}已使用您的凭据登录。\n不允许多次登录",
     "LOGOUT": "登出",
     "SESSION_TIMEOUT": "该会话将在60秒后自动关闭",
-    "PHONE2CALL": "拨打电话"
+    "HUNGARIAN": "匈牙利"
   }
 }
diff --git a/public/app/toolbar/i18n/zh-TW.json b/public/app/toolbar/i18n/zh-TW.json
index 4085ea6..5cb816b 100644
--- a/public/app/toolbar/i18n/zh-TW.json
+++ b/public/app/toolbar/i18n/zh-TW.json
@@ -105,6 +105,6 @@
     "USER_FORCE_LOGOUT": "{{ip}}已使用您的憑據登錄。\n不允許多次登錄",
     "LOGOUT": "登出",
     "SESSION_TIMEOUT": "該會話將在60秒後自動關閉",
-    "PHONE2CALL": "撥打電話"
+    "HUNGARIAN": "匈牙利"
   }
 }
diff --git a/public/assets/images/flags/hu.png b/public/assets/images/flags/hu.png
new file mode 100644
index 0000000..ff1aa24
Binary files /dev/null and b/public/assets/images/flags/hu.png differ
diff --git a/public/assets/plugins/angular-material-form-builder/CHANGELOG.md b/public/assets/plugins/angular-material-form-builder/CHANGELOG.md
deleted file mode 100644
index 68be0ab..0000000
--- a/public/assets/plugins/angular-material-form-builder/CHANGELOG.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# 1.1.0
-
-Add support for the `upload` component that allows to upload files
-
-# 1.0.0
-
-### ⚠️ Breaking changes
-
-No breaking changes in the API, but compatibility with AngularJS versions older than 1.8 has not been tested.
-
-### ✨ Features and improvements
-
-- Support for AngularJS 1.8.x
-- +2 new items:
-  - label: a simple label in your form
-  - agreement: a statement with a checkbox
-- Full code refactoring using ES6+
-- Use Webpack as build system
-- Use Jest for tests
-
-### 🐞 Bug fixes
-
-- Minor bugfixes
-
-# 0.1.4 (bower)
-
-Support for AngularJS 1.6.9
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css
index 5da6bb0..635ebcf 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css
@@ -1,4 +1,10 @@
+/*!*********************************************************************************************************************************************************************!*\
+  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./src/lib/index.scss ***!
+  \*********************************************************************************************************************************************************************/
 @import url(https://fonts.googleapis.com/icon?family=Material+Icons);
+/*!*************************************************************************************************************************************************************************!*\
+  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./src/lib/index.scss (1) ***!
+  \*************************************************************************************************************************************************************************/
 .main-view .content .builder,
 .main-view .content .view,
 .main-view .content .json {
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css.map b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css.map
index 9d0e007..f9f7e23 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css.map
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.css.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://angular-material-form-builder/./src/lib/index.scss"],"names":[],"mappings":";AAMI;;;EAGE;EACA;EACA;AAJN;;AASA;EACE,gBAfW;EAgBX,eAhBW;EAiBX,YAjBW;EAkBX,WAlBW;EAmBX;AANF;;AAUE;EACE;AAPJ;AASI;EAEE;EACA;AARN;AAUM;EAEE;AATR;AAcE;EACE;EACA;AAZJ;AAcI;EACE;EACA;EACA;AAZN;AAsBE;EACE;AApBJ;AAuBE;EACE;AArBJ;AAwBE;EACE;EACA;AAtBJ;AAyBE;EACE;AAvBJ;AA0BM;EACE;AAxBR;AA2BM;EACE;EACA;AAzBR;AA6BQ;EACE;EACA;AA3BV;AA+BM;;EAEE;AA7BR;;AAmCA;EACE;EACA;EACA;EACA;AAhCF;AAkCE;EACE;AAhCJ;;AAoCA;EACE;EACA;AAjCF;AAkCE;EACE;AAhCJ,C","file":"angular-material-form-builder.css","sourcesContent":["@import url(https://fonts.googleapis.com/icon?family=Material+Icons);\n\n$button-dim: 36px;\n\n.main-view {\n  .content {\n    .builder,\n    .view,\n    .json {\n      border-right: 1px solid #cccccc;\n      height: 800px;\n      overflow: auto;\n    }\n  }\n}\n\n.builder-icon {\n  min-height: $button-dim;\n  min-width: $button-dim;\n  height: $button-dim;\n  width: $button-dim;\n  line-height: 0;\n}\n\nform-item {\n  .option-item {\n    min-height: 75px;\n\n    .md-button {\n      @extend .builder-icon;\n      line-height: 0;\n      margin-top: 20px;\n\n      &.handle:active,\n      &.handle:hover {\n        cursor: move;\n      }\n    }\n  }\n\n  .form-item-container {\n    position: relative;\n    padding-top: 30px;\n\n    .form-item-actions {\n      position: absolute;\n      right: 20px;\n      top: 0;\n    }\n\n    .md-button {\n      @extend .builder-icon;\n    }\n  }\n}\n\nform-view {\n  .formItem-title {\n    font-size: 18px;\n  }\n\n  .formItem-content {\n    font-size: 18px;\n  }\n\n  .formItem-help-text {\n    font-size: 14px;\n    color: #6c6c6c;\n  }\n\n  .matrix-container {\n    overflow: auto;\n\n    .matrix {\n      .matrix-row {\n        border-bottom: 1px solid #4caf50;\n      }\n\n      .matrix-cell {\n        text-align: center;\n        overflow: hidden;\n      }\n\n      md-radio-button {\n        .md-label {\n          margin-left: 0;\n          margin-right: 0;\n        }\n      }\n\n      md-radio-button,\n      .md-switch-thumb {\n        margin: 15px 0;\n      }\n    }\n  }\n}\n\ni.material-icons {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n\n  &.medium {\n    font-size: 36px;\n  }\n}\n\n.md-button.upload-button {\n  padding: 0 16px;\n  height: 36px;\n  md-icon {\n    font-size: 16px;\n  }\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"angular-material-form-builder.css","mappings":";;;;;;;AAMI;;;EAGE;EACA;EACA;AAJN;;AASA;EACE,gBAfW;EAgBX,eAhBW;EAiBX,YAjBW;EAkBX,WAlBW;EAmBX;AANF;;AAUE;EACE;AAPJ;AASI;EAEE;EACA;AARN;AAUM;EAEE;AATR;AAcE;EACE;EACA;AAZJ;AAcI;EACE;EACA;EACA;AAZN;AAsBE;EACE;AApBJ;AAuBE;EACE;AArBJ;AAwBE;EACE;EACA;AAtBJ;AAyBE;EACE;AAvBJ;AA0BM;EACE;AAxBR;AA2BM;EACE;EACA;AAzBR;AA6BQ;EACE;EACA;AA3BV;AA+BM;;EAEE;AA7BR;;AAmCA;EACE;EACA;EACA;EACA;AAhCF;AAkCE;EACE;AAhCJ;;AAoCA;EACE;EACA;AAjCF;AAkCE;EACE;AAhCJ,C","sources":["webpack://angular-material-form-builder/./src/lib/index.scss"],"sourcesContent":["@import url(https://fonts.googleapis.com/icon?family=Material+Icons);\n\n$button-dim: 36px;\n\n.main-view {\n  .content {\n    .builder,\n    .view,\n    .json {\n      border-right: 1px solid #cccccc;\n      height: 800px;\n      overflow: auto;\n    }\n  }\n}\n\n.builder-icon {\n  min-height: $button-dim;\n  min-width: $button-dim;\n  height: $button-dim;\n  width: $button-dim;\n  line-height: 0;\n}\n\nform-item {\n  .option-item {\n    min-height: 75px;\n\n    .md-button {\n      @extend .builder-icon;\n      line-height: 0;\n      margin-top: 20px;\n\n      &.handle:active,\n      &.handle:hover {\n        cursor: move;\n      }\n    }\n  }\n\n  .form-item-container {\n    position: relative;\n    padding-top: 30px;\n\n    .form-item-actions {\n      position: absolute;\n      right: 20px;\n      top: 0;\n    }\n\n    .md-button {\n      @extend .builder-icon;\n    }\n  }\n}\n\nform-view {\n  .formItem-title {\n    font-size: 18px;\n  }\n\n  .formItem-content {\n    font-size: 18px;\n  }\n\n  .formItem-help-text {\n    font-size: 14px;\n    color: #6c6c6c;\n  }\n\n  .matrix-container {\n    overflow: auto;\n\n    .matrix {\n      .matrix-row {\n        border-bottom: 1px solid #4caf50;\n      }\n\n      .matrix-cell {\n        text-align: center;\n        overflow: hidden;\n      }\n\n      md-radio-button {\n        .md-label {\n          margin-left: 0;\n          margin-right: 0;\n        }\n      }\n\n      md-radio-button,\n      .md-switch-thumb {\n        margin: 15px 0;\n      }\n    }\n  }\n}\n\ni.material-icons {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n\n  &.medium {\n    font-size: 36px;\n  }\n}\n\n.md-button.upload-button {\n  padding: 0 16px;\n  height: 36px;\n  md-icon {\n    font-size: 16px;\n  }\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js
index 5c81fc0..0242e53 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js
@@ -20,7 +20,7 @@ return /******/ (() => { // webpackBootstrap
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "AgreementItemCtrl": () => /* binding */ AgreementItemCtrl
+/* harmony export */   "AgreementItemCtrl": () => (/* binding */ AgreementItemCtrl)
 /* harmony export */ });
 AgreementItemCtrl.$inject = ["Utils", "$element"];
 
@@ -55,7 +55,7 @@ function AgreementItemCtrl(Utils, $element) {
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "AgreementItem": () => /* binding */ AgreementItem
+/* harmony export */   "AgreementItem": () => (/* binding */ AgreementItem)
 /* harmony export */ });
 /* harmony import */ var _agreement_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./agreement-item.controller */ "./src/lib/directives/agreement-item/agreement-item.controller.js");
  // import AgreementItemTemplate from './agreement-item.tpl.html'
@@ -93,7 +93,7 @@ AgreementItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "AgreementViewCtrl": () => /* binding */ AgreementViewCtrl
+/* harmony export */   "AgreementViewCtrl": () => (/* binding */ AgreementViewCtrl)
 /* harmony export */ });
 class AgreementViewCtrl {
   /**
@@ -187,7 +187,7 @@ AgreementViewCtrl.$inject = ["$scope", "Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "AgreementView": () => /* binding */ AgreementView
+/* harmony export */   "AgreementView": () => (/* binding */ AgreementView)
 /* harmony export */ });
 /* harmony import */ var _agreement_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./agreement-view.controller */ "./src/lib/directives/agreement-item/agreement-view.controller.js");
 /* harmony import */ var _agreement_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./agreement-view.tpl.html */ "./src/lib/directives/agreement-item/agreement-view.tpl.html");
@@ -201,7 +201,7 @@ class AgreementView {
    */
   constructor($timeout) {
     this.$timeout = $timeout;
-    this.template = _agreement_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _agreement_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.restrict = 'E';
     this.scope = {
       formItem: '=',
@@ -244,7 +244,7 @@ AgreementView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "CheckboxesItemCtrl": () => /* binding */ CheckboxesItemCtrl
+/* harmony export */   "CheckboxesItemCtrl": () => (/* binding */ CheckboxesItemCtrl)
 /* harmony export */ });
 class CheckboxesItemCtrl {
   /**
@@ -298,7 +298,7 @@ CheckboxesItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "CheckboxesItem": () => /* binding */ CheckboxesItem
+/* harmony export */   "CheckboxesItem": () => (/* binding */ CheckboxesItem)
 /* harmony export */ });
 /* harmony import */ var _checkboxes_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./checkboxes-item.tpl.html */ "./src/lib/directives/checkboxes-item/checkboxes-item.tpl.html");
 /* harmony import */ var _checkboxes_item_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./checkboxes-item.controller */ "./src/lib/directives/checkboxes-item/checkboxes-item.controller.js");
@@ -311,7 +311,7 @@ __webpack_require__.r(__webpack_exports__);
 function CheckboxesItem() {
   const directive = {
     restrict: 'E',
-    template: _checkboxes_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default,
+    template: _checkboxes_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"],
     scope: {
       item: '='
     },
@@ -334,7 +334,7 @@ function CheckboxesItem() {
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "CheckboxesViewCtrl": () => /* binding */ CheckboxesViewCtrl
+/* harmony export */   "CheckboxesViewCtrl": () => (/* binding */ CheckboxesViewCtrl)
 /* harmony export */ });
 class CheckboxesViewCtrl {
   /**
@@ -425,7 +425,7 @@ CheckboxesViewCtrl.$inject = ["$scope", "Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "CheckboxesView": () => /* binding */ CheckboxesView
+/* harmony export */   "CheckboxesView": () => (/* binding */ CheckboxesView)
 /* harmony export */ });
 /* harmony import */ var _checkboxes_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./checkboxes-view.tpl.html */ "./src/lib/directives/checkboxes-item/checkboxes-view.tpl.html");
 /* harmony import */ var _checkboxes_view_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./checkboxes-view.controller */ "./src/lib/directives/checkboxes-item/checkboxes-view.controller.js");
@@ -443,7 +443,7 @@ class CheckboxesView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _checkboxes_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _checkboxes_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
     this.scope = {
       formItem: '=',
       isPreview: '&',
@@ -485,7 +485,7 @@ CheckboxesView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormItemCtrl": () => /* binding */ FormItemCtrl
+/* harmony export */   "FormItemCtrl": () => (/* binding */ FormItemCtrl)
 /* harmony export */ });
 const DEFAULT_TITLE = {
   upload: 'Attachment',
@@ -570,7 +570,7 @@ FormItemCtrl.$inject = ["$scope", "$attrs", "Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormItem": () => /* binding */ FormItem
+/* harmony export */   "FormItem": () => (/* binding */ FormItem)
 /* harmony export */ });
 /* harmony import */ var _form_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form-item.tpl.html */ "./src/lib/directives/form-item/form-item.tpl.html");
 /* harmony import */ var _form_item_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form-item.controller */ "./src/lib/directives/form-item/form-item.controller.js");
@@ -598,7 +598,7 @@ class FormItem {
     this.controller = _form_item_controller__WEBPACK_IMPORTED_MODULE_1__.FormItemCtrl;
     this.controllerAs = 'FormItem';
     this.bindToController = true;
-    this.template = _form_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _form_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
   }
   /**
    * @see https://docs.angularjs.org/api/ng/service/$compile#-link-
@@ -636,7 +636,7 @@ FormItem.$inject = ["$compile"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormItemsContainerCtrl": () => /* binding */ FormItemsContainerCtrl
+/* harmony export */   "FormItemsContainerCtrl": () => (/* binding */ FormItemsContainerCtrl)
 /* harmony export */ });
 class FormItemsContainerCtrl {
   /**
@@ -704,7 +704,7 @@ FormItemsContainerCtrl.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormItemsContainer": () => /* binding */ FormItemsContainer
+/* harmony export */   "FormItemsContainer": () => (/* binding */ FormItemsContainer)
 /* harmony export */ });
 /* harmony import */ var _form_items_container_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form-items-container.controller */ "./src/lib/directives/form-items-container/form-items-container.controller.js");
 /* harmony import */ var _form_items_container_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form-items-container.tpl.html */ "./src/lib/directives/form-items-container/form-items-container.tpl.html");
@@ -723,7 +723,7 @@ class FormItemsContainer {
     this.scope = {
       form: '='
     };
-    this.template = _form_items_container_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _form_items_container_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.controller = _form_items_container_controller__WEBPACK_IMPORTED_MODULE_0__.FormItemsContainerCtrl;
     this.controllerAs = 'container';
     this.bindToController = true;
@@ -744,7 +744,7 @@ FormItemsContainer.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormViewCtrl": () => /* binding */ FormViewCtrl
+/* harmony export */   "FormViewCtrl": () => (/* binding */ FormViewCtrl)
 /* harmony export */ });
 class FormViewCtrl {
   /**
@@ -772,7 +772,7 @@ FormViewCtrl.$inject = ["$scope"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "FormView": () => /* binding */ FormView
+/* harmony export */   "FormView": () => (/* binding */ FormView)
 /* harmony export */ });
 /* harmony import */ var _form_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form-view.controller */ "./src/lib/directives/form-view/form-view.controller.js");
 /* harmony import */ var _form_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form-view.tpl.html */ "./src/lib/directives/form-view/form-view.tpl.html");
@@ -788,7 +788,7 @@ class FormView {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _form_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _form_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       form: '='
     };
@@ -825,7 +825,7 @@ FormView.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "InputItemCtrl": () => /* binding */ InputItemCtrl
+/* harmony export */   "InputItemCtrl": () => (/* binding */ InputItemCtrl)
 /* harmony export */ });
 class InputItemCtrl {
   /**
@@ -857,7 +857,7 @@ InputItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "InputItem": () => /* binding */ InputItem
+/* harmony export */   "InputItem": () => (/* binding */ InputItem)
 /* harmony export */ });
 /* harmony import */ var _input_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./input-item.controller */ "./src/lib/directives/input-item/input-item.controller.js");
 /* harmony import */ var _input_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./input-item.tpl.html */ "./src/lib/directives/input-item/input-item.tpl.html");
@@ -873,7 +873,7 @@ class InputItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _input_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _input_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       item: '='
     };
@@ -897,7 +897,7 @@ InputItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "InputViewCtrl": () => /* binding */ InputViewCtrl
+/* harmony export */   "InputViewCtrl": () => (/* binding */ InputViewCtrl)
 /* harmony export */ });
 class InputViewCtrl {
   /**
@@ -930,7 +930,7 @@ InputViewCtrl.$inject = ["Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "InputView": () => /* binding */ InputView
+/* harmony export */   "InputView": () => (/* binding */ InputView)
 /* harmony export */ });
 /* harmony import */ var _input_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./input-view.controller */ "./src/lib/directives/input-item/input-view.controller.js");
 /* harmony import */ var _input_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./input-view.tpl.html */ "./src/lib/directives/input-item/input-view.tpl.html");
@@ -948,7 +948,7 @@ class InputView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _input_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _input_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       formItem: '=',
       form: '='
@@ -989,7 +989,7 @@ InputView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "LabelItemCtrl": () => /* binding */ LabelItemCtrl
+/* harmony export */   "LabelItemCtrl": () => (/* binding */ LabelItemCtrl)
 /* harmony export */ });
 class LabelItemCtrl {
   /**
@@ -1015,7 +1015,7 @@ LabelItemCtrl.$inject = ["$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "LabelItem": () => /* binding */ LabelItem
+/* harmony export */   "LabelItem": () => (/* binding */ LabelItem)
 /* harmony export */ });
 /* harmony import */ var _label_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./label-item.controller */ "./src/lib/directives/label-item/label-item.controller.js");
 /* harmony import */ var _label_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./label-item.tpl.html */ "./src/lib/directives/label-item/label-item.tpl.html");
@@ -1028,7 +1028,7 @@ __webpack_require__.r(__webpack_exports__);
 class LabelItem {
   constructor() {
     this.restrict = 'E';
-    this.template = _label_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _label_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       item: '='
     };
@@ -1051,24 +1051,30 @@ class LabelItem {
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "LabelViewCtrl": () => /* binding */ LabelViewCtrl
+/* harmony export */   "LabelViewCtrl": () => (/* binding */ LabelViewCtrl)
 /* harmony export */ });
 class LabelViewCtrl {
   /**
    * @ngInject
    * @param {import('../../utils/utils.service').Utils} Utils
+   * @param {ng.ISCEService} $sce
    */
-  constructor(Utils) {
+  constructor(Utils, $sce) {
     this.Utils = Utils;
+    this.$sce = $sce;
   }
 
   init() {
     this.Utils.extend(this.formItem, {});
   }
 
+  get sanitizedTitle() {
+    return this.$sce.trustAsHtml(this.formItem.value);
+  }
+
 }
 
-LabelViewCtrl.$inject = ["Utils"];
+LabelViewCtrl.$inject = ["Utils", "$sce"];

 /***/ }),
@@ -1081,7 +1087,7 @@ LabelViewCtrl.$inject = ["Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "LabelView": () => /* binding */ LabelView
+/* harmony export */   "LabelView": () => (/* binding */ LabelView)
 /* harmony export */ });
 /* harmony import */ var _label_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./label-view.controller */ "./src/lib/directives/label-item/label-view.controller.js");
 /* harmony import */ var _label_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./label-view.tpl.html */ "./src/lib/directives/label-item/label-view.tpl.html");
@@ -1099,7 +1105,7 @@ class LabelView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _label_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _label_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       formItem: '=',
       form: '='
@@ -1140,7 +1146,7 @@ LabelView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "MatrixItemCtrl": () => /* binding */ MatrixItemCtrl
+/* harmony export */   "MatrixItemCtrl": () => (/* binding */ MatrixItemCtrl)
 /* harmony export */ });
 class MatrixItemCtrl {
   /**
@@ -1218,7 +1224,7 @@ MatrixItemCtrl.$inject = ["Utils", "$document"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "MatrixItem": () => /* binding */ MatrixItem
+/* harmony export */   "MatrixItem": () => (/* binding */ MatrixItem)
 /* harmony export */ });
 /* harmony import */ var _matrix_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./matrix-item.controller */ "./src/lib/directives/matrix-item/matrix-item.controller.js");
 /* harmony import */ var _matrix_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matrix-item.tpl.html */ "./src/lib/directives/matrix-item/matrix-item.tpl.html");
@@ -1234,7 +1240,7 @@ class MatrixItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _matrix_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _matrix_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       item: '='
     };
@@ -1258,7 +1264,7 @@ MatrixItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "MatrixViewCtrl": () => /* binding */ MatrixViewCtrl
+/* harmony export */   "MatrixViewCtrl": () => (/* binding */ MatrixViewCtrl)
 /* harmony export */ });
 class MatrixViewCtrl {
   /**
@@ -1327,7 +1333,7 @@ MatrixViewCtrl.$inject = ["$scope", "Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "MatrixView": () => /* binding */ MatrixView
+/* harmony export */   "MatrixView": () => (/* binding */ MatrixView)
 /* harmony export */ });
 /* harmony import */ var _matrix_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./matrix-view.tpl.html */ "./src/lib/directives/matrix-item/matrix-view.tpl.html");
 /* harmony import */ var _matrix_view_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matrix-view.controller */ "./src/lib/directives/matrix-item/matrix-view.controller.js");
@@ -1345,7 +1351,7 @@ class MatrixView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _matrix_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _matrix_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
     this.scope = {
       formItem: '=',
       isPreview: '&',
@@ -1387,7 +1393,7 @@ MatrixView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "RadioButtonItemCtrl": () => /* binding */ RadioButtonItemCtrl
+/* harmony export */   "RadioButtonItemCtrl": () => (/* binding */ RadioButtonItemCtrl)
 /* harmony export */ });
 class RadioButtonItemCtrl {
   /**
@@ -1435,7 +1441,7 @@ RadioButtonItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "RadioButtonItem": () => /* binding */ RadioButtonItem
+/* harmony export */   "RadioButtonItem": () => (/* binding */ RadioButtonItem)
 /* harmony export */ });
 /* harmony import */ var _radio_button_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./radio-button-item.controller */ "./src/lib/directives/radio-button-item/radio-button-item.controller.js");
 /* harmony import */ var _radio_button_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./radio-button-item.tpl.html */ "./src/lib/directives/radio-button-item/radio-button-item.tpl.html");
@@ -1451,7 +1457,7 @@ class RadioButtonItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _radio_button_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _radio_button_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       item: '='
     };
@@ -1475,7 +1481,7 @@ RadioButtonItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "RadioButtonViewCtrl": () => /* binding */ RadioButtonViewCtrl
+/* harmony export */   "RadioButtonViewCtrl": () => (/* binding */ RadioButtonViewCtrl)
 /* harmony export */ });
 class RadioButtonViewCtrl {
   /**
@@ -1509,7 +1515,7 @@ RadioButtonViewCtrl.$inject = ["Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "RadioButtonView": () => /* binding */ RadioButtonView
+/* harmony export */   "RadioButtonView": () => (/* binding */ RadioButtonView)
 /* harmony export */ });
 /* harmony import */ var _radio_button_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./radio-button-view.controller */ "./src/lib/directives/radio-button-item/radio-button-view.controller.js");
 /* harmony import */ var _radio_button_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./radio-button-view.tpl.html */ "./src/lib/directives/radio-button-item/radio-button-view.tpl.html");
@@ -1524,7 +1530,7 @@ class RadioButtonView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _radio_button_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _radio_button_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       formItem: '=',
       isPreview: '&',
@@ -1566,7 +1572,7 @@ RadioButtonView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "SelectItemCtrl": () => /* binding */ SelectItemCtrl
+/* harmony export */   "SelectItemCtrl": () => (/* binding */ SelectItemCtrl)
 /* harmony export */ });
 class SelectItemCtrl {
   /**
@@ -1619,7 +1625,7 @@ SelectItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "SelectItem": () => /* binding */ SelectItem
+/* harmony export */   "SelectItem": () => (/* binding */ SelectItem)
 /* harmony export */ });
 /* harmony import */ var _select_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./select-item.tpl.html */ "./src/lib/directives/select-item/select-item.tpl.html");
 /* harmony import */ var _select_item_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./select-item.controller */ "./src/lib/directives/select-item/select-item.controller.js");
@@ -1635,7 +1641,7 @@ class SelectItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _select_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _select_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
     this.scope = {
       item: '='
     };
@@ -1659,7 +1665,7 @@ SelectItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "SelectViewCtrl": () => /* binding */ SelectViewCtrl
+/* harmony export */   "SelectViewCtrl": () => (/* binding */ SelectViewCtrl)
 /* harmony export */ });
 class SelectViewCtrl {
   /**
@@ -1693,7 +1699,7 @@ SelectViewCtrl.$inject = ["Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "SelectView": () => /* binding */ SelectView
+/* harmony export */   "SelectView": () => (/* binding */ SelectView)
 /* harmony export */ });
 /* harmony import */ var _select_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./select-view.tpl.html */ "./src/lib/directives/select-item/select-view.tpl.html");
 /* harmony import */ var _select_view_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./select-view.controller */ "./src/lib/directives/select-item/select-view.controller.js");
@@ -1711,7 +1717,7 @@ class SelectView {
   constructor($timeout) {
     this.$timeout = $timeout;
     this.restrict = 'E';
-    this.template = _select_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _select_view_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
     this.scope = {
       formItem: '=',
       isPreview: '&',
@@ -1753,7 +1759,7 @@ SelectView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "TextareaItemCtrl": () => /* binding */ TextareaItemCtrl
+/* harmony export */   "TextareaItemCtrl": () => (/* binding */ TextareaItemCtrl)
 /* harmony export */ });
 class TextareaItemCtrl {
   /**
@@ -1783,7 +1789,7 @@ TextareaItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "TextareaItem": () => /* binding */ TextareaItem
+/* harmony export */   "TextareaItem": () => (/* binding */ TextareaItem)
 /* harmony export */ });
 /* harmony import */ var _textarea_item_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./textarea-item.controller */ "./src/lib/directives/textarea-item/textarea-item.controller.js");
 /* harmony import */ var _textarea_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./textarea-item.tpl.html */ "./src/lib/directives/textarea-item/textarea-item.tpl.html");
@@ -1799,7 +1805,7 @@ class TextareaItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _textarea_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _textarea_item_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.scope = {
       item: '='
     };
@@ -1823,7 +1829,7 @@ TextareaItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "TextareaViewCtrl": () => /* binding */ TextareaViewCtrl
+/* harmony export */   "TextareaViewCtrl": () => (/* binding */ TextareaViewCtrl)
 /* harmony export */ });
 class TextareaViewCtrl {
   /**
@@ -1856,7 +1862,7 @@ TextareaViewCtrl.$inject = ["Utils"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "TextareaView": () => /* binding */ TextareaView
+/* harmony export */   "TextareaView": () => (/* binding */ TextareaView)
 /* harmony export */ });
 /* harmony import */ var _textarea_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./textarea-view.controller */ "./src/lib/directives/textarea-item/textarea-view.controller.js");
 /* harmony import */ var _textarea_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./textarea-view.tpl.html */ "./src/lib/directives/textarea-item/textarea-view.tpl.html");
@@ -1878,7 +1884,7 @@ class TextareaView {
       form: '='
     };
     this.restrict = 'E';
-    this.template = _textarea_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _textarea_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.controller = _textarea_view_controller__WEBPACK_IMPORTED_MODULE_0__.TextareaViewCtrl;
     this.controllerAs = 'TextareaView';
     this.bindToController = true;
@@ -1915,7 +1921,7 @@ TextareaView.$inject = ["$timeout"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "UploadItemCtrl": () => /* binding */ UploadItemCtrl
+/* harmony export */   "UploadItemCtrl": () => (/* binding */ UploadItemCtrl)
 /* harmony export */ });
 class UploadItemCtrl {
   /**
@@ -1947,7 +1953,7 @@ UploadItemCtrl.$inject = ["Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "UploadItem": () => /* binding */ UploadItem
+/* harmony export */   "UploadItem": () => (/* binding */ UploadItem)
 /* harmony export */ });
 /* harmony import */ var _upload_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./upload-item.tpl.html */ "./src/lib/directives/upload-item/upload-item.tpl.html");
 /* harmony import */ var _upload_item_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./upload-item.controller */ "./src/lib/directives/upload-item/upload-item.controller.js");
@@ -1963,7 +1969,7 @@ class UploadItem {
    */
   constructor() {
     this.restrict = 'E';
-    this.template = _upload_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__.default;
+    this.template = _upload_item_tpl_html__WEBPACK_IMPORTED_MODULE_0__["default"];
     this.scope = {
       item: '='
     };
@@ -1987,7 +1993,7 @@ UploadItem.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "UploadViewCtrl": () => /* binding */ UploadViewCtrl
+/* harmony export */   "UploadViewCtrl": () => (/* binding */ UploadViewCtrl)
 /* harmony export */ });
 class UploadViewCtrl {
   /**
@@ -2085,7 +2091,7 @@ UploadViewCtrl.$inject = ["$scope", "Utils", "$element"];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "UploadView": () => /* binding */ UploadView
+/* harmony export */   "UploadView": () => (/* binding */ UploadView)
 /* harmony export */ });
 /* harmony import */ var _upload_view_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./upload-view.controller */ "./src/lib/directives/upload-item/upload-view.controller.js");
 /* harmony import */ var _upload_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./upload-view.tpl.html */ "./src/lib/directives/upload-item/upload-view.tpl.html");
@@ -2100,7 +2106,7 @@ class UploadView {
    */
   constructor($timeout) {
     this.$timeout = $timeout;
-    this.template = _upload_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__.default;
+    this.template = _upload_view_tpl_html__WEBPACK_IMPORTED_MODULE_1__["default"];
     this.restrict = 'E';
     this.scope = {
       formItem: '=',
@@ -2178,68 +2184,6 @@ UploadView.$inject = ["$timeout"];
 
 /***/ }),
 
-/***/ "./src/lib/index.module.js":
-/*!*********************************!*\
-  !*** ./src/lib/index.module.js ***!
-  \*********************************/
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
-/* harmony export */ });
-/* harmony import */ var _index_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.scss */ "./src/lib/index.scss");
-/* harmony import */ var _directives_upload_item_upload_item_directive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./directives/upload-item/upload-item.directive */ "./src/lib/directives/upload-item/upload-item.directive.js");
-/* harmony import */ var _directives_upload_item_upload_view_directive__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./directives/upload-item/upload-view.directive */ "./src/lib/directives/upload-item/upload-view.directive.js");
-/* harmony import */ var _directives_agreement_item_agreement_item_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./directives/agreement-item/agreement-item.directive */ "./src/lib/directives/agreement-item/agreement-item.directive.js");
-/* harmony import */ var _directives_agreement_item_agreement_view_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./directives/agreement-item/agreement-view.directive */ "./src/lib/directives/agreement-item/agreement-view.directive.js");
-/* harmony import */ var _main_main_controller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./main/main.controller */ "./src/lib/main/main.controller.js");
-/* harmony import */ var _utils_utils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/utils.service */ "./src/lib/utils/utils.service.js");
-/* harmony import */ var _directives_checkboxes_item_checkboxes_item_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./directives/checkboxes-item/checkboxes-item.directive */ "./src/lib/directives/checkboxes-item/checkboxes-item.directive.js");
-/* harmony import */ var _directives_checkboxes_item_checkboxes_view_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./directives/checkboxes-item/checkboxes-view.directive */ "./src/lib/directives/checkboxes-item/checkboxes-view.directive.js");
-/* harmony import */ var _directives_form_item_form_item_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./directives/form-item/form-item.directive */ "./src/lib/directives/form-item/form-item.directive.js");
-/* harmony import */ var _directives_form_items_container_form_items_container_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./directives/form-items-container/form-items-container.directive */ "./src/lib/directives/form-items-container/form-items-container.directive.js");
-/* harmony import */ var _directives_form_view_form_view_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./directives/form-view/form-view.directive */ "./src/lib/directives/form-view/form-view.directive.js");
-/* harmony import */ var _directives_input_item_input_item_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./directives/input-item/input-item.directive */ "./src/lib/directives/input-item/input-item.directive.js");
-/* harmony import */ var _directives_input_item_input_view_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./directives/input-item/input-view.directive */ "./src/lib/directives/input-item/input-view.directive.js");
-/* harmony import */ var _directives_label_item_label_item_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./directives/label-item/label-item.directive */ "./src/lib/directives/label-item/label-item.directive.js");
-/* harmony import */ var _directives_label_item_label_view_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./directives/label-item/label-view.directive */ "./src/lib/directives/label-item/label-view.directive.js");
-/* harmony import */ var _directives_matrix_item_matrix_item_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./directives/matrix-item/matrix-item.directive */ "./src/lib/directives/matrix-item/matrix-item.directive.js");
-/* harmony import */ var _directives_matrix_item_matrix_view_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./directives/matrix-item/matrix-view.directive */ "./src/lib/directives/matrix-item/matrix-view.directive.js");
-/* harmony import */ var _directives_radio_button_item_radio_button_item_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./directives/radio-button-item/radio-button-item.directive */ "./src/lib/directives/radio-button-item/radio-button-item.directive.js");
-/* harmony import */ var _directives_radio_button_item_radio_button_view_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./directives/radio-button-item/radio-button-view.directive */ "./src/lib/directives/radio-button-item/radio-button-view.directive.js");
-/* harmony import */ var _directives_select_item_select_view_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./directives/select-item/select-view.directive */ "./src/lib/directives/select-item/select-view.directive.js");
-/* harmony import */ var _directives_select_item_select_item_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./directives/select-item/select-item.directive */ "./src/lib/directives/select-item/select-item.directive.js");
-/* harmony import */ var _directives_textarea_item_textarea_item_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./directives/textarea-item/textarea-item.directive */ "./src/lib/directives/textarea-item/textarea-item.directive.js");
-/* harmony import */ var _directives_textarea_item_textarea_view_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./directives/textarea-item/textarea-view.directive */ "./src/lib/directives/textarea-item/textarea-view.directive.js");
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/***/ }),
-
 /***/ "./src/lib/main/main.controller.js":
 /*!*****************************************!*\
   !*** ./src/lib/main/main.controller.js ***!
@@ -2248,7 +2192,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "MainController": () => /* binding */ MainController
+/* harmony export */   "MainController": () => (/* binding */ MainController)
 /* harmony export */ });
 /**
  * @typedef {{type:string}} Item
@@ -2333,7 +2277,7 @@ MainController.$inject = [];
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "Utils": () => /* binding */ Utils
+/* harmony export */   "Utils": () => (/* binding */ Utils)
 /* harmony export */ });
 class Utils {
   /**
@@ -2380,7 +2324,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container>\n  <div\n    layout=\"{{AgreementView.formItem.config.direction == 'horizontal' ? 'row' : 'columb'}}\"\n  >\n    <md-checkbox\n      ng-model=\"AgreementView.formItem.options[0].selected\"\n      ng-change=\"AgreementView.toggleSelectedOption(option)\"\n      ng-disabled=\"AgreementView.disableOptions && !option.selected\"\n      aria-label=\"...\"\n      >{{AgreementView.formItem.options[0].value}}</md-checkbox\n    >\n  </div>\n\n  <div ng-messages=\"AgreementView.form.$error\">\n    <div ng-message=\"minSelections\">\n      Must select {{AgreementView.formItem.maxSelections || 1}} items\n    </div>\n  </div>\n</md-input-container>\n");
 
@@ -2394,7 +2338,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div\n  class=\"sortable-container\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"Checkboxes.item.options\"\n>\n  <md-input-container class=\"md-block\">\n    <label>Max Selections</label>\n    <input type=\"number\" ng-model=\"Checkboxes.item.config.maxSelections\" />\n  </md-input-container>\n\n  <md-switch\n    ng-model=\"Checkboxes.item.config.direction\"\n    ng-true-value=\"'horizontal'\"\n    ng-false-value=\"'vertical'\"\n  >\n    Layout direction ({{Checkboxes.item.config.direction == 'horizontal' ?\n    'Horizontal' : 'Vertical'}})\n  </md-switch>\n\n  <div\n    class=\"option-item\"\n    layout=\"row\"\n    ng-repeat=\"option in Checkboxes.item.options track by $index\"\n    sv-element\n  >\n    <md-button\n      class=\"md-button handle\"\n      md-no-ink\n      aria-label=\"reorder option item\"\n      sv-handle\n    >\n      <md-icon class=\"material-icons\">reorder</md-icon>\n    </md-button>\n\n    <md-input-container class=\"md-block\">\n      <label>Option {{$index + 1}}</label>\n      <input ng-model=\"option.value\" />\n    </md-input-container>\n\n    <md-button class=\"md-button\" ng-click=\"Checkboxes.deleteOption($index)\">\n      <md-icon class=\"material-icons\">delete</md-icon>\n    </md-button>\n  </div>\n  <div layout=\"row\" layout-align=\"start\">\n    <md-button\n      class=\"md-primary add-option-button\"\n      ng-click=\"Checkboxes.addOption()\"\n    >\n      <md-icon class=\"material-icons\">add</md-icon>\n    </md-button>\n  </div>\n</div>\n");
 
@@ -2408,7 +2352,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container>\n  <div\n    layout=\"{{CheckboxesView.formItem.config.direction == 'horizontal' ? 'row' : 'column'}}\"\n  >\n    <md-checkbox\n      ng-repeat=\"option in CheckboxesView.formItem.options track by $index\"\n      ng-model=\"option.selected\"\n      ng-change=\"CheckboxesView.toggleSelectedOption(option)\"\n      ng-disabled=\"CheckboxesView.disableOptions && !option.selected\"\n      aria-label=\"...\"\n      >{{option.value}}</md-checkbox\n    >\n  </div>\n\n  <div ng-messages=\"CheckboxesView.form.$error\">\n    <div ng-message=\"minSelections\">\n      Must select {{CheckboxesView.formItem.maxSelections || 1}} items\n    </div>\n  </div>\n</md-input-container>\n");
 
@@ -2422,7 +2366,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div class=\"form-item-container md-inline-form\">\n  <div class=\"form-item-actions\">\n    <md-button\n      class=\"md-button\"\n      ng-if=\"FormItem.Attrs.onDelete\"\n      ng-click=\"FormItem.deleteClicked()\"\n    >\n      <md-icon class=\"material-icons small\">delete</md-icon>\n    </md-button>\n    <md-button\n      class=\"md-button\"\n      ng-if=\"FormItem.Attrs.onUp\"\n      ng-click=\"FormItem.onUp({item: FormItem.item, index: FormItem.index()})\"\n    >\n      <md-icon class=\"material-icons small\">arrow_drop_up</md-icon>\n    </md-button>\n    <md-button\n      class=\"md-button\"\n      ng-if=\"FormItem.Attrs.onDown\"\n      ng-click=\"FormItem.onDown({item: FormItem.item, index: FormItem.index()})\"\n    >\n      <md-icon class=\"material-icons small\">arrow_drop_down</md-icon>\n    </md-button>\n  </div>\n\n  <md-input-container ng-if=\"FormItem.item.type != 'label'\" class=\"md-block\">\n    <label>Field Title</label>\n    <input ng-model=\"FormItem.item.props.title\" />\n  </md-input-container>\n\n  <md-input-container ng-if=\"FormItem.item.type != 'label'\" class=\"md-block\">\n    <label>Help Text</label>\n    <input ng-model=\"FormItem.item.props.helpText\" />\n  </md-input-container>\n\n  <md-input-container\n    ng-if=\"FormItem.item.type === 'agreement'\"\n    class=\"md-block\"\n  >\n    <label>Option Text</label>\n    <input ng-model=\"FormItem.item.options[0].value\" />\n  </md-input-container>\n\n  <div ng-switch=\"FormItem.item.type\">\n    <upload-item ng-switch-when=\"upload\" item=\"FormItem.item\"></upload-item>\n    <agreement-item\n      ng-switch-when=\"agreement\"\n      item=\"FormItem.item\"\n    ></agreement-item>\n    <label-item ng-switch-when=\"label\" item=\"FormItem.item\"></label-item>\n    <input-item ng-switch-when=\"input\" item=\"FormItem.item\"></input-item>\n    <radio-button-item\n      ng-switch-when=\"multipleChoices\"\n      item=\"FormItem.item\"\n    ></radio-button-item>\n    <matrix-item ng-switch-when=\"matrix\" item=\"FormItem.item\"></matrix-item>\n    <checkboxes-item\n      ng-switch-when=\"checkboxes\"\n      item=\"FormItem.item\"\n    ></checkboxes-item>\n    <textarea-item\n      ng-switch-when=\"textarea\"\n      item=\"FormItem.item\"\n    ></textarea-item>\n    <select-item\n      ng-switch-when=\"chooseFromList\"\n      item=\"FormItem.item\"\n    ></select-item>\n    <p ng-switch-default>UNKNOWN TYPE</p>\n  </div>\n\n  <md-input-container\n    ng-if=\"FormItem.item.type != 'label' && FormItem.item.type != 'upload'\"\n    class=\"md-block\"\n  >\n    <md-checkbox ng-model=\"FormItem.item.config.required\"\n      >Required field</md-checkbox\n    >\n  </md-input-container>\n</div>\n");
 
@@ -2436,7 +2380,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div>\n  <form-item\n    ng-repeat=\"item in container.form.items track by $index\"\n    type=\"{{item.type}}\"\n    item=\"item\"\n    index=\"$index\"\n    on-delete=\"container.delete(item, index)\"\n    on-up=\"container.up(item, index)\"\n    on-down=\"container.down(item, index)\"\n  >\n  </form-item>\n</div>\n");
 
@@ -2450,9 +2394,9 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div class=\"md-inline-form\">\n  <div\n    class=\"formItem\"\n    ng-repeat=\"formItem in FormView.form.items track by $index\"\n    ng-switch=\"formItem.type\"\n    layout=\"column\"\n  >\n    <ng-form name=\"formItemForm\">\n      <div>\n        <div class=\"formItem-title\">{{formItem.props.title}}</div>\n        <div class=\"formItem-help-text\">{{formItem.props.helpText}}</div>\n\n        <upload-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"upload\"\n        ></upload-view>\n        <agreement-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"agreement\"\n        ></agreement-view>\n        <checkboxes-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"checkboxes\"\n        ></checkboxes-view>\n        <radio-button-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"multipleChoices\"\n        ></radio-button-view>\n        <input-view\n          form-item=\"formItem\"\n          form=\"formItemForm\"\n          ng-switch-when=\"input\"\n        ></input-view>\n        <textarea-view\n          form-item=\"formItem\"\n          form=\"formItemForm\"\n          ng-switch-when=\"textarea\"\n        ></textarea-view>\n        <matrix-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"matrix\"\n        ></matrix-view>\n        <select-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"chooseFromList\"\n        ></select-view>\n        <label-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"label\"\n        ></label-view>\n      </div>\n    </ng-form>\n  </div>\n</div>\n");
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div class=\"md-inline-form\">\n  <div\n    class=\"formItem\"\n    ng-repeat=\"formItem in FormView.form.items track by $index\"\n    ng-switch=\"formItem.type\"\n    layout=\"column\"\n  >\n    <ng-form name=\"formItemForm\">\n      <div>\n        <div class=\"formItem-title\" ng-show=\"formItem.type !== 'label'\">{{formItem.props.title}}</div>\n        <div class=\"formItem-help-text\">{{formItem.props.helpText}}</div>\n\n        <upload-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"upload\"\n        ></upload-view>\n        <agreement-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"agreement\"\n        ></agreement-view>\n        <checkboxes-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"checkboxes\"\n        ></checkboxes-view>\n        <radio-button-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"multipleChoices\"\n        ></radio-button-view>\n        <input-view\n          form-item=\"formItem\"\n          form=\"formItemForm\"\n          ng-switch-when=\"input\"\n        ></input-view>\n        <textarea-view\n          form-item=\"formItem\"\n          form=\"formItemForm\"\n          ng-switch-when=\"textarea\"\n        ></textarea-view>\n        <matrix-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"matrix\"\n        ></matrix-view>\n        <select-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"chooseFromList\"\n        ></select-view>\n        <label-view\n          form-item=\"formItem\"\n          is-preview=\"true\"\n          form=\"formItemForm\"\n          ng-switch-when=\"label\"\n        ></label-view>\n      </div>\n    </ng-form>\n  </div>\n</div>\n");
 
 /***/ }),
 
@@ -2464,7 +2408,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 
@@ -2478,7 +2422,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <input\n    ng-model=\"InputView.formItem.value\"\n    type=\"{{InputView.formItem.config.type}}\"\n    placeholder=\"{{InputView.formItem.config.placeholder}}\"\n    ng-required=\"InputView.formItem.config.required\"\n  />\n  <div ng-messages=\"InputView.form.$error\">\n    <div ng-message=\"required\">This field is required</div>\n  </div>\n</md-input-container>\n");
 
@@ -2492,7 +2436,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <label>Text</label>\n  <textarea ng-model=\"Label.item.value\" md-maxlength=\"150\" rows=\"5\"></textarea>\n</md-input-container>\n");
 
@@ -2506,9 +2450,9 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <md-content flex layout-padding layout=\"row\" layout-align=\"center center\">\n    <pre>\n      <span class=\"formItem-content\">{{LabelView.formItem.value}}</span>\n    </pre>\n  </md-content>\n</md-input-container>\n");
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <md-content flex layout-padding layout=\"row\" layout-align=\"center center\">\n    <pre>\n      \n      <span class=\"formItem-content\" ng-bind-html=\"LabelView.sanitizedTitle\"></span>\n    </pre>\n  </md-content>\n</md-input-container>\n");
 
 /***/ }),
 
@@ -2520,7 +2464,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div\n  class=\"sortable-container columnContainer\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"Matrix.item.config.columns\"\n>\n  <div\n    class=\"option-item\"\n    layout=\"row\"\n    ng-repeat=\"column in Matrix.item.config.columns track by $index\"\n    sv-element\n  >\n    <md-button\n      class=\"md-button handle\"\n      md-no-ink\n      aria-label=\"reorder option item\"\n      sv-handle\n    >\n      <md-icon class=\"material-icons\">reorder</md-icon>\n    </md-button>\n\n    <md-input-container class=\"input-container\">\n      <label>Column {{$index + 1}}</label>\n      <input ng-model=\"column.value\" />\n    </md-input-container>\n\n    <md-button\n      class=\"md-button\"\n      md-no-ink\n      aria-label=\"delete column item\"\n      ng-click=\"Matrix.deleteColumn($index)\"\n    >\n      <md-icon class=\"material-icons\">delete</md-icon>\n      <md-tooltip md-autohide=\"true\">Delete</md-tooltip>\n    </md-button>\n  </div>\n  <div layout=\"row\" layout-align=\"start\">\n    <md-button\n      class=\"md-primary add-option-button\"\n      md-no-ink\n      aria-label=\"add option item\"\n      ng-click=\"Matrix.addColumn()\"\n      >Add Column</md-button\n    >\n  </div>\n</div>\n\n<div\n  class=\"sortable-container rowContainer\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"Matrix.item.config.rows\"\n>\n  <div\n    class=\"option-item\"\n    layout=\"row\"\n    ng-repeat=\"row in Matrix.item.config.rows track by $index\"\n    sv-element\n  >\n    <md-button\n      class=\"md-button handle\"\n      md-no-ink\n      aria-label=\"reorder row item\"\n      sv-handle\n    >\n      <md-icon class=\"material-icons\">reorder</md-icon>\n    </md-button>\n\n    <md-input-container class=\"input-container\">\n      <label>Row {{$index + 1}}</label>\n      <input ng-model=\"row.value\" />\n    </md-input-container>\n\n    <md-button\n      class=\"md-button\"\n      md-no-ink\n      aria-label=\"delete row item\"\n      ng-click=\"Matrix.deleteRow($index)\"\n    >\n      <md-icon class=\"material-icons\">delete</md-icon>\n      <md-tooltip md-autohide=\"true\">Delete</md-tooltip>\n    </md-button>\n  </div>\n  <div layout=\"row\" layout-align=\"start\">\n    <md-button\n      class=\"md-primary add-option-button\"\n      md-no-ink\n      aria-label=\"add row item\"\n      ng-click=\"Matrix.addRow()\"\n      >Add row</md-button\n    >\n  </div>\n</div>\n");
 
@@ -2534,7 +2478,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"matrix-container md-block\" layout=\"column\">\n  <div class=\"matrix\">\n    <div class=\"matrix-row\" flex layout=\"row\">\n      <span class=\"matrix-cell\" flex=\"20\"></span>\n      <span\n        class=\"matrix-cell matrix-cell-header\"\n        flex\n        ng-repeat=\"column in MatrixView.formItem.config.columns track by $index\"\n        >{{column.value}}</span\n      >\n    </div>\n    <div\n      class=\"matrix-row\"\n      ng-repeat=\"row in MatrixView.formItem.config.rows track by $index\"\n      layout=\"row\"\n    >\n      <span class=\"matrix-cell\" flex=\"20\" layout=\"column\" layout-align=\"center\"\n        >{{row.value}}</span\n      >\n      <md-radio-group\n        ng-model=\"row.selected\"\n        ng-change=\"MatrixView._updateValidity()\"\n        flex\n        layout=\"row\"\n      >\n        <span\n          class=\"matrix-cell radio-button-cell\"\n          flex\n          ng-repeat=\"column in MatrixView.formItem.config.columns track by $index\"\n        >\n          <md-radio-button\n            value=\"{{column.value}}\"\n            aria-label=\"...\"\n          ></md-radio-button>\n        </span>\n      </md-radio-group>\n    </div>\n  </div>\n\n  <div ng-messages=\"MatrixView.form.$error\">\n    <div ng-message=\"required\">This is required</div>\n  </div>\n</md-input-container>\n");
 
@@ -2548,7 +2492,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div\n  class=\"sortable-container\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"RadioButton.item.options\"\n>\n  <md-switch\n    ng-model=\"RadioButton.item.config.direction\"\n    ng-true-value=\"'horizontal'\"\n    ng-false-value=\"'vertical'\"\n  >\n    Layout direction ({{RadioButton.item.config.direction == 'horizontal' ?\n    'Horizontal' : 'Vertical'}})\n  </md-switch>\n\n  <div\n    class=\"option-item\"\n    layout=\"row\"\n    ng-repeat=\"option in RadioButton.item.options track by $index\"\n    sv-element\n  >\n    <md-button\n      class=\"md-button handle\"\n      md-no-ink\n      aria-label=\"reorder option item\"\n      sv-handle\n    >\n      <md-icon class=\"material-icons\">reorder</md-icon>\n    </md-button>\n\n    <md-input-container class=\"md-block\">\n      <label>Option {{$index + 1}}</label>\n      <input ng-model=\"option.value\" />\n    </md-input-container>\n\n    <md-button\n      class=\"md-button md-warn\"\n      ng-click=\"RadioButton.deleteOption($index)\"\n    >\n      <md-icon class=\"material-icons\">delete</md-icon>\n    </md-button>\n  </div>\n\n  <md-button class=\"md-raised md-accent\" ng-click=\"RadioButton.addOption()\"\n    >Add Option</md-button\n  >\n</div>\n");
 
@@ -2562,7 +2506,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <md-radio-group\n    name=\"formItemInput\"\n    ng-required=\"RadioButtonView.formItem.config.required\"\n    ng-model=\"RadioButtonView.formItem.value\"\n    layout=\"{{RadioButtonView.formItem.config.direction == 'horizontal' ? 'row' : 'column'}}\"\n    required\n  >\n    <md-radio-button\n      ng-repeat=\"option in RadioButtonView.formItem.options track by $index\"\n      value=\"{{option.value}}\"\n      aria-label=\"...\"\n    >\n      {{option.value}}\n    </md-radio-button>\n  </md-radio-group>\n\n  <div ng-messages=\"RadioButtonView.form.$error\">\n    <div ng-message=\"required\">This field is required</div>\n  </div>\n</md-input-container>\n");
 
@@ -2576,7 +2520,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div\n  class=\"sortable-container\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"Select.item.options\"\n>\n  <div\n    class=\"option-item\"\n    layout=\"row\"\n    ng-repeat=\"option in Select.item.options track by $index\"\n    sv-element\n  >\n    <md-button\n      class=\"md-button handle\"\n      md-no-ink\n      aria-label=\"reorder option item\"\n      sv-handle\n    >\n      <md-icon class=\"material-icons\">reorder</md-icon>\n    </md-button>\n\n    <md-input-container class=\"md-block\">\n      <label>Option {{$index + 1}}</label>\n      <input ng-model=\"option.value\" />\n    </md-input-container>\n\n    <md-button class=\"md-button md-warn\" ng-click=\"Select.deleteOption($index)\">\n      <md-icon class=\"material-icons\">delete</md-icon>\n    </md-button>\n  </div>\n\n  <md-button class=\"md-raised md-accent\" ng-click=\"Select.addOption()\"\n    >Add Option</md-button\n  >\n</div>\n");
 
@@ -2590,7 +2534,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <md-select\n    name=\"formItemInput\"\n    ng-required=\"SelectView.formItem.config.required\"\n    ng-model=\"SelectView.formItem.value\"\n  >\n    <md-option\n      ng-repeat=\"option in SelectView.formItem.options track by $index\"\n      ng-value=\"option.value\"\n      >{{ option.value }}</md-option\n    >\n  </md-select>\n  <div ng-messages=\"SelectView.form.$error\">\n    <div ng-message=\"required\">This field is required</div>\n  </div>\n</md-input-container>\n");
 
@@ -2604,7 +2548,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <label>Placeholder</label>\n  <input type=\"text\" ng-model=\"Textarea.item.config.placeholder\" />\n</md-input-container>\n");
 
@@ -2618,7 +2562,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<md-input-container class=\"md-block\">\n  <textarea\n    ng-model=\"TextareaView.formItem.value\"\n    placeholder=\"{{TextareaView.formItem.config.placeholder}}\"\n    ng-required=\"TextareaView.formItem.config.required\"\n  ></textarea>\n  <div ng-messages=\"TextareaView.form.$error\">\n    <div ng-message=\"required\">This field is required</div>\n  </div>\n</md-input-container>\n");
 
@@ -2632,7 +2576,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div\n  class=\"sortable-container\"\n  layout=\"column\"\n  sv-root\n  sv-part=\"Upload.item.options\"\n>\n  <md-input-container class=\"md-block\">\n    <label>Upload Button label</label>\n    <input ng-model=\"Upload.item.config.uploadFileButtonLabel\" />\n  </md-input-container>\n\n  <md-switch\n    ng-model=\"Upload.item.config.multipleUpload\"\n    ng-true-value=\"true\"\n    ng-false-value=\"false\"\n  >\n    Multiple\n  </md-switch>\n\n  <md-input-container class=\"md-block\">\n    <span>Max File size: {{Upload.item.config.size}} Mb</span>\n    <input\n      type=\"number\"\n      id=\"size\"\n      name=\"size\"\n      min=\"0.1\"\n      max=\"999\"\n      step=\"0.1\"\n      aria-label=\"size\"\n      ng-model=\"Upload.item.config.size\"\n    />\n  </md-input-container>\n\n  <md-input-container class=\"md-block\">\n    <label>Max file size error message</label>\n    <textarea\n      ng-model=\"Upload.item.config.sizeErrMessage\"\n      md-maxlength=\"150\"\n      rows=\"2\"\n    ></textarea>\n  </md-input-container>\n\n  <md-switch\n    ng-model=\"Upload.item.config.showAccept\"\n    ng-true-value=\"true\"\n    ng-false-value=\"false\"\n  >\n    Configure allowed file types\n  </md-switch>\n\n  <md-input-container class=\"md-block\" ng-if=\"Upload.item.config.showAccept\">\n    <label>Allowed Types</label>\n    <textarea\n      ng-model=\"Upload.item.config.accept\"\n      md-maxlength=\"150\"\n      rows=\"2\"\n    ></textarea>\n  </md-input-container>\n</div>\n");
 
@@ -2646,7 +2590,7 @@ __webpack_require__.r(__webpack_exports__);
 
 __webpack_require__.r(__webpack_exports__);
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   "default": () => __WEBPACK_DEFAULT_EXPORT__
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
 /* harmony export */ });
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<div layout=\"row\" class=\"option-item upload-item\">\n  <md-input-container class=\"md-block\" style=\"margin: 0\">\n    <input type=\"file\" class=\"ng-hide\" aria-label=\"file\" />\n    <md-input-container flex class=\"md-block\">\n      <input\n        type=\"text\"\n        ng-model=\"fileName\"\n        class=\"ng-hide\"\n        disabled\n        aria-label=\"fileName\"\n      />\n    </md-input-container>\n  </md-input-container>\n\n  <md-button class=\"md-raised md-accent upload-button\"\n    ><md-icon class=\"material-icons\">attach_file</md-icon\n    ><span\n      >{{UploadView.formItem.config.uploadFileButtonLabel}}</span\n    ></md-button\n  >\n</div>\n\n<div>\n  <label></label>\n  <div\n    style=\"display: grid; grid-template-columns: 8em auto; align-items: center\"\n    layout=\"row\"\n    ng-repeat=\"option in UploadView.formItem.options track by $index\"\n  >\n    <md-button ng-click=\"UploadView.removeItem($index)\" class=\"md-icon-button\">\n      <md-icon class=\"material-icons\">close</md-icon>\n    </md-button>\n    <span>{{option.name}}</span>\n  </div>\n</div>\n");
 
@@ -2660,8 +2604,9 @@ __webpack_require__.r(__webpack_exports__);
 /******/ 	// The require function
 /******/ 	function __webpack_require__(moduleId) {
 /******/ 		// Check if module is in cache
-/******/ 		if(__webpack_module_cache__[moduleId]) {
-/******/ 			return __webpack_module_cache__[moduleId].exports;
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
 /******/ 		}
 /******/ 		// Create a new module (and put it into the cache)
 /******/ 		var module = __webpack_module_cache__[moduleId] = {
@@ -2692,7 +2637,7 @@ __webpack_require__.r(__webpack_exports__);
 /******/ 	
 /******/ 	/* webpack/runtime/hasOwnProperty shorthand */
 /******/ 	(() => {
-/******/ 		__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
 /******/ 	})();
 /******/ 	
 /******/ 	/* webpack/runtime/make namespace object */
@@ -2707,10 +2652,68 @@ __webpack_require__.r(__webpack_exports__);
 /******/ 	})();
 /******/ 	
 /************************************************************************/
-/******/ 	// module exports must be returned from runtime so entry inlining is disabled
-/******/ 	// startup
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__("./src/lib/index.module.js");
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+/*!*********************************!*\
+  !*** ./src/lib/index.module.js ***!
+  \*********************************/
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
+/* harmony export */ });
+/* harmony import */ var _index_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.scss */ "./src/lib/index.scss");
+/* harmony import */ var _directives_upload_item_upload_item_directive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./directives/upload-item/upload-item.directive */ "./src/lib/directives/upload-item/upload-item.directive.js");
+/* harmony import */ var _directives_upload_item_upload_view_directive__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./directives/upload-item/upload-view.directive */ "./src/lib/directives/upload-item/upload-view.directive.js");
+/* harmony import */ var _directives_agreement_item_agreement_item_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./directives/agreement-item/agreement-item.directive */ "./src/lib/directives/agreement-item/agreement-item.directive.js");
+/* harmony import */ var _directives_agreement_item_agreement_view_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./directives/agreement-item/agreement-view.directive */ "./src/lib/directives/agreement-item/agreement-view.directive.js");
+/* harmony import */ var _main_main_controller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./main/main.controller */ "./src/lib/main/main.controller.js");
+/* harmony import */ var _utils_utils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/utils.service */ "./src/lib/utils/utils.service.js");
+/* harmony import */ var _directives_checkboxes_item_checkboxes_item_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./directives/checkboxes-item/checkboxes-item.directive */ "./src/lib/directives/checkboxes-item/checkboxes-item.directive.js");
+/* harmony import */ var _directives_checkboxes_item_checkboxes_view_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./directives/checkboxes-item/checkboxes-view.directive */ "./src/lib/directives/checkboxes-item/checkboxes-view.directive.js");
+/* harmony import */ var _directives_form_item_form_item_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./directives/form-item/form-item.directive */ "./src/lib/directives/form-item/form-item.directive.js");
+/* harmony import */ var _directives_form_items_container_form_items_container_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./directives/form-items-container/form-items-container.directive */ "./src/lib/directives/form-items-container/form-items-container.directive.js");
+/* harmony import */ var _directives_form_view_form_view_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./directives/form-view/form-view.directive */ "./src/lib/directives/form-view/form-view.directive.js");
+/* harmony import */ var _directives_input_item_input_item_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./directives/input-item/input-item.directive */ "./src/lib/directives/input-item/input-item.directive.js");
+/* harmony import */ var _directives_input_item_input_view_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./directives/input-item/input-view.directive */ "./src/lib/directives/input-item/input-view.directive.js");
+/* harmony import */ var _directives_label_item_label_item_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./directives/label-item/label-item.directive */ "./src/lib/directives/label-item/label-item.directive.js");
+/* harmony import */ var _directives_label_item_label_view_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./directives/label-item/label-view.directive */ "./src/lib/directives/label-item/label-view.directive.js");
+/* harmony import */ var _directives_matrix_item_matrix_item_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./directives/matrix-item/matrix-item.directive */ "./src/lib/directives/matrix-item/matrix-item.directive.js");
+/* harmony import */ var _directives_matrix_item_matrix_view_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./directives/matrix-item/matrix-view.directive */ "./src/lib/directives/matrix-item/matrix-view.directive.js");
+/* harmony import */ var _directives_radio_button_item_radio_button_item_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./directives/radio-button-item/radio-button-item.directive */ "./src/lib/directives/radio-button-item/radio-button-item.directive.js");
+/* harmony import */ var _directives_radio_button_item_radio_button_view_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./directives/radio-button-item/radio-button-view.directive */ "./src/lib/directives/radio-button-item/radio-button-view.directive.js");
+/* harmony import */ var _directives_select_item_select_view_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./directives/select-item/select-view.directive */ "./src/lib/directives/select-item/select-view.directive.js");
+/* harmony import */ var _directives_select_item_select_item_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./directives/select-item/select-item.directive */ "./src/lib/directives/select-item/select-item.directive.js");
+/* harmony import */ var _directives_textarea_item_textarea_item_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./directives/textarea-item/textarea-item.directive */ "./src/lib/directives/textarea-item/textarea-item.directive.js");
+/* harmony import */ var _directives_textarea_item_textarea_view_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./directives/textarea-item/textarea-view.directive */ "./src/lib/directives/textarea-item/textarea-view.directive.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+})();
+
+/******/ 	return __webpack_exports__;
 /******/ })()
 ;
 });
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js.map b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js.map
index 905e07f..1c294e9 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js.map
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css
index cef55ea..97dd746 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css
@@ -1,2 +1,7 @@
+/*!*********************************************************************************************************************************************************************!*\
+  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./src/lib/index.scss ***!
+  \*********************************************************************************************************************************************************************/@import url(https://fonts.googleapis.com/icon?family=Material+Icons);
+/*!*************************************************************************************************************************************************************************!*\
+  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./src/lib/index.scss (1) ***!
 /*# sourceMappingURL=angular-material-form-builder.min.css.map*/
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css.map b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css.map
index 9d767fe..f9d4bae 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css.map
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://angular-material-form-builder/./src/lib/index.scss"],"names":[],"mappings":"qEAMI,iFAGE,4BACA,aACA,aAJN,CASA,0FACE,eAfW,CAgBX,cAhBW,CAiBX,WAjBW,CAkBX,UAlBW,CAmBX,aANF,CAUE,uBACE,eAPJ,CASI,kCAEE,cACA,eARN,CAUM,+FAEE,WATR,CAcE,+BACE,kBACA,gBAZJ,CAcI,kDACE,kBACA,WACA,KAZN,CA0BE,sDACE,cArBJ,CAwBE,8BACE,eACA,aAtBJ,CAyBE,4BACE,aAvBJ,CA0BM,gDACE,+BAxBR,CA2BM,iDACE,kBACA,eAzBR,CA6BQ,8DACE,cACA,cA3BV,CA+BM,yGAEE,aA7BR,CAmCA,iBACE,kBACA,QACA,SACA,8BAhCF,CAkCE,wBACE,cAhCJ,CAoCA,yBACE,eACA,WAjCF,CAkCE,iCACE,cAhCJ","file":"angular-material-form-builder.min.css","sourcesContent":["@import url(https://fonts.googleapis.com/icon?family=Material+Icons);\n\n$button-dim: 36px;\n\n.main-view {\n  .content {\n    .builder,\n    .view,\n    .json {\n      border-right: 1px solid #cccccc;\n      height: 800px;\n      overflow: auto;\n    }\n  }\n}\n\n.builder-icon {\n  min-height: $button-dim;\n  min-width: $button-dim;\n  height: $button-dim;\n  width: $button-dim;\n  line-height: 0;\n}\n\nform-item {\n  .option-item {\n    min-height: 75px;\n\n    .md-button {\n      @extend .builder-icon;\n      line-height: 0;\n      margin-top: 20px;\n\n      &.handle:active,\n      &.handle:hover {\n        cursor: move;\n      }\n    }\n  }\n\n  .form-item-container {\n    position: relative;\n    padding-top: 30px;\n\n    .form-item-actions {\n      position: absolute;\n      right: 20px;\n      top: 0;\n    }\n\n    .md-button {\n      @extend .builder-icon;\n    }\n  }\n}\n\nform-view {\n  .formItem-title {\n    font-size: 18px;\n  }\n\n  .formItem-content {\n    font-size: 18px;\n  }\n\n  .formItem-help-text {\n    font-size: 14px;\n    color: #6c6c6c;\n  }\n\n  .matrix-container {\n    overflow: auto;\n\n    .matrix {\n      .matrix-row {\n        border-bottom: 1px solid #4caf50;\n      }\n\n      .matrix-cell {\n        text-align: center;\n        overflow: hidden;\n      }\n\n      md-radio-button {\n        .md-label {\n          margin-left: 0;\n          margin-right: 0;\n        }\n      }\n\n      md-radio-button,\n      .md-switch-thumb {\n        margin: 15px 0;\n      }\n    }\n  }\n}\n\ni.material-icons {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n\n  &.medium {\n    font-size: 36px;\n  }\n}\n\n.md-button.upload-button {\n  padding: 0 16px;\n  height: 36px;\n  md-icon {\n    font-size: 16px;\n  }\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"angular-material-form-builder.min.css","mappings":";;;;;6KAMI,iFAGE,2BAA+B,CAC/B,YAAa,CACb,aAJN,CASA,0FAGE,WAjBW,CAmBX,aAAc,CAJd,eAfW,CAgBX,cAhBW,CAkBX,UALF,CAUE,uBACE,eAPJ,CASI,kCAEE,aAAc,CACd,eARN,CAUM,+FAEE,WATR,CAcE,+BAEE,gBAAiB,CADjB,iBAXJ,CAcI,kDACE,iBAAkB,CAClB,UAAW,CACX,KAZN,CA0BE,sDACE,cArBJ,CAwBE,8BAEE,aAAc,CADd,cArBJ,CAyBE,4BACE,aAvBJ,CA0BM,gDACE,+BAxBR,CA2BM,iDAEE,eAAgB,CADhB,iBAxBR,CA6BQ,8DACE,aAAc,CACd,cA3BV,CA+BM,yGAEE,aA7BR,CAmCA,iBAGE,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,8BAhCF,CAkCE,wBACE,cAhCJ,CAoCA,yBAEE,WAAY,CADZ,cAhCF,CAkCE,iCACE,cAhCJ","sources":["webpack://angular-material-form-builder/./src/lib/index.scss"],"sourcesContent":["@import url(https://fonts.googleapis.com/icon?family=Material+Icons);\n\n$button-dim: 36px;\n\n.main-view {\n  .content {\n    .builder,\n    .view,\n    .json {\n      border-right: 1px solid #cccccc;\n      height: 800px;\n      overflow: auto;\n    }\n  }\n}\n\n.builder-icon {\n  min-height: $button-dim;\n  min-width: $button-dim;\n  height: $button-dim;\n  width: $button-dim;\n  line-height: 0;\n}\n\nform-item {\n  .option-item {\n    min-height: 75px;\n\n    .md-button {\n      @extend .builder-icon;\n      line-height: 0;\n      margin-top: 20px;\n\n      &.handle:active,\n      &.handle:hover {\n        cursor: move;\n      }\n    }\n  }\n\n  .form-item-container {\n    position: relative;\n    padding-top: 30px;\n\n    .form-item-actions {\n      position: absolute;\n      right: 20px;\n      top: 0;\n    }\n\n    .md-button {\n      @extend .builder-icon;\n    }\n  }\n}\n\nform-view {\n  .formItem-title {\n    font-size: 18px;\n  }\n\n  .formItem-content {\n    font-size: 18px;\n  }\n\n  .formItem-help-text {\n    font-size: 14px;\n    color: #6c6c6c;\n  }\n\n  .matrix-container {\n    overflow: auto;\n\n    .matrix {\n      .matrix-row {\n        border-bottom: 1px solid #4caf50;\n      }\n\n      .matrix-cell {\n        text-align: center;\n        overflow: hidden;\n      }\n\n      md-radio-button {\n        .md-label {\n          margin-left: 0;\n          margin-right: 0;\n        }\n      }\n\n      md-radio-button,\n      .md-switch-thumb {\n        margin: 15px 0;\n      }\n    }\n  }\n}\n\ni.material-icons {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n\n  &.medium {\n    font-size: 36px;\n  }\n}\n\n.md-button.upload-button {\n  padding: 0 16px;\n  height: 36px;\n  md-icon {\n    font-size: 16px;\n  }\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js
index c68c2e0..647c48c 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=angular-material-form-builder.min.js.map
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js.map b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js.map
index ff5e721..970b619 100644
--- a/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js.map
+++ b/public/assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/public/assets/plugins/angular-material-form-builder/favicon.ico b/public/assets/plugins/angular-material-form-builder/favicon.ico
deleted file mode 100644
index 374c74b..0000000
Binary files a/public/assets/plugins/angular-material-form-builder/favicon.ico and /dev/null differ
diff --git a/public/assets/plugins/angular-material-form-builder/index.html b/public/assets/plugins/angular-material-form-builder/index.html
deleted file mode 100644
index 40a6903..0000000
--- a/public/assets/plugins/angular-material-form-builder/index.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!DOCTYPE html>
-<html ng-app="angularMaterialFormBuilder" ng-strict-di layout="column">
-  <head>
-    <meta charset="utf-8" />
-    <title>Angular Material Form Builder</title>
-    <meta
-      name="description"
-      content="AngularJS dynamic form builder with material design implementation"
-    />
-    <meta
-      name="keywords"
-      content="angular, angularjs, google material, material design, form builder, form generator"
-    />
-    <meta name="viewport" content="width=device-width" />
-    <link rel="icon" href="./favicon.ico" />
-    <!-- Dependencies -->
-    <link
-      href="https://fonts.googleapis.com/icon?family=Material+Icons"
-      rel="stylesheet"
-    />
-    <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
-    <link rel="stylesheet" href="./node_modules/angular/angular-csp.css" />
-    <link
-      rel="stylesheet"
-      href="./node_modules/mdi/css/materialdesignicons.min.css"
-    />
-    <link
-      rel="stylesheet"
-      href="./node_modules/angular-material/angular-material.min.css"
-    />
-    <link rel="stylesheet" href="./dist/angular-material-form-builder.css" />
-  </head>
-  <body ng-controller="MainController as main" class="main-view">
-    <!--[if lt IE 10]>
-      <p class="browsehappy">
-        You are using an <strong>outdated</strong> browser. Please
-        <a href="http://browsehappy.com/">upgrade your browser</a> to improve
-        your experience.
-      </p>
-    <![endif]-->
-
-    <div class="content" layout="row" layout-padding layout-margin layout-fill>
-      <div flex layout="column" class="builder">
-        <h2>Form Builder</h2>
-        <div layout="column">
-          <form-item
-            ng-repeat="item in main.form.items track by $index"
-            type="{{item.type}}"
-            item="item"
-            index="$index"
-            on-delete="main.delete(item, index)"
-            on-up="main.up(item, index)"
-            on-down="main.down(item, index)"
-          >
-          </form-item>
-        </div>
-      </div>
-
-      <div flex layout="column" class="view">
-        <h2>Preview</h2>
-        <form name="myForm">
-          <form-view form="main.form"></form-view>
-        </form>
-      </div>
-
-      <div flex="20" layout="column" class="json">
-        <h2>Json</h2>
-        <pre>{{main.form | json}}</pre>
-      </div>
-    </div>
-
-    <md-fab-speed-dial
-      md-open="main.isOpen"
-      md-direction="up"
-      class="md-fab-bottom-right md-scale"
-    >
-      <md-fab-trigger>
-        <md-button aria-label="..." class="md-fab md-warn">
-          <md-icon class="material-icons medium">add</md-icon>
-        </md-button>
-      </md-fab-trigger>
-      <md-fab-actions>
-        <!-- 9 upload -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('upload')"
-        >
-          <md-icon class="material-icons">upload</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Upload</md-tooltip>
-        </md-button>
-        <!-- 8 agreement -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('agreement')"
-        >
-          <md-icon class="material-icons">pan_tool</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Agree Box</md-tooltip>
-        </md-button>
-        <!-- 7 Label -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('label')"
-        >
-          <md-icon class="material-icons">label</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Label</md-tooltip>
-        </md-button>
-        <!-- 6 Select -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('chooseFromList')"
-        >
-          <md-icon class="material-icons">playlist_add_check</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Select</md-tooltip>
-        </md-button>
-        <!-- 5 MATRIX -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('matrix')"
-        >
-          <md-icon class="material-icons">grid_on</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Matrix</md-tooltip>
-        </md-button>
-        <!-- 4 Text Area -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('textarea')"
-        >
-          <md-icon class="material-icons">keyboard</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Text-Area</md-tooltip>
-        </md-button>
-        <!-- 3 Text Input -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('input')"
-        >
-          <md-icon class="material-icons">text_format</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Text-Input</md-tooltip>
-        </md-button>
-        <!-- 2 Radio -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('multipleChoices')"
-        >
-          <md-icon class="material-icons">radio_button_checked</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Radio-Buttons</md-tooltip>
-        </md-button>
-        <!-- 1 Checkboxes -->
-        <md-button
-          aria-label="..."
-          class="md-fab md-raised md-mini"
-          ng-click="main.addItem('checkboxes')"
-        >
-          <md-icon class="material-icons">check_box</md-icon>
-          <md-tooltip md-direction="left" md-autohide>Checkboxes</md-tooltip>
-        </md-button>
-      </md-fab-actions>
-    </md-fab-speed-dial>
-
-    <a href="https://github.com/vlio20/angular-material-form-builder"
-      ><img
-        style="position: absolute; top: 0; right: 0; border: 0"
-        src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67"
-        alt="Fork me on GitHub"
-        data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"
-    /></a>
-
-    <!-- Dependencies -->
-    <script src="./node_modules/angular/angular.js"></script>
-    <script src="./node_modules/angular-animate/angular-animate.js"></script>
-    <script src="./node_modules/angular-aria/angular-aria.js"></script>
-    <script src="./node_modules/angular-material/angular-material.js"></script>
-    <script src="./node_modules/angular-messages/angular-messages.js"></script>
-    <script src="./node_modules/angular-sortable-view/src/angular-sortable-view.js"></script>
-    <script src="./dist/angular-material-form-builder.js"></script>
-  </body>
-</html>
diff --git a/public/assets/plugins/angular-material-form-builder/jsconfig.json b/public/assets/plugins/angular-material-form-builder/jsconfig.json
deleted file mode 100644
index 7ff0fd7..0000000
--- a/public/assets/plugins/angular-material-form-builder/jsconfig.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "compilerOptions": {
-    "target": "es2020",
-    "module": "es2020",
-    "moduleResolution": "classic",
-    "lib": ["dom", "es2020", "webworker"],
-    "allowSyntheticDefaultImports": true,
-    "allowUmdGlobalAccess": true,
-    "esModuleInterop": true,
-    "isolatedModules": true,
-    "baseUrl": "."
-  },
-  "lib": ["es2020", "node", "jest"],
-  "include": ["src", "test", "build-scripts", "test", "__mocks__"],
-  "typeAcquisition": {
-    "include": ["jest"]
-  }
-}
diff --git a/public/assets/plugins/angular-material-form-builder/package-lock.json b/public/assets/plugins/angular-material-form-builder/package-lock.json
deleted file mode 100644
index 0a68142..0000000
--- a/public/assets/plugins/angular-material-form-builder/package-lock.json
+++ /dev/null
@@ -1,32488 +0,0 @@
-{
-  "name": "@xenialab/angular-material-form-builder",
-  "version": "1.1.0",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "@xenialab/angular-material-form-builder",
-      "version": "1.1.0",
-      "license": "MIT",
-      "devDependencies": {
-        "@babel/core": "^7.12.10",
-        "@babel/preset-env": "^7.12.10",
-        "@types/jest": "^26.0.19",
-        "angular": "^1.8.2",
-        "angular-animate": "^1.8.2",
-        "angular-aria": "^1.8.2",
-        "angular-material": "^1.1.26",
-        "angular-messages": "^1.8.2",
-        "angular-mocks": "^1.8.2",
-        "angular-sortable-view": "0.0.17",
-        "angularjs-jest": "^0.1.4",
-        "babel-loader": "^8.2.2",
-        "babel-plugin-angularjs-annotate": "^0.10.0",
-        "clean-webpack-plugin": "^3.0.0",
-        "css-loader": "^5.0.1",
-        "css-minimizer-webpack-plugin": "^1.1.5",
-        "eslint": "^7.15.0",
-        "eslint-config-node": "^4.1.0",
-        "eslint-loader": "^4.0.2",
-        "eslint-plugin-import": "^2.22.1",
-        "eslint-plugin-jest": "^24.1.3",
-        "eslint-plugin-node": "^11.1.0",
-        "husky": "^4.3.6",
-        "jest": "^26.6.3",
-        "jest-raw-loader": "^1.0.1",
-        "lint-staged": "^10.5.3",
-        "mdi": "^2.2.43",
-        "mini-css-extract-plugin": "^1.3.3",
-        "prettier": "^2.2.1",
-        "raw-loader": "^4.0.2",
-        "sass": "^1.30.0",
-        "sass-loader": "^10.1.0",
-        "style-loader": "^2.0.0",
-        "terser-webpack-plugin": "^5.0.3",
-        "url-loader": "^4.1.1",
-        "webpack": "^5.10.2",
-        "webpack-cli": "^4.2.0",
-        "webpack-dev-server": "^3.11.2"
-      },
-      "engines": {
-        "node": ">=14",
-        "npm": ">=7"
-      },
-      "peerDependencies": {
-        "angular": "^1.8.2",
-        "angular-animate": "^1.8.2",
-        "angular-aria": "^1.8.2",
-        "angular-material": "^1.1.26",
-        "angular-messages": "^1.8.2",
-        "angular-sortable-view": "0.0.17",
-        "mdi": "^2.2.43"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz",
-      "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==",
-      "dev": true
-    },
-    "node_modules/@babel/core": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz",
-      "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.10",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helpers": "^7.12.5",
-        "@babel/parser": "^7.12.10",
-        "@babel/template": "^7.12.7",
-        "@babel/traverse": "^7.12.10",
-        "@babel/types": "^7.12.10",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.1",
-        "json5": "^2.1.2",
-        "lodash": "^4.17.19",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz",
-      "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.10",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
-      }
-    },
-    "node_modules/@babel/generator/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz",
-      "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
-      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-explode-assignable-expression": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz",
-      "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.12.5",
-        "@babel/helper-validator-option": "^7.12.1",
-        "browserslist": "^4.14.5",
-        "semver": "^5.5.0"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
-      "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz",
-      "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "regexpu-core": "^4.7.1"
-      }
-    },
-    "node_modules/@babel/helper-define-map": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
-      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/types": "^7.10.5",
-        "lodash": "^4.17.19"
-      }
-    },
-    "node_modules/@babel/helper-explode-assignable-expression": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
-      "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/helper-function-name": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
-      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-get-function-arity": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helper-get-function-arity": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz",
-      "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
-      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
-      "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.7"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
-      "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
-      "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-simple-access": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1",
-        "lodash": "^4.17.19"
-      }
-    },
-    "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz",
-      "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-      "dev": true
-    },
-    "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-wrap-function": "^7.10.4",
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/helper-replace-supers": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
-      "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.12.5",
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
-      "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
-      "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.11.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-      "dev": true
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
-      "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
-      "dev": true
-    },
-    "node_modules/@babel/helper-wrap-function": {
-      "version": "7.12.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
-      "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
-      "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.5",
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "node_modules/@babel/highlight": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz",
-      "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==",
-      "dev": true,
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
-      "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-class-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
-      "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-dynamic-import": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
-      "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
-      "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-json-strings": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
-      "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-json-strings": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
-      "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
-      "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-numeric-separator": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz",
-      "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
-      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-transform-parameters": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
-      "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-optional-chaining": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz",
-      "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-private-methods": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
-      "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
-      "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-bigint": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-class-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
-      "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.3"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-top-level-await": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
-      "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
-      "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
-      "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
-      "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
-      "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-define-map": "^7.10.4",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4",
-        "globals": "^11.1.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
-      "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
-      "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
-      "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
-      "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
-      "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
-      "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
-      "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
-      "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
-      "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
-      "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
-      "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-simple-access": "^7.12.1",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
-      "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-hoist-variables": "^7.10.4",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
-      "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
-      "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
-      "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
-      "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
-      "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
-      "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
-      "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
-      "dev": true,
-      "dependencies": {
-        "regenerator-transform": "^0.14.2"
-      }
-    },
-    "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
-      "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
-      "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
-      "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
-      }
-    },
-    "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz",
-      "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
-      "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz",
-      "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
-      "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
-      "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/preset-env": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.10.tgz",
-      "integrity": "sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.12.7",
-        "@babel/helper-compilation-targets": "^7.12.5",
-        "@babel/helper-module-imports": "^7.12.5",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-option": "^7.12.1",
-        "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
-        "@babel/plugin-proposal-class-properties": "^7.12.1",
-        "@babel/plugin-proposal-dynamic-import": "^7.12.1",
-        "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
-        "@babel/plugin-proposal-json-strings": "^7.12.1",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
-        "@babel/plugin-proposal-numeric-separator": "^7.12.7",
-        "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
-        "@babel/plugin-proposal-optional-chaining": "^7.12.7",
-        "@babel/plugin-proposal-private-methods": "^7.12.1",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0",
-        "@babel/plugin-syntax-class-properties": "^7.12.1",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.0",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
-        "@babel/plugin-syntax-top-level-await": "^7.12.1",
-        "@babel/plugin-transform-arrow-functions": "^7.12.1",
-        "@babel/plugin-transform-async-to-generator": "^7.12.1",
-        "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
-        "@babel/plugin-transform-block-scoping": "^7.12.1",
-        "@babel/plugin-transform-classes": "^7.12.1",
-        "@babel/plugin-transform-computed-properties": "^7.12.1",
-        "@babel/plugin-transform-destructuring": "^7.12.1",
-        "@babel/plugin-transform-dotall-regex": "^7.12.1",
-        "@babel/plugin-transform-duplicate-keys": "^7.12.1",
-        "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
-        "@babel/plugin-transform-for-of": "^7.12.1",
-        "@babel/plugin-transform-function-name": "^7.12.1",
-        "@babel/plugin-transform-literals": "^7.12.1",
-        "@babel/plugin-transform-member-expression-literals": "^7.12.1",
-        "@babel/plugin-transform-modules-amd": "^7.12.1",
-        "@babel/plugin-transform-modules-commonjs": "^7.12.1",
-        "@babel/plugin-transform-modules-systemjs": "^7.12.1",
-        "@babel/plugin-transform-modules-umd": "^7.12.1",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
-        "@babel/plugin-transform-new-target": "^7.12.1",
-        "@babel/plugin-transform-object-super": "^7.12.1",
-        "@babel/plugin-transform-parameters": "^7.12.1",
-        "@babel/plugin-transform-property-literals": "^7.12.1",
-        "@babel/plugin-transform-regenerator": "^7.12.1",
-        "@babel/plugin-transform-reserved-words": "^7.12.1",
-        "@babel/plugin-transform-shorthand-properties": "^7.12.1",
-        "@babel/plugin-transform-spread": "^7.12.1",
-        "@babel/plugin-transform-sticky-regex": "^7.12.7",
-        "@babel/plugin-transform-template-literals": "^7.12.1",
-        "@babel/plugin-transform-typeof-symbol": "^7.12.10",
-        "@babel/plugin-transform-unicode-escapes": "^7.12.1",
-        "@babel/plugin-transform-unicode-regex": "^7.12.1",
-        "@babel/preset-modules": "^0.1.3",
-        "@babel/types": "^7.12.10",
-        "core-js-compat": "^3.8.0",
-        "semver": "^5.5.0"
-      }
-    },
-    "node_modules/@babel/preset-modules": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
-      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
-      "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
-      "dev": true,
-      "dependencies": {
-        "regenerator-runtime": "^0.13.4"
-      }
-    },
-    "node_modules/@babel/template": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
-      "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/parser": "^7.12.7",
-        "@babel/types": "^7.12.7"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz",
-      "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.10",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/parser": "^7.12.10",
-        "@babel/types": "^7.12.10",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.19"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz",
-      "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "lodash": "^4.17.19",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
-    "node_modules/@bcoe/v8-coverage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-      "dev": true
-    },
-    "node_modules/@cnakazawa/watch": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
-      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
-      "dev": true,
-      "dependencies": {
-        "exec-sh": "^0.3.2",
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "watch": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.1.95"
-      }
-    },
-    "node_modules/@eslint/eslintrc": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
-      "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/schema": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
-      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/console": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz",
-      "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/console/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/console/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/console/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/console/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/core": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz",
-      "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^26.6.2",
-        "@jest/reporters": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-changed-files": "^26.6.2",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-resolve-dependencies": "^26.6.3",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "jest-watcher": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "p-each-series": "^2.1.0",
-        "rimraf": "^3.0.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/core/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/core/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/core/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/core/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/core/node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/@jest/environment": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
-      "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/fake-timers": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
-      "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "@sinonjs/fake-timers": "^6.0.1",
-        "@types/node": "*",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/globals": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz",
-      "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "expect": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/reporters": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz",
-      "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==",
-      "dev": true,
-      "dependencies": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.2.4",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.0.2",
-        "jest-haste-map": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.0",
-        "string-length": "^4.0.1",
-        "terminal-link": "^2.0.0",
-        "v8-to-istanbul": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      },
-      "optionalDependencies": {
-        "node-notifier": "^8.0.0"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/reporters/node_modules/string-length": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
-      "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
-      "dev": true,
-      "dependencies": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/source-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz",
-      "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.4",
-        "source-map": "^0.6.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/test-result": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz",
-      "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/test-sequencer": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz",
-      "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/test-result": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/transform": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz",
-      "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.1.0",
-        "@jest/types": "^26.6.2",
-        "babel-plugin-istanbul": "^6.0.0",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^1.4.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-util": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pirates": "^4.0.1",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.1",
-        "write-file-atomic": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/types": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-      "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@jest/types/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/types/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@jest/types/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/types/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
-      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.3",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
-      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.3",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@npmcli/move-file": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
-      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
-      "dev": true,
-      "dependencies": {
-        "mkdirp": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@npmcli/move-file/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@sinonjs/commons": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
-      "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
-      "dev": true,
-      "dependencies": {
-        "type-detect": "4.0.8"
-      }
-    },
-    "node_modules/@sinonjs/fake-timers": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
-      "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
-      "dev": true,
-      "dependencies": {
-        "@sinonjs/commons": "^1.7.0"
-      }
-    },
-    "node_modules/@types/anymatch": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
-      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
-      "dev": true
-    },
-    "node_modules/@types/babel__core": {
-      "version": "7.1.12",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz",
-      "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "node_modules/@types/babel__generator": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
-      "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__template": {
-      "version": "7.4.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz",
-      "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__traverse": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz",
-      "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.3.0"
-      }
-    },
-    "node_modules/@types/eslint": {
-      "version": "7.2.6",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
-      "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==",
-      "dev": true,
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
-      "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
-      "dev": true,
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "0.0.45",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
-      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
-      "dev": true
-    },
-    "node_modules/@types/glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
-      "dev": true,
-      "dependencies": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/graceful-fs": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",
-      "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/istanbul-lib-coverage": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
-      "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
-      "dev": true
-    },
-    "node_modules/@types/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "*"
-      }
-    },
-    "node_modules/@types/istanbul-reports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
-      "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/@types/jest": {
-      "version": "26.0.19",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz",
-      "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==",
-      "dev": true,
-      "dependencies": {
-        "jest-diff": "^26.0.0",
-        "pretty-format": "^26.0.0"
-      }
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
-      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
-      "dev": true
-    },
-    "node_modules/@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
-    },
-    "node_modules/@types/minimatch": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
-      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
-      "dev": true
-    },
-    "node_modules/@types/node": {
-      "version": "14.14.13",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.13.tgz",
-      "integrity": "sha512-vbxr0VZ8exFMMAjCW8rJwaya0dMCDyYW2ZRdTyjtrCvJoENMpdUHOT/eTzvgyA5ZnqRZ/sI0NwqAxNHKYokLJQ==",
-      "dev": true
-    },
-    "node_modules/@types/normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
-      "dev": true
-    },
-    "node_modules/@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
-      "dev": true
-    },
-    "node_modules/@types/prettier": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz",
-      "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==",
-      "dev": true
-    },
-    "node_modules/@types/q": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
-      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
-      "dev": true
-    },
-    "node_modules/@types/source-list-map": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
-      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
-      "dev": true
-    },
-    "node_modules/@types/stack-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
-      "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
-      "dev": true
-    },
-    "node_modules/@types/tapable": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz",
-      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
-      "dev": true
-    },
-    "node_modules/@types/uglify-js": {
-      "version": "3.11.1",
-      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz",
-      "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/@types/webpack": {
-      "version": "4.41.25",
-      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz",
-      "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/anymatch": "*",
-        "@types/node": "*",
-        "@types/tapable": "*",
-        "@types/uglify-js": "*",
-        "@types/webpack-sources": "*",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/@types/webpack-sources": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz",
-      "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*",
-        "@types/source-list-map": "*",
-        "source-map": "^0.7.3"
-      }
-    },
-    "node_modules/@types/webpack-sources/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@types/yargs": {
-      "version": "15.0.12",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz",
-      "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==",
-      "dev": true,
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/@types/yargs-parser": {
-      "version": "15.0.0",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
-      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
-      "dev": true
-    },
-    "node_modules/@typescript-eslint/experimental-utils": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz",
-      "integrity": "sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.10.0",
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/typescript-estree": "4.10.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz",
-      "integrity": "sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/visitor-keys": "4.10.0"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      }
-    },
-    "node_modules/@typescript-eslint/types": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.10.0.tgz",
-      "integrity": "sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g==",
-      "dev": true,
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz",
-      "integrity": "sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/visitor-keys": "4.10.0",
-        "debug": "^4.1.1",
-        "globby": "^11.0.1",
-        "is-glob": "^4.0.1",
-        "lodash": "^4.17.15",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
-      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
-      "dev": true,
-      "dependencies": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz",
-      "integrity": "sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "4.10.0",
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz",
-      "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/wast-parser": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz",
-      "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz",
-      "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz",
-      "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/helper-code-frame": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz",
-      "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/wast-printer": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-fsm": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz",
-      "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/helper-module-context": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz",
-      "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz",
-      "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz",
-      "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz",
-      "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==",
-      "dev": true,
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz",
-      "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==",
-      "dev": true,
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz",
-      "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg==",
-      "dev": true
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz",
-      "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/helper-wasm-section": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1",
-        "@webassemblyjs/wasm-opt": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1",
-        "@webassemblyjs/wast-printer": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz",
-      "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/ieee754": "1.9.1",
-        "@webassemblyjs/leb128": "1.9.1",
-        "@webassemblyjs/utf8": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz",
-      "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz",
-      "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-api-error": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/ieee754": "1.9.1",
-        "@webassemblyjs/leb128": "1.9.1",
-        "@webassemblyjs/utf8": "1.9.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz",
-      "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.1",
-        "@webassemblyjs/helper-api-error": "1.9.1",
-        "@webassemblyjs/helper-code-frame": "1.9.1",
-        "@webassemblyjs/helper-fsm": "1.9.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz",
-      "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==",
-      "dev": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/wast-parser": "1.9.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webpack-cli/info": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz",
-      "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==",
-      "dev": true,
-      "dependencies": {
-        "envinfo": "^7.7.3"
-      }
-    },
-    "node_modules/@webpack-cli/serve": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz",
-      "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==",
-      "dev": true
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "dev": true
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "dev": true
-    },
-    "node_modules/abab": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
-      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
-      "dev": true
-    },
-    "node_modules/accepts": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
-      "dev": true,
-      "dependencies": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "8.0.4",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
-      "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-globals": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-walk": "^7.1.1"
-      }
-    },
-    "node_modules/acorn-globals/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-      "dev": true
-    },
-    "node_modules/acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
-      "dependencies": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "node_modules/ajv-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
-      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true,
-      "peerDependencies": {
-        "ajv": ">=5.0.0"
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "dev": true
-    },
-    "node_modules/alphanum-sort": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
-      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
-      "dev": true
-    },
-    "node_modules/angular": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.2.tgz",
-      "integrity": "sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw==",
-      "dev": true
-    },
-    "node_modules/angular-animate": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.2.tgz",
-      "integrity": "sha512-Jbr9+grNMs9Kj57xuBU3Ju3NOPAjS1+g2UAwwDv7su1lt0/PLDy+9zEwDiu8C8xJceoTbmBNKiWGPJGBdCQLlA==",
-      "dev": true
-    },
-    "node_modules/angular-aria": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.8.2.tgz",
-      "integrity": "sha512-xWT1Lm+Xug2GM6nGNMioBP4hXt3sj2eGaExa4cVCZUYSVWezgyuD1RiLgzJzwTkBGYplHQUzQaz3yDY8jVI6yQ==",
-      "dev": true
-    },
-    "node_modules/angular-material": {
-      "version": "1.1.26",
-      "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.26.tgz",
-      "integrity": "sha512-DBLsoOP1D1E14EQsECZYabt3Jh1PpvsG8k1aZgaP/Ml57n4stpClzLhCsuTNbtB/pqq9CL8XtpCfB6fhVRWqIQ==",
-      "dev": true
-    },
-    "node_modules/angular-messages": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.8.2.tgz",
-      "integrity": "sha512-M1qNh/30cLJi4yJJ+3YB8saPonRcavz5Dquqz0T/aUySKJhIkUoeCkmF+BcLH4SJ5PBp04yy4CZUUeNRVi7jZA==",
-      "dev": true
-    },
-    "node_modules/angular-mocks": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.8.2.tgz",
-      "integrity": "sha512-I5L3P0l21HPdVsP4A4qWmENt4ePjjbkDFdAzOaM7QiibFySbt14DptPbt2IjeG4vFBr4vSLbhIz8Fk03DISl8Q==",
-      "dev": true
-    },
-    "node_modules/angular-sortable-view": {
-      "version": "0.0.17",
-      "resolved": "https://registry.npmjs.org/angular-sortable-view/-/angular-sortable-view-0.0.17.tgz",
-      "integrity": "sha512-2WkhM0Lt/wyMyrX/+7ve9ejSegBd7A4eRBNHEIJz8XMBIOjt+3oM1WpcAm+qNThkmNmmQaDeaYv0TQZw/WDMBw==",
-      "dev": true
-    },
-    "node_modules/angularjs-jest": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/angularjs-jest/-/angularjs-jest-0.1.4.tgz",
-      "integrity": "sha512-/RqIx8kArD+0HQhxuQAW8Yt7H8fte9QLz/OmzAhpWOkc3BDkPgRtl6ULnZY/w8PSMSLCNoa6lbHPHEYcGrucWg==",
-      "dev": true,
-      "dependencies": {
-        "html-minifier": ">=3.0.0"
-      }
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
-      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.11.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-escapes/node_modules/type-fest": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-      "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-html": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
-      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
-      "dev": true,
-      "engines": [
-        "node >= 0.8.0"
-      ],
-      "bin": {
-        "ansi-html": "bin/ansi-html"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
-      "dev": true,
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-back": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
-      "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
-      "dev": true
-    },
-    "node_modules/array-includes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz",
-      "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1",
-        "get-intrinsic": "^1.0.1",
-        "is-string": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "dependencies": {
-        "array-uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array.prototype.flat": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
-      "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "dependencies": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "node_modules/assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
-    },
-    "node_modules/async-limiter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
-      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
-      "dev": true
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "node_modules/atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true,
-      "bin": {
-        "atob": "bin/atob.js"
-      },
-      "engines": {
-        "node": ">= 4.5.0"
-      }
-    },
-    "node_modules/aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/aws4": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-      "dev": true
-    },
-    "node_modules/babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/babel-eslint/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/babel-jest": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz",
-      "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/babel__core": "^7.1.7",
-        "babel-plugin-istanbul": "^6.0.0",
-        "babel-preset-jest": "^26.6.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/babel-jest/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/babel-jest/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/babel-jest/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/babel-jest/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/babel-loader": {
-      "version": "8.2.2",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
-      "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
-      "dev": true,
-      "dependencies": {
-        "find-cache-dir": "^3.3.1",
-        "loader-utils": "^1.4.0",
-        "make-dir": "^3.1.0",
-        "schema-utils": "^2.6.5"
-      },
-      "engines": {
-        "node": ">= 8.9"
-      }
-    },
-    "node_modules/babel-loader/node_modules/schema-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.5",
-        "ajv": "^6.12.4",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 8.9.0"
-      }
-    },
-    "node_modules/babel-plugin-angularjs-annotate": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
-      "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/types": "^7.2.0",
-        "simple-is": "~0.2.0"
-      }
-    },
-    "node_modules/babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "dev": true,
-      "dependencies": {
-        "object.assign": "^4.1.0"
-      }
-    },
-    "node_modules/babel-plugin-istanbul": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
-      "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@istanbuljs/load-nyc-config": "^1.0.0",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-instrument": "^4.0.0",
-        "test-exclude": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/babel-plugin-jest-hoist": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz",
-      "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.3.3",
-        "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.0.0",
-        "@types/babel__traverse": "^7.0.6"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/babel-preset-current-node-syntax": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-bigint": "^7.8.3",
-        "@babel/plugin-syntax-class-properties": "^7.8.3",
-        "@babel/plugin-syntax-import-meta": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3"
-      }
-    },
-    "node_modules/babel-preset-jest": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz",
-      "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==",
-      "dev": true,
-      "dependencies": {
-        "babel-plugin-jest-hoist": "^26.6.2",
-        "babel-preset-current-node-syntax": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "node_modules/base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "dependencies": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/batch": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
-      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
-      "dev": true
-    },
-    "node_modules/bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "dependencies": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "node_modules/big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "node_modules/body-parser": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
-      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
-      "dev": true,
-      "dependencies": {
-        "bytes": "3.1.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/body-parser/node_modules/bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/body-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/body-parser/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/body-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/body-parser/node_modules/qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/bonjour": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
-      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
-      "dev": true,
-      "dependencies": {
-        "array-flatten": "^2.1.0",
-        "deep-equal": "^1.0.1",
-        "dns-equal": "^1.0.0",
-        "dns-txt": "^2.0.2",
-        "multicast-dns": "^6.0.1",
-        "multicast-dns-service-types": "^1.1.0"
-      }
-    },
-    "node_modules/bonjour/node_modules/array-flatten": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
-      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
-      "dev": true
-    },
-    "node_modules/boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
-      "dev": true
-    },
-    "node_modules/browserslist": {
-      "version": "4.16.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz",
-      "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==",
-      "dev": true,
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001165",
-        "colorette": "^1.2.1",
-        "electron-to-chromium": "^1.3.621",
-        "escalade": "^3.1.1",
-        "node-releases": "^1.1.67"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/bser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-      "dev": true,
-      "dependencies": {
-        "node-int64": "^0.4.0"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
-    },
-    "node_modules/buffer-indexof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
-      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
-      "dev": true
-    },
-    "node_modules/bytes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/cacache": {
-      "version": "15.0.5",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
-      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
-      "dev": true,
-      "dependencies": {
-        "@npmcli/move-file": "^1.0.1",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "glob": "^7.1.4",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^6.0.0",
-        "minipass": "^3.1.1",
-        "minipass-collect": "^1.0.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.2",
-        "mkdirp": "^1.0.3",
-        "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^8.0.0",
-        "tar": "^6.0.2",
-        "unique-filename": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/cacache/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cacache/node_modules/p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "dependencies": {
-        "aggregate-error": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cacache/node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "dependencies": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/caller-callsite": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
-      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/caller-callsite/node_modules/callsites": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
-      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/caller-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
-      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
-      "dev": true,
-      "dependencies": {
-        "caller-callsite": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/camel-case": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
-      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
-      "dev": true,
-      "dependencies": {
-        "no-case": "^2.2.0",
-        "upper-case": "^1.1.1"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/caniuse-api": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
-      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "caniuse-lite": "^1.0.0",
-        "lodash.memoize": "^4.1.2",
-        "lodash.uniq": "^4.5.0"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001166",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001166.tgz",
-      "integrity": "sha512-nCL4LzYK7F4mL0TjEMeYavafOGnBa98vTudH5c8lW9izUjnB99InG6pmC1ElAI1p0GlyZajv4ltUdFXvOHIl1A==",
-      "dev": true
-    },
-    "node_modules/capture-exit": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
-      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
-      "dev": true,
-      "dependencies": {
-        "rsvp": "^4.8.4"
-      },
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/chalk/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/chalk/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/char-regex": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true
-    },
-    "node_modules/chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-      "dev": true,
-      "dependencies": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.1.2"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
-      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
-    "node_modules/cjs-module-lexer": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz",
-      "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==",
-      "dev": true
-    },
-    "node_modules/class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/clean-css": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
-      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "~0.6.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/clean-webpack-plugin": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz",
-      "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==",
-      "dev": true,
-      "dependencies": {
-        "@types/webpack": "^4.4.31",
-        "del": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
-      "dependencies": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/cli-truncate/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/slice-ansi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-truncate/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-width": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
-      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^6.2.0"
-      }
-    },
-    "node_modules/cliui/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true,
-      "engines": {
-        "iojs": ">= 1.0.0",
-        "node": ">= 0.12.0"
-      }
-    },
-    "node_modules/coa": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
-      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
-      "dev": true,
-      "dependencies": {
-        "@types/q": "^1.5.1",
-        "chalk": "^2.4.1",
-        "q": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-      "dev": true
-    },
-    "node_modules/collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "dependencies": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
-      "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.1",
-        "color-string": "^1.5.4"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "node_modules/color-string": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
-      "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "node_modules/colorette": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
-      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
-      "dev": true
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/command-line-usage": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz",
-      "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==",
-      "dev": true,
-      "dependencies": {
-        "array-back": "^4.0.1",
-        "chalk": "^2.4.2",
-        "table-layout": "^1.0.1",
-        "typical": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
-    },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
-    },
-    "node_modules/compare-versions": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
-      "dev": true
-    },
-    "node_modules/component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "node_modules/compressible": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
-      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
-      "dev": true,
-      "dependencies": {
-        "mime-db": ">= 1.43.0 < 2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/compression": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
-      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
-      "dev": true,
-      "dependencies": {
-        "accepts": "~1.3.5",
-        "bytes": "3.0.0",
-        "compressible": "~2.0.16",
-        "debug": "2.6.9",
-        "on-headers": "~1.0.2",
-        "safe-buffer": "5.1.2",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/compression/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/compression/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/compression/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "node_modules/connect-history-api-fallback": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
-      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/contains-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
-      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "5.1.2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/content-disposition/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/convert-source-map": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "node_modules/convert-source-map/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/cookie": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
-      "dev": true
-    },
-    "node_modules/copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/core-js-compat": {
-      "version": "3.8.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz",
-      "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.15.0",
-        "semver": "7.0.0"
-      }
-    },
-    "node_modules/core-js-compat/node_modules/semver": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "node_modules/cosmiconfig": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
-      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
-      "dev": true,
-      "dependencies": {
-        "import-fresh": "^2.0.0",
-        "is-directory": "^0.3.1",
-        "js-yaml": "^3.13.1",
-        "parse-json": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cosmiconfig/node_modules/import-fresh": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
-      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
-      "dev": true,
-      "dependencies": {
-        "caller-path": "^2.0.0",
-        "resolve-from": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cosmiconfig/node_modules/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
-      "dev": true,
-      "dependencies": {
-        "error-ex": "^1.3.1",
-        "json-parse-better-errors": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cosmiconfig/node_modules/resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/css-color-names": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
-      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/css-declaration-sorter": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
-      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.1",
-        "timsort": "^0.3.0"
-      },
-      "engines": {
-        "node": ">4"
-      }
-    },
-    "node_modules/css-declaration-sorter/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/css-declaration-sorter/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/css-declaration-sorter/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/css-loader": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz",
-      "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^6.2.0",
-        "cssesc": "^3.0.0",
-        "icss-utils": "^5.0.0",
-        "loader-utils": "^2.0.0",
-        "postcss": "^8.1.4",
-        "postcss-modules-extract-imports": "^3.0.0",
-        "postcss-modules-local-by-default": "^4.0.0",
-        "postcss-modules-scope": "^3.0.0",
-        "postcss-modules-values": "^4.0.0",
-        "postcss-value-parser": "^4.1.0",
-        "schema-utils": "^3.0.0",
-        "semver": "^7.3.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/css-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/css-loader/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/css-minimizer-webpack-plugin": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-1.1.5.tgz",
-      "integrity": "sha512-mXgaoFjNpIudZfxD49N1aPtLxfXGJt+BVPVjQ+H66I48b5n4wJtFpYfffVr7izK8W6fD01J7K0kUcP6HGjw90w==",
-      "dev": true,
-      "dependencies": {
-        "cacache": "^15.0.5",
-        "cssnano": "^4.1.10",
-        "find-cache-dir": "^3.3.1",
-        "jest-worker": "^26.3.0",
-        "p-limit": "^3.0.2",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
-        "source-map": "^0.6.1",
-        "webpack-sources": "^1.4.3"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/css-minimizer-webpack-plugin/node_modules/webpack-sources": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-      "dev": true,
-      "dependencies": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/css-select": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
-      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
-      "dev": true,
-      "dependencies": {
-        "boolbase": "^1.0.0",
-        "css-what": "^3.2.1",
-        "domutils": "^1.7.0",
-        "nth-check": "^1.0.2"
-      }
-    },
-    "node_modules/css-select-base-adapter": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
-      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
-      "dev": true
-    },
-    "node_modules/css-select/node_modules/dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "^2.0.1",
-        "entities": "^2.0.0"
-      }
-    },
-    "node_modules/css-select/node_modules/dom-serializer/node_modules/domelementtype": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
-      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
-      "dev": true
-    },
-    "node_modules/css-select/node_modules/domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-      "dev": true
-    },
-    "node_modules/css-select/node_modules/domutils": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
-      "dev": true,
-      "dependencies": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/css-tree": {
-      "version": "1.0.0-alpha.37",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
-      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
-      "dev": true,
-      "dependencies": {
-        "mdn-data": "2.0.4",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/css-what": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
-      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "dev": true,
-      "bin": {
-        "cssesc": "bin/cssesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cssnano": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
-      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
-      "dev": true,
-      "dependencies": {
-        "cosmiconfig": "^5.0.0",
-        "cssnano-preset-default": "^4.0.7",
-        "is-resolvable": "^1.0.0",
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano-preset-default": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
-      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
-      "dev": true,
-      "dependencies": {
-        "css-declaration-sorter": "^4.0.1",
-        "cssnano-util-raw-cache": "^4.0.1",
-        "postcss": "^7.0.0",
-        "postcss-calc": "^7.0.1",
-        "postcss-colormin": "^4.0.3",
-        "postcss-convert-values": "^4.0.1",
-        "postcss-discard-comments": "^4.0.2",
-        "postcss-discard-duplicates": "^4.0.2",
-        "postcss-discard-empty": "^4.0.1",
-        "postcss-discard-overridden": "^4.0.1",
-        "postcss-merge-longhand": "^4.0.11",
-        "postcss-merge-rules": "^4.0.3",
-        "postcss-minify-font-values": "^4.0.2",
-        "postcss-minify-gradients": "^4.0.2",
-        "postcss-minify-params": "^4.0.2",
-        "postcss-minify-selectors": "^4.0.2",
-        "postcss-normalize-charset": "^4.0.1",
-        "postcss-normalize-display-values": "^4.0.2",
-        "postcss-normalize-positions": "^4.0.2",
-        "postcss-normalize-repeat-style": "^4.0.2",
-        "postcss-normalize-string": "^4.0.2",
-        "postcss-normalize-timing-functions": "^4.0.2",
-        "postcss-normalize-unicode": "^4.0.1",
-        "postcss-normalize-url": "^4.0.1",
-        "postcss-normalize-whitespace": "^4.0.2",
-        "postcss-ordered-values": "^4.1.2",
-        "postcss-reduce-initial": "^4.0.3",
-        "postcss-reduce-transforms": "^4.0.2",
-        "postcss-svgo": "^4.0.2",
-        "postcss-unique-selectors": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano-preset-default/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cssnano-preset-default/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/cssnano-preset-default/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cssnano-util-get-arguments": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
-      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano-util-get-match": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
-      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano-util-raw-cache": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
-      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano-util-raw-cache/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cssnano-util-raw-cache/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/cssnano-util-raw-cache/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cssnano-util-same-parent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
-      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/cssnano/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cssnano/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/cssnano/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/csso": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
-      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
-      "dev": true,
-      "dependencies": {
-        "css-tree": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/css-tree": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
-      "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
-      "dev": true,
-      "dependencies": {
-        "mdn-data": "2.0.14",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/mdn-data": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-      "dev": true
-    },
-    "node_modules/cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
-      "dev": true
-    },
-    "node_modules/cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-      "dev": true,
-      "dependencies": {
-        "cssom": "~0.3.6"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cssstyle/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "dev": true
-    },
-    "node_modules/dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-      "dev": true,
-      "dependencies": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decimal.js": {
-      "version": "10.2.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
-      "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==",
-      "dev": true
-    },
-    "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "node_modules/deep-equal": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
-      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
-      "dev": true,
-      "dependencies": {
-        "is-arguments": "^1.0.4",
-        "is-date-object": "^1.0.1",
-        "is-regex": "^1.0.4",
-        "object-is": "^1.0.1",
-        "object-keys": "^1.1.1",
-        "regexp.prototype.flags": "^1.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-gateway": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
-      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
-      "dev": true,
-      "dependencies": {
-        "execa": "^1.0.0",
-        "ip-regex": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/default-gateway/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/default-gateway/node_modules/execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.0",
-        "get-stream": "^4.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/default-gateway/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/default-gateway/node_modules/is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-gateway/node_modules/npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/default-gateway/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/default-gateway/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-gateway/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-gateway/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "dependencies": {
-        "object-keys": "^1.0.12"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/define-property/node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/define-property/node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/define-property/node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/del": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/glob": "^7.1.1",
-        "globby": "^6.1.0",
-        "is-path-cwd": "^2.0.0",
-        "is-path-in-cwd": "^2.0.0",
-        "p-map": "^2.0.0",
-        "pify": "^4.0.1",
-        "rimraf": "^2.6.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/destroy": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
-      "dev": true
-    },
-    "node_modules/detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/detect-node": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
-      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
-      "dev": true
-    },
-    "node_modules/diff-sequences": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
-      "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "dependencies": {
-        "path-type": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/dir-glob/node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/dns-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
-      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
-      "dev": true
-    },
-    "node_modules/dns-packet": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
-      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
-      "dev": true,
-      "dependencies": {
-        "ip": "^1.1.0",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/dns-txt": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
-      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
-      "dev": true,
-      "dependencies": {
-        "buffer-indexof": "^1.0.0"
-      }
-    },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "dev": true,
-      "dependencies": {
-        "webidl-conversions": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/domexception/node_modules/webidl-conversions": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-      "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
-      "dependencies": {
-        "is-obj": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "dependencies": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.3.626",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.626.tgz",
-      "integrity": "sha512-7CanEvJx74EnvjHu1X8gf93KieyxvFLnqOXAH/ddjWD4RrUZYqdg3pykrQ/7t6SLI7DTsp4tfQXEfzeK5t6oAw==",
-      "dev": true
-    },
-    "node_modules/emittery": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz",
-      "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "node_modules/emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz",
-      "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "dependencies": {
-        "ansi-colors": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/entities": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
-      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
-      "dev": true
-    },
-    "node_modules/envinfo": {
-      "version": "7.7.3",
-      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
-      "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
-      "dev": true,
-      "bin": {
-        "envinfo": "dist/cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "dev": true,
-      "dependencies": {
-        "prr": "~1.0.1"
-      },
-      "bin": {
-        "errno": "cli.js"
-      }
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-abstract": {
-      "version": "1.18.0-next.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-      "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-      "dev": true,
-      "dependencies": {
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1",
-        "is-callable": "^1.2.2",
-        "is-negative-zero": "^2.0.0",
-        "is-regex": "^1.1.1",
-        "object-inspect": "^1.8.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.1",
-        "string.prototype.trimend": "^1.0.1",
-        "string.prototype.trimstart": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
-      "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "dev": true,
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint": {
-      "version": "7.15.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz",
-      "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.2.2",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.2.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.0",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/eslint-config-esnext": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz",
-      "integrity": "sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA==",
-      "dev": true,
-      "dependencies": {
-        "babel-eslint": "^10.0.1",
-        "eslint": "^6.8.0",
-        "eslint-plugin-babel": "^5.2.1",
-        "eslint-plugin-import": "^2.14.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/cross-spawn/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/eslint": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
-      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.10.0",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^1.4.3",
-        "eslint-visitor-keys": "^1.1.0",
-        "espree": "^6.1.2",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^7.0.0",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.14",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.3",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "semver": "^6.1.2",
-        "strip-ansi": "^5.2.0",
-        "strip-json-comments": "^3.0.1",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/eslint-utils": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
-      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/espree": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
-      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-jsx": "^5.2.0",
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/file-entry-cache": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-      "dev": true,
-      "dependencies": {
-        "flat-cache": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/flat-cache": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-      "dev": true,
-      "dependencies": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-      "dev": true
-    },
-    "node_modules/eslint-config-esnext/node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/regexpp": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
-      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.5.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-esnext/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/eslint-config-node": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-node/-/eslint-config-node-4.1.0.tgz",
-      "integrity": "sha512-Wz17xV5O2WFG8fGdMYEBdbiL6TL7YNJSJvSX9V4sXQownewfYmoqlly7wxqLkOUv/57pq6LnnotMiQQrrPjCqQ==",
-      "dev": true,
-      "dependencies": {
-        "eslint": "^6.8.0",
-        "eslint-config-esnext": "^4.1.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/cross-spawn/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/eslint": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
-      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.10.0",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^1.4.3",
-        "eslint-visitor-keys": "^1.1.0",
-        "espree": "^6.1.2",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^7.0.0",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.14",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.3",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "semver": "^6.1.2",
-        "strip-ansi": "^5.2.0",
-        "strip-json-comments": "^3.0.1",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/eslint-utils": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
-      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/espree": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
-      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-jsx": "^5.2.0",
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/file-entry-cache": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-      "dev": true,
-      "dependencies": {
-        "flat-cache": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/flat-cache": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-      "dev": true,
-      "dependencies": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-      "dev": true
-    },
-    "node_modules/eslint-config-node/node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/regexpp": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
-      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.5.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint-config-node/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/eslint-import-resolver-node": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
-      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.6.9",
-        "resolve": "^1.13.1"
-      }
-    },
-    "node_modules/eslint-import-resolver-node/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/eslint-import-resolver-node/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/eslint-loader": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz",
-      "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==",
-      "dev": true,
-      "dependencies": {
-        "find-cache-dir": "^3.3.1",
-        "fs-extra": "^8.1.0",
-        "loader-utils": "^2.0.0",
-        "object-hash": "^2.0.3",
-        "schema-utils": "^2.6.5"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/eslint-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/eslint-loader/node_modules/schema-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.5",
-        "ajv": "^6.12.4",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 8.9.0"
-      }
-    },
-    "node_modules/eslint-module-utils": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
-      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.6.9",
-        "pkg-dir": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/eslint-module-utils/node_modules/p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-plugin-babel": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz",
-      "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==",
-      "dev": true,
-      "dependencies": {
-        "eslint-rule-composer": "^0.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-plugin-es": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
-      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
-      "dev": true,
-      "dependencies": {
-        "eslint-utils": "^2.0.0",
-        "regexpp": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/eslint-plugin-import": {
-      "version": "2.22.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
-      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
-      "dev": true,
-      "dependencies": {
-        "array-includes": "^3.1.1",
-        "array.prototype.flat": "^1.2.3",
-        "contains-path": "^0.1.0",
-        "debug": "^2.6.9",
-        "doctrine": "1.5.0",
-        "eslint-import-resolver-node": "^0.3.4",
-        "eslint-module-utils": "^2.6.0",
-        "has": "^1.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.1",
-        "read-pkg-up": "^2.0.0",
-        "resolve": "^1.17.0",
-        "tsconfig-paths": "^3.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/doctrine": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2",
-        "isarray": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/eslint-plugin-jest": {
-      "version": "24.1.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz",
-      "integrity": "sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/experimental-utils": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint-plugin-node": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
-      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
-      "dev": true,
-      "dependencies": {
-        "eslint-plugin-es": "^3.0.0",
-        "eslint-utils": "^2.0.0",
-        "ignore": "^5.1.1",
-        "minimatch": "^3.0.4",
-        "resolve": "^1.10.1",
-        "semver": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/eslint-plugin-node/node_modules/ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/eslint-plugin-node/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/eslint-rule-composer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
-      "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dev": true,
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-      "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/eslint/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/eslint/node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/espree": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/espree/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esquery": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
-      "dev": true,
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/esquery/node_modules/estraverse": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/eventemitter3": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
-    },
-    "node_modules/events": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
-      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/eventsource": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
-      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
-      "dev": true,
-      "dependencies": {
-        "original": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/exec-sh": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
-      "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
-      "dev": true
-    },
-    "node_modules/execa": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
-      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.0",
-        "get-stream": "^5.0.0",
-        "human-signals": "^1.1.1",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.0",
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/expect": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz",
-      "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "ansi-styles": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/expect/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/expect/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/expect/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/express": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
-      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
-      "dev": true,
-      "dependencies": {
-        "accepts": "~1.3.7",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.19.0",
-        "content-disposition": "0.5.3",
-        "content-type": "~1.0.4",
-        "cookie": "0.4.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "~1.1.2",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.5",
-        "qs": "6.7.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.1.2",
-        "send": "0.17.1",
-        "serve-static": "1.14.1",
-        "setprototypeof": "1.1.1",
-        "statuses": "~1.5.0",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/express/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/express/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/express/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/express/node_modules/path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
-      "dev": true
-    },
-    "node_modules/express/node_modules/qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/express/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/express/node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-      "dev": true
-    },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extend-shallow/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/external-editor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "dev": true,
-      "dependencies": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "dependencies": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true,
-      "engines": [
-        "node >=0.6.0"
-      ]
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true
-    },
-    "node_modules/fast-glob": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
-      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2",
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "node_modules/fastq": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
-      "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
-      "dev": true,
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/faye-websocket": {
-      "version": "0.11.3",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
-      "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
-      "dev": true,
-      "dependencies": {
-        "websocket-driver": ">=0.5.1"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/fb-watchman": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
-      "dev": true,
-      "dependencies": {
-        "bser": "2.1.1"
-      }
-    },
-    "node_modules/figures": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.5"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-      "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
-      "dev": true,
-      "dependencies": {
-        "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/finalhandler": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
-      "dev": true,
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/finalhandler/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/finalhandler/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/find-cache-dir": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
-      "dev": true,
-      "dependencies": {
-        "commondir": "^1.0.1",
-        "make-dir": "^3.0.2",
-        "pkg-dir": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
-      "dev": true,
-      "dependencies": {
-        "semver-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
-      "dependencies": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/flat-cache/node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
-      "dev": true
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
-      "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 0.12"
-      }
-    },
-    "node_modules/forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "dependencies": {
-        "map-cache": "^0.2.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "node_modules/fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
-      "dev": true
-    },
-    "node_modules/get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "dev": true
-    },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dev": true,
-      "dependencies": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/globby/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-      "dev": true
-    },
-    "node_modules/growly": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
-      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/handle-thing": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
-      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
-      "dev": true
-    },
-    "node_modules/har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "dependencies": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values/node_modules/is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values/node_modules/kind-of": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "dev": true,
-      "bin": {
-        "he": "bin/he"
-      }
-    },
-    "node_modules/hex-color-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
-      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
-      "dev": true
-    },
-    "node_modules/hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-      "dev": true
-    },
-    "node_modules/hpack.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
-      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
-      "dev": true,
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "obuf": "^1.0.0",
-        "readable-stream": "^2.0.1",
-        "wbuf": "^1.1.0"
-      }
-    },
-    "node_modules/hsl-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
-      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
-      "dev": true
-    },
-    "node_modules/hsla-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
-      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
-      "dev": true
-    },
-    "node_modules/html-comment-regex": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
-      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
-      "dev": true
-    },
-    "node_modules/html-encoding-sniffer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-      "dev": true,
-      "dependencies": {
-        "whatwg-encoding": "^1.0.5"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/html-entities": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
-      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
-      "dev": true
-    },
-    "node_modules/html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
-    },
-    "node_modules/html-minifier": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
-      "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
-      "dev": true,
-      "dependencies": {
-        "camel-case": "^3.0.0",
-        "clean-css": "^4.2.1",
-        "commander": "^2.19.0",
-        "he": "^1.2.0",
-        "param-case": "^2.1.1",
-        "relateurl": "^0.2.7",
-        "uglify-js": "^3.5.1"
-      },
-      "bin": {
-        "html-minifier": "cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/http-deceiver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
-      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
-      "dev": true
-    },
-    "node_modules/http-errors": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
-      "dev": true,
-      "dependencies": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/http-errors/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/http-errors/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
-    },
-    "node_modules/http-errors/node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-      "dev": true
-    },
-    "node_modules/http-parser-js": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
-      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
-      "dev": true
-    },
-    "node_modules/http-proxy": {
-      "version": "1.18.1",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
-      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
-      "dev": true,
-      "dependencies": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/http-proxy-middleware": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
-      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
-      "dev": true,
-      "dependencies": {
-        "http-proxy": "^1.17.0",
-        "is-glob": "^4.0.0",
-        "lodash": "^4.17.11",
-        "micromatch": "^3.1.10"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "dependencies": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-proxy-middleware/node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      },
-      "engines": {
-        "node": ">=0.8",
-        "npm": ">=1.3.7"
-      }
-    },
-    "node_modules/human-signals": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.12.0"
-      }
-    },
-    "node_modules/husky": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz",
-      "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "chalk": "^4.0.0",
-        "ci-info": "^2.0.0",
-        "compare-versions": "^3.6.0",
-        "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
-        "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
-        "please-upgrade-node": "^3.2.0",
-        "slash": "^3.0.0",
-        "which-pm-runs": "^1.0.0"
-      },
-      "bin": {
-        "husky-run": "bin/run.js",
-        "husky-upgrade": "lib/upgrader/bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/husky/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/husky/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/husky/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/husky/node_modules/cosmiconfig": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-      "dev": true,
-      "dependencies": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/husky/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/husky/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/parse-json": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/husky/node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/icss-utils": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
-      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-      "dev": true,
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      }
-    },
-    "node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/import-fresh": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
-      "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
-      "dev": true,
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/import-local": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
-      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
-      "dev": true,
-      "dependencies": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "bin": {
-        "import-local-fixture": "fixtures/cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/import-local/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/import-local/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/import-local/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/import-local/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/import-local/node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/indexes-of": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
-      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
-      "dev": true
-    },
-    "node_modules/infer-owner": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "node_modules/inquirer": {
-      "version": "7.3.3",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
-      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/inquirer/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/inquirer/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/inquirer/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/inquirer/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/inquirer/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/inquirer/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/inquirer/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/internal-ip": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
-      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
-      "dev": true,
-      "dependencies": {
-        "default-gateway": "^4.2.0",
-        "ipaddr.js": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/interpret": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
-      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/ip": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
-      "dev": true
-    },
-    "node_modules/ip-regex": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
-      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/is-absolute-url": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
-      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-arguments": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
-      "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "node_modules/is-callable": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-ci": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
-      "dependencies": {
-        "ci-info": "^2.0.0"
-      },
-      "bin": {
-        "is-ci": "bin.js"
-      }
-    },
-    "node_modules/is-color-stop": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
-      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
-      "dev": true,
-      "dependencies": {
-        "css-color-names": "^0.0.4",
-        "hex-color-regex": "^1.1.0",
-        "hsl-regex": "^1.0.0",
-        "hsla-regex": "^1.0.0",
-        "rgb-regex": "^1.0.1",
-        "rgba-regex": "^1.0.0"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
-      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3"
-      }
-    },
-    "node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-date-object": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
-      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-directory": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
-      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-docker": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
-      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-path-cwd": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-path-in-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-      "dev": true,
-      "dependencies": {
-        "is-path-inside": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-path-inside": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-      "dev": true,
-      "dependencies": {
-        "path-is-inside": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-potential-custom-element-name": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
-      "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
-      "dev": true
-    },
-    "node_modules/is-regex": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-      "dev": true,
-      "dependencies": {
-        "has-symbols": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-resolvable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
-      "dev": true
-    },
-    "node_modules/is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-string": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
-      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-svg": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
-      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
-      "dev": true,
-      "dependencies": {
-        "html-comment-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-symbol": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
-      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
-      "dev": true,
-      "dependencies": {
-        "has-symbols": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "node_modules/is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-docker": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "node_modules/istanbul-lib-coverage": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.7.5",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.0.0",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
-      "dependencies": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-source-maps": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
-      "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-reports": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
-      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
-      "dev": true,
-      "dependencies": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz",
-      "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==",
-      "dev": true,
-      "dependencies": {
-        "@jest/core": "^26.6.3",
-        "import-local": "^3.0.2",
-        "jest-cli": "^26.6.3"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-changed-files": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz",
-      "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "execa": "^4.0.0",
-        "throat": "^5.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-config": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz",
-      "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.1.0",
-        "@jest/test-sequencer": "^26.6.3",
-        "@jest/types": "^26.6.2",
-        "babel-jest": "^26.6.3",
-        "chalk": "^4.0.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.2.4",
-        "jest-environment-jsdom": "^26.6.2",
-        "jest-environment-node": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-jasmine2": "^26.6.3",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-config/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-config/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-config/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-config/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-diff": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
-      "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0",
-        "diff-sequences": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-diff/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-diff/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-diff/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-diff/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-docblock": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
-      "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
-      "dev": true,
-      "dependencies": {
-        "detect-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-each": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz",
-      "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-each/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-each/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-each/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-each/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-environment-jsdom": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
-      "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jsdom": "^16.4.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-environment-node": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz",
-      "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-get-type": {
-      "version": "26.3.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-      "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-haste-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz",
-      "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "@types/graceful-fs": "^4.1.2",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-regex-util": "^26.0.0",
-        "jest-serializer": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "sane": "^4.0.3",
-        "walker": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      },
-      "optionalDependencies": {
-        "fsevents": "^2.1.2"
-      }
-    },
-    "node_modules/jest-jasmine2": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz",
-      "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/traverse": "^7.1.0",
-        "@jest/environment": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "expect": "^26.6.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2",
-        "throat": "^5.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-leak-detector": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz",
-      "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==",
-      "dev": true,
-      "dependencies": {
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-matcher-utils": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz",
-      "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-message-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
-      "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-mock": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
-      "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jest-raw-loader": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/jest-raw-loader/-/jest-raw-loader-1.0.1.tgz",
-      "integrity": "sha1-zp9W1UZQ8VfEp9FtIkul1hO81iY=",
-      "dev": true
-    },
-    "node_modules/jest-regex-util": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
-      "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-resolve": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
-      "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^26.6.2",
-        "read-pkg-up": "^7.0.1",
-        "resolve": "^1.18.1",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-resolve-dependencies": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz",
-      "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-snapshot": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-resolve/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/parse-json": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/read-pkg": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-      "dev": true,
-      "dependencies": {
-        "@types/normalize-package-data": "^2.4.0",
-        "normalize-package-data": "^2.5.0",
-        "parse-json": "^5.0.0",
-        "type-fest": "^0.6.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/read-pkg-up": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.1.0",
-        "read-pkg": "^5.2.0",
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runner": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz",
-      "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.7.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-docblock": "^26.0.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-leak-detector": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "source-map-support": "^0.5.6",
-        "throat": "^5.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-runner/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runner/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-runner/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-runner/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-runtime": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz",
-      "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/globals": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^0.6.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0",
-        "yargs": "^15.4.1"
-      },
-      "bin": {
-        "jest-runtime": "bin/jest-runtime.js"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-runtime/node_modules/strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-serializer": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz",
-      "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*",
-        "graceful-fs": "^4.2.4"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-snapshot": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz",
-      "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/babel__traverse": "^7.0.4",
-        "@types/prettier": "^2.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^26.6.2",
-        "semver": "^7.3.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-snapshot/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
-      "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "is-ci": "^2.0.0",
-        "micromatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-util/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-util/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-util/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-validate": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz",
-      "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "camelcase": "^6.0.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^26.6.2"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-validate/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-validate/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-validate/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-validate/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-watcher": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz",
-      "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "jest-util": "^26.6.2",
-        "string-length": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-watcher/node_modules/string-length": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
-      "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
-      "dev": true,
-      "dependencies": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest/node_modules/jest-cli": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz",
-      "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/core": "^26.6.3",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "import-local": "^3.0.2",
-        "is-ci": "^2.0.0",
-        "jest-config": "^26.6.3",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "prompts": "^2.0.1",
-        "yargs": "^15.4.1"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
-    },
-    "node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
-    },
-    "node_modules/jsdom": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
-      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
-      "dev": true,
-      "dependencies": {
-        "abab": "^2.0.3",
-        "acorn": "^7.1.1",
-        "acorn-globals": "^6.0.0",
-        "cssom": "^0.4.4",
-        "cssstyle": "^2.2.0",
-        "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.0",
-        "domexception": "^2.0.1",
-        "escodegen": "^1.14.1",
-        "html-encoding-sniffer": "^2.0.1",
-        "is-potential-custom-element-name": "^1.0.0",
-        "nwsapi": "^2.2.0",
-        "parse5": "5.1.1",
-        "request": "^2.88.2",
-        "request-promise-native": "^1.0.8",
-        "saxes": "^5.0.0",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^3.0.1",
-        "w3c-hr-time": "^1.0.2",
-        "w3c-xmlserializer": "^2.0.0",
-        "webidl-conversions": "^6.1.0",
-        "whatwg-encoding": "^1.0.5",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0",
-        "ws": "^7.2.3",
-        "xml-name-validator": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jsdom/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/jsdom/node_modules/tough-cookie": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
-      "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
-      "dev": true,
-      "dependencies": {
-        "ip-regex": "^2.1.0",
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
-    },
-    "node_modules/json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "node_modules/json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "node_modules/json3": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
-      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
-      "dev": true
-    },
-    "node_modules/json5": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "dependencies": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "node_modules/killable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
-      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
-      "dev": true
-    },
-    "node_modules/kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/klona": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
-      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/lines-and-columns": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
-      "dev": true
-    },
-    "node_modules/lint-staged": {
-      "version": "10.5.3",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz",
-      "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "commander": "^6.2.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.2.0",
-        "dedent": "^0.7.0",
-        "enquirer": "^2.3.6",
-        "execa": "^4.1.0",
-        "listr2": "^3.2.2",
-        "log-symbols": "^4.0.0",
-        "micromatch": "^4.0.2",
-        "normalize-path": "^3.0.0",
-        "please-upgrade-node": "^3.2.0",
-        "string-argv": "0.3.1",
-        "stringify-object": "^3.3.0"
-      },
-      "bin": {
-        "lint-staged": "bin/lint-staged.js"
-      }
-    },
-    "node_modules/lint-staged/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lint-staged/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/lint-staged/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/lint-staged/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/lint-staged/node_modules/commander": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/lint-staged/node_modules/cosmiconfig": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-      "dev": true,
-      "dependencies": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/lint-staged/node_modules/parse-json": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lint-staged/node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/listr2": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz",
-      "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "figures": "^3.2.0",
-        "indent-string": "^4.0.0",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rxjs": "^6.6.3",
-        "through": "^2.3.8"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/listr2/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/listr2/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/listr2/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/listr2/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/listr2/node_modules/p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "dependencies": {
-        "aggregate-error": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/load-json-file/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
-      "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/loader-utils": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/loader-utils/node_modules/json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-      "dev": true
-    },
-    "node_modules/lodash.memoize": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
-      "dev": true
-    },
-    "node_modules/lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
-      "dev": true
-    },
-    "node_modules/lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
-      "dev": true
-    },
-    "node_modules/log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/log-symbols/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-symbols/node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/log-symbols/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/log-symbols/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/log-update/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-update/node_modules/astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-update/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/log-update/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/log-update/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-update/node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/loglevel": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
-      "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
-      },
-      "funding": {
-        "type": "tidelift",
-        "url": "https://tidelift.com/funding/github/npm/loglevel"
-      }
-    },
-    "node_modules/lower-case": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
-      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
-      "dev": true
-    },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/makeerror": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
-      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
-      "dev": true,
-      "dependencies": {
-        "tmpl": "1.0.x"
-      }
-    },
-    "node_modules/map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "dependencies": {
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mdi": {
-      "version": "2.2.43",
-      "resolved": "https://registry.npmjs.org/mdi/-/mdi-2.2.43.tgz",
-      "integrity": "sha512-g3m6z4303qieltUM20JL2gdsJZvoVzIzO74qa2XxZ2kg9JPwrPEAgooVhRDHZi1vvRh0gB8Dg+c9XqNdz4jcIg==",
-      "dev": true
-    },
-    "node_modules/mdn-data": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
-      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
-      "dev": true
-    },
-    "node_modules/media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "dev": true,
-      "dependencies": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "node_modules/merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
-      "dev": true
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-      "dev": true,
-      "dependencies": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.0.5"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true,
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.27",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-      "dev": true,
-      "dependencies": {
-        "mime-db": "1.44.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/mini-css-extract-plugin": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz",
-      "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==",
-      "dev": true,
-      "dependencies": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0",
-        "webpack-sources": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/mini-css-extract-plugin/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/mini-css-extract-plugin/node_modules/webpack-sources": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-      "dev": true,
-      "dependencies": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
-    "node_modules/minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-collect": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "dependencies": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mixin-deep/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/multicast-dns": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
-      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
-      "dev": true,
-      "dependencies": {
-        "dns-packet": "^1.3.1",
-        "thunky": "^1.0.2"
-      },
-      "bin": {
-        "multicast-dns": "cli.js"
-      }
-    },
-    "node_modules/multicast-dns-service-types": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
-      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
-      "dev": true
-    },
-    "node_modules/mute-stream": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-      "dev": true
-    },
-    "node_modules/nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
-      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/nanoid": {
-      "version": "3.1.20",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
-      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
-      "dev": true,
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "node_modules/negotiator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "dev": true
-    },
-    "node_modules/nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
-    "node_modules/no-case": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
-      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
-      "dev": true,
-      "dependencies": {
-        "lower-case": "^1.1.1"
-      }
-    },
-    "node_modules/node-forge": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
-      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
-      "dev": true
-    },
-    "node_modules/node-modules-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
-      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/node-notifier": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz",
-      "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "growly": "^1.3.0",
-        "is-wsl": "^2.2.0",
-        "semver": "^7.3.2",
-        "shellwords": "^0.1.1",
-        "uuid": "^8.3.0",
-        "which": "^2.0.2"
-      }
-    },
-    "node_modules/node-notifier/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/node-notifier/node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
-    "node_modules/node-releases": {
-      "version": "1.1.67",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
-      "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
-      "dev": true
-    },
-    "node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/normalize-url": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
-      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
-      "dev": true,
-      "dependencies": {
-        "boolbase": "~1.0.0"
-      }
-    },
-    "node_modules/nwsapi": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
-      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
-      "dev": true
-    },
-    "node_modules/oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "dependencies": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-hash": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
-      "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
-      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
-      "dev": true
-    },
-    "node_modules/object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.getownpropertydescriptors": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz",
-      "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.values": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz",
-      "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1",
-        "has": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
-    },
-    "node_modules/on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "dev": true,
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/opencollective-postinstall": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
-      "dev": true,
-      "bin": {
-        "opencollective-postinstall": "index.js"
-      }
-    },
-    "node_modules/opn": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
-      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
-      "dev": true,
-      "dependencies": {
-        "is-wsl": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/opn/node_modules/is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/original": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
-      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
-      "dev": true,
-      "dependencies": {
-        "url-parse": "^1.4.3"
-      }
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/p-each-series": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
-      "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/p-retry": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
-      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
-      "dev": true,
-      "dependencies": {
-        "retry": "^0.12.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/param-case": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
-      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
-      "dev": true,
-      "dependencies": {
-        "no-case": "^2.2.0"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "dependencies": {
-        "error-ex": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse5": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
-      "dev": true
-    },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
-    },
-    "node_modules/path-type": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
-      "dev": true,
-      "dependencies": {
-        "pify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/path-type/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "node_modules/picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pirates": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
-      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
-      "dev": true,
-      "dependencies": {
-        "node-modules-regexp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/pkg-dir": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
-      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/please-upgrade-node": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
-      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
-      "dev": true,
-      "dependencies": {
-        "semver-compare": "^1.0.0"
-      }
-    },
-    "node_modules/portfinder": {
-      "version": "1.0.28",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
-      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
-      "dev": true,
-      "dependencies": {
-        "async": "^2.6.2",
-        "debug": "^3.1.1",
-        "mkdirp": "^0.5.5"
-      },
-      "engines": {
-        "node": ">= 0.12.0"
-      }
-    },
-    "node_modules/portfinder/node_modules/async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.14"
-      }
-    },
-    "node_modules/portfinder/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz",
-      "integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==",
-      "dev": true,
-      "dependencies": {
-        "colorette": "^1.2.1",
-        "nanoid": "^3.1.20",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-calc": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
-      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.27",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.0.2"
-      }
-    },
-    "node_modules/postcss-calc/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-calc/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-calc/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-colormin": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
-      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "color": "^3.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-colormin/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-colormin/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-colormin/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-colormin/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-convert-values": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
-      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-convert-values/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-convert-values/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-convert-values/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-convert-values/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-discard-comments": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
-      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-discard-comments/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-discard-comments/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-discard-comments/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-discard-duplicates": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
-      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-discard-duplicates/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-discard-duplicates/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-discard-duplicates/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-discard-empty": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
-      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-discard-empty/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-discard-empty/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-discard-empty/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-discard-overridden": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
-      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-discard-overridden/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-discard-overridden/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-discard-overridden/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-merge-longhand": {
-      "version": "4.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
-      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
-      "dev": true,
-      "dependencies": {
-        "css-color-names": "0.0.4",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "stylehacks": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-merge-longhand/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-merge-longhand/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-merge-longhand/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-merge-rules": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
-      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "caniuse-api": "^3.0.0",
-        "cssnano-util-same-parent": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0",
-        "vendors": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-merge-rules/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-merge-rules/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-      "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-      "dev": true,
-      "dependencies": {
-        "dot-prop": "^5.2.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/postcss-merge-rules/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-minify-font-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
-      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-minify-font-values/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-minify-font-values/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-minify-font-values/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-minify-gradients": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
-      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "is-color-stop": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-minify-gradients/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-minify-gradients/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-minify-gradients/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-minify-params": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
-      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
-      "dev": true,
-      "dependencies": {
-        "alphanum-sort": "^1.0.0",
-        "browserslist": "^4.0.0",
-        "cssnano-util-get-arguments": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "uniqs": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-minify-params/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-minify-params/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-minify-params/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-minify-params/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-minify-selectors": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
-      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
-      "dev": true,
-      "dependencies": {
-        "alphanum-sort": "^1.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-minify-selectors/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-minify-selectors/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-      "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-      "dev": true,
-      "dependencies": {
-        "dot-prop": "^5.2.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/postcss-minify-selectors/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-modules-extract-imports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
-      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-      "dev": true,
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      }
-    },
-    "node_modules/postcss-modules-local-by-default": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
-      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
-      "dev": true,
-      "dependencies": {
-        "icss-utils": "^5.0.0",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.1.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      }
-    },
-    "node_modules/postcss-modules-scope": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
-      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
-      "dev": true,
-      "dependencies": {
-        "postcss-selector-parser": "^6.0.4"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      }
-    },
-    "node_modules/postcss-modules-values": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
-      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
-      "dev": true,
-      "dependencies": {
-        "icss-utils": "^5.0.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      }
-    },
-    "node_modules/postcss-normalize-charset": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
-      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-charset/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-charset/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-charset/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-display-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
-      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-display-values/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-display-values/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-display-values/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-positions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
-      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-positions/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-positions/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-positions/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-repeat-style": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
-      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-repeat-style/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-repeat-style/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-repeat-style/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-string": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
-      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-string/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-string/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-string/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-timing-functions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
-      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-timing-functions/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-timing-functions/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-timing-functions/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-unicode": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
-      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-unicode/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-unicode/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-unicode/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-url": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
-      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
-      "dev": true,
-      "dependencies": {
-        "is-absolute-url": "^2.0.0",
-        "normalize-url": "^3.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-url/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-url/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-url/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-normalize-whitespace": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
-      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
-      "dev": true,
-      "dependencies": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-normalize-whitespace/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-whitespace/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-normalize-whitespace/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-ordered-values": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
-      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-ordered-values/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-ordered-values/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-ordered-values/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-reduce-initial": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
-      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "caniuse-api": "^3.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-reduce-initial/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-reduce-initial/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-reduce-initial/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-reduce-transforms": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
-      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
-      "dev": true,
-      "dependencies": {
-        "cssnano-util-get-match": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-reduce-transforms/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-reduce-transforms/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-reduce-transforms/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-selector-parser": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
-      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
-      "dev": true,
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-svgo": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
-      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
-      "dev": true,
-      "dependencies": {
-        "is-svg": "^3.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "svgo": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-svgo/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-svgo/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-svgo/node_modules/postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "node_modules/postcss-svgo/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-unique-selectors": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
-      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
-      "dev": true,
-      "dependencies": {
-        "alphanum-sort": "^1.0.0",
-        "postcss": "^7.0.0",
-        "uniqs": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/postcss-unique-selectors/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-unique-selectors/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/postcss-unique-selectors/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
-      "dev": true
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/prettier": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
-      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
-      "dev": true,
-      "bin": {
-        "prettier": "bin-prettier.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/pretty-format": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-      "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "ansi-regex": "^5.0.0",
-        "ansi-styles": "^4.0.0",
-        "react-is": "^17.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pretty-format/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/pretty-format/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
-    },
-    "node_modules/prompts": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz",
-      "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
-      "dev": true,
-      "dependencies": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/proxy-addr": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
-      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
-      "dev": true,
-      "dependencies": {
-        "forwarded": "~0.1.2",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
-    },
-    "node_modules/psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
-    },
-    "node_modules/pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6.0",
-        "teleport": ">=0.2.0"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
-      "dev": true,
-      "dependencies": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/raw-body/node_modules/bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/raw-loader": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz",
-      "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==",
-      "dev": true,
-      "dependencies": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/raw-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/react-is": {
-      "version": "17.0.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
-      "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==",
-      "dev": true
-    },
-    "node_modules/read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
-      "dev": true,
-      "dependencies": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/readable-stream/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/rechoir": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-      "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
-      "dev": true,
-      "dependencies": {
-        "resolve": "^1.9.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/reduce-flatten": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
-      "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
-    },
-    "node_modules/regenerate-unicode-properties": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
-      "dev": true,
-      "dependencies": {
-        "regenerate": "^1.4.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
-      "dev": true
-    },
-    "node_modules/regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "node_modules/regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regexp.prototype.flags": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/regexpp": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/regexpu-core": {
-      "version": "4.7.1",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
-      "dev": true,
-      "dependencies": {
-        "regenerate": "^1.4.0",
-        "regenerate-unicode-properties": "^8.2.0",
-        "regjsgen": "^0.5.1",
-        "regjsparser": "^0.6.4",
-        "unicode-match-property-ecmascript": "^1.0.4",
-        "unicode-match-property-value-ecmascript": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
-      "dev": true
-    },
-    "node_modules/regjsparser": {
-      "version": "0.6.4",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
-      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
-      "dev": true,
-      "dependencies": {
-        "jsesc": "~0.5.0"
-      },
-      "bin": {
-        "regjsparser": "bin/parser"
-      }
-    },
-    "node_modules/regjsparser/node_modules/jsesc": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      }
-    },
-    "node_modules/relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
-    },
-    "node_modules/repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-      "dev": true,
-      "dependencies": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/request-promise-core": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
-      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.19"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/request-promise-native": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
-      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
-      "dev": true,
-      "dependencies": {
-        "request-promise-core": "1.1.4",
-        "stealthy-require": "^1.1.1",
-        "tough-cookie": "^2.3.3"
-      },
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
-    "node_modules/requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
-    },
-    "node_modules/resolve": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
-      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.1.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "node_modules/resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "dependencies": {
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-cwd/node_modules/resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true,
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rgb-regex": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
-      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
-      "dev": true
-    },
-    "node_modules/rgba-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
-      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
-      "dev": true
-    },
-    "node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/rsvp": {
-      "version": "4.8.5",
-      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
-      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
-      "dev": true,
-      "engines": {
-        "node": "6.* || >= 7.*"
-      }
-    },
-    "node_modules/run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.1.10",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
-      "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
-      "dev": true
-    },
-    "node_modules/rxjs": {
-      "version": "6.6.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
-      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^1.9.0"
-      },
-      "engines": {
-        "npm": ">=2.0.0"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true
-    },
-    "node_modules/safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "dependencies": {
-        "ret": "~0.1.10"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "node_modules/sane": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
-      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
-      "dev": true,
-      "dependencies": {
-        "@cnakazawa/watch": "^1.0.3",
-        "anymatch": "^2.0.0",
-        "capture-exit": "^2.0.0",
-        "exec-sh": "^0.3.2",
-        "execa": "^1.0.0",
-        "fb-watchman": "^2.0.0",
-        "micromatch": "^3.1.4",
-        "minimist": "^1.1.1",
-        "walker": "~1.0.5"
-      },
-      "bin": {
-        "sane": "src/cli.js"
-      },
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/sane/node_modules/anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "dependencies": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "node_modules/sane/node_modules/braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "dependencies": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/braces/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/sane/node_modules/execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.0",
-        "get-stream": "^4.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/sane/node_modules/fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/sane/node_modules/is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/sane/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/sane/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sane/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/sass": {
-      "version": "1.30.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.30.0.tgz",
-      "integrity": "sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw==",
-      "dev": true,
-      "dependencies": {
-        "chokidar": ">=2.0.0 <4.0.0"
-      },
-      "bin": {
-        "sass": "sass.js"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/sass-loader": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.0.tgz",
-      "integrity": "sha512-ZCKAlczLBbFd3aGAhowpYEy69Te3Z68cg8bnHHl6WnSCvnKpbM6pQrz957HWMa8LKVuhnD9uMplmMAHwGQtHeg==",
-      "dev": true,
-      "dependencies": {
-        "klona": "^2.0.4",
-        "loader-utils": "^2.0.0",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.0.0",
-        "semver": "^7.3.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/sass-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/sass-loader/node_modules/semver": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "dev": true
-    },
-    "node_modules/saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dev": true,
-      "dependencies": {
-        "xmlchars": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/schema-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
-      "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.6",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
-      "dev": true
-    },
-    "node_modules/selfsigned": {
-      "version": "1.10.8",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
-      "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
-      "dev": true,
-      "dependencies": {
-        "node-forge": "^0.10.0"
-      }
-    },
-    "node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
-      "dev": true
-    },
-    "node_modules/semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/send": {
-      "version": "0.17.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
-      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "destroy": "~1.0.4",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "~1.7.2",
-        "mime": "1.6.0",
-        "ms": "2.1.1",
-        "on-finished": "~2.3.0",
-        "range-parser": "~1.2.1",
-        "statuses": "~1.5.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/send/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/send/node_modules/debug/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/send/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/send/node_modules/ms": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-      "dev": true
-    },
-    "node_modules/serialize-javascript": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
-      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
-      "dev": true,
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/serve-index": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
-      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
-      "dev": true,
-      "dependencies": {
-        "accepts": "~1.3.4",
-        "batch": "0.6.1",
-        "debug": "2.6.9",
-        "escape-html": "~1.0.3",
-        "http-errors": "~1.6.2",
-        "mime-types": "~2.1.17",
-        "parseurl": "~1.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/serve-index/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/serve-index/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/serve-index/node_modules/http-errors": {
-      "version": "1.6.3",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
-      "dev": true,
-      "dependencies": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.0",
-        "statuses": ">= 1.4.0 < 2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/serve-index/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
-    },
-    "node_modules/serve-index/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/serve-index/node_modules/setprototypeof": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
-    },
-    "node_modules/serve-static": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
-      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
-      "dev": true,
-      "dependencies": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.17.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "node_modules/set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/set-value/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shellwords": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
-      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
-    },
-    "node_modules/simple-is": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
-      "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
-      "dev": true
-    },
-    "node_modules/simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
-      "dev": true,
-      "dependencies": {
-        "is-arrayish": "^0.3.1"
-      }
-    },
-    "node_modules/simple-swizzle/node_modules/is-arrayish": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
-      "dev": true
-    },
-    "node_modules/sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-      "dev": true
-    },
-    "node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "dependencies": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/snapdragon/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sockjs": {
-      "version": "0.3.21",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
-      "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
-      "dev": true,
-      "dependencies": {
-        "faye-websocket": "^0.11.3",
-        "uuid": "^3.4.0",
-        "websocket-driver": "^0.7.4"
-      }
-    },
-    "node_modules/sockjs-client": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz",
-      "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^3.2.6",
-        "eventsource": "^1.0.7",
-        "faye-websocket": "^0.11.3",
-        "inherits": "^2.0.4",
-        "json3": "^3.3.3",
-        "url-parse": "^1.4.7"
-      }
-    },
-    "node_modules/sockjs-client/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
-      "dev": true
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "dependencies": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
-      "dev": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
-      "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
-      "dev": true
-    },
-    "node_modules/spdy": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
-      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.0",
-        "handle-thing": "^2.0.0",
-        "http-deceiver": "^1.2.7",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/spdy-transport": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
-      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.0",
-        "detect-node": "^2.0.4",
-        "hpack.js": "^2.1.6",
-        "obuf": "^1.1.2",
-        "readable-stream": "^3.0.6",
-        "wbuf": "^1.7.3"
-      }
-    },
-    "node_modules/spdy-transport/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dev": true,
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "node_modules/sshpk": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
-      "dependencies": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ssri": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-      "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.1.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true
-    },
-    "node_modules/stack-utils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
-      "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/stack-utils/node_modules/escape-string-regexp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/stealthy-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
-      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/string_decoder/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6.19"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/string-width/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/string-width/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/string.prototype.trimend": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
-      "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "node_modules/string.prototype.trimstart": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
-      "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "node_modules/stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "dev": true,
-      "dependencies": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/stringify-object/node_modules/is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/style-loader": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
-      "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
-      "dev": true,
-      "dependencies": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/style-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/stylehacks": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
-      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
-      "dev": true,
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/stylehacks/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/stylehacks/node_modules/postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/stylehacks/node_modules/postcss-selector-parser": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-      "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-      "dev": true,
-      "dependencies": {
-        "dot-prop": "^5.2.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/stylehacks/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-hyperlinks": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
-      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/svgo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
-      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.1",
-        "coa": "^2.0.2",
-        "css-select": "^2.0.0",
-        "css-select-base-adapter": "^0.1.1",
-        "css-tree": "1.0.0-alpha.37",
-        "csso": "^4.0.2",
-        "js-yaml": "^3.13.1",
-        "mkdirp": "~0.5.1",
-        "object.values": "^1.1.0",
-        "sax": "~1.2.4",
-        "stable": "^0.1.8",
-        "unquote": "~1.1.1",
-        "util.promisify": "~1.0.0"
-      },
-      "bin": {
-        "svgo": "bin/svgo"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-      "dev": true
-    },
-    "node_modules/table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/table-layout": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
-      "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
-      "dev": true,
-      "dependencies": {
-        "array-back": "^4.0.1",
-        "deep-extend": "~0.6.0",
-        "typical": "^5.2.0",
-        "wordwrapjs": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/tapable": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
-      "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tar": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
-      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
-      "dev": true,
-      "dependencies": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/tar/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terminal-link": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.2.1",
-        "supports-hyperlinks": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/terser": {
-      "version": "5.5.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz",
-      "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==",
-      "dev": true,
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
-      "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
-      "dev": true,
-      "dependencies": {
-        "jest-worker": "^26.6.1",
-        "p-limit": "^3.0.2",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
-        "source-map": "^0.6.1",
-        "terser": "^5.3.8"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/terser/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "dependencies": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "node_modules/throat": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
-      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
-      "dev": true
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "node_modules/thunky": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
-      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
-      "dev": true
-    },
-    "node_modules/timsort": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
-      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
-      "dev": true
-    },
-    "node_modules/tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
-      "dependencies": {
-        "os-tmpdir": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/tmpl": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
-      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
-      "dev": true
-    },
-    "node_modules/to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-object-path/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "dev": true,
-      "dependencies": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
-      "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
-      "dev": true,
-      "dependencies": {
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/tsconfig-paths": {
-      "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
-      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
-      "dev": true,
-      "dependencies": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "node_modules/tsconfig-paths/node_modules/json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/tsutils": {
-      "version": "3.17.1",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
-      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^1.8.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "^5.0.1"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "dev": true,
-      "dependencies": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "dependencies": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "node_modules/typical": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
-      "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/uglify-js": {
-      "version": "3.12.2",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz",
-      "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg==",
-      "dev": true,
-      "bin": {
-        "uglifyjs": "bin/uglifyjs"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/unicode-canonical-property-names-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
-      "dev": true,
-      "dependencies": {
-        "unicode-canonical-property-names-ecmascript": "^1.0.4",
-        "unicode-property-aliases-ecmascript": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-value-ecmascript": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-property-aliases-ecmascript": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/uniq": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
-      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
-      "dev": true
-    },
-    "node_modules/uniqs": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
-      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
-      "dev": true
-    },
-    "node_modules/unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-      "dev": true,
-      "dependencies": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "node_modules/unique-slug": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/unquote": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
-      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
-      "dev": true
-    },
-    "node_modules/unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "dependencies": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-      "dev": true,
-      "dependencies": {
-        "get-value": "^2.0.3",
-        "has-values": "^0.1.4",
-        "isobject": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-      "dev": true,
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-values": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
-    },
-    "node_modules/upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
-      "dev": true
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
-      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
-      "dev": true,
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "node_modules/url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "dependencies": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
-    },
-    "node_modules/url-loader": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
-      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
-      "dev": true,
-      "dependencies": {
-        "loader-utils": "^2.0.0",
-        "mime-types": "^2.1.27",
-        "schema-utils": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/url-loader/node_modules/loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/url-parse": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
-      "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
-      "dev": true,
-      "dependencies": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "node_modules/url/node_modules/punycode": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-      "dev": true
-    },
-    "node_modules/use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "node_modules/util.promisify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
-      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
-      "dev": true,
-      "dependencies": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.2",
-        "has-symbols": "^1.0.1",
-        "object.getownpropertydescriptors": "^2.1.0"
-      }
-    },
-    "node_modules/util.promisify/node_modules/es-abstract": {
-      "version": "1.17.7",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-      "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-      "dev": true,
-      "dependencies": {
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1",
-        "is-callable": "^1.2.2",
-        "is-regex": "^1.1.1",
-        "object-inspect": "^1.8.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.1",
-        "string.prototype.trimend": "^1.0.1",
-        "string.prototype.trimstart": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "dev": true,
-      "bin": {
-        "uuid": "bin/uuid"
-      }
-    },
-    "node_modules/v8-compile-cache": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
-      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
-      "dev": true
-    },
-    "node_modules/v8-to-istanbul": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz",
-      "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0",
-        "source-map": "^0.7.3"
-      },
-      "engines": {
-        "node": ">=10.10.0"
-      }
-    },
-    "node_modules/v8-to-istanbul/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/vendors": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
-      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
-      "dev": true
-    },
-    "node_modules/verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "node_modules/w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "dev": true,
-      "dependencies": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "node_modules/w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "dev": true,
-      "dependencies": {
-        "xml-name-validator": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/walker": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
-      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
-      "dev": true,
-      "dependencies": {
-        "makeerror": "1.0.x"
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz",
-      "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==",
-      "dev": true,
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
-      "dev": true,
-      "dependencies": {
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=10.4"
-      }
-    },
-    "node_modules/webpack": {
-      "version": "5.10.2",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.10.2.tgz",
-      "integrity": "sha512-KpYTJerfb2KGxcOJNA1SMWXAf8/dxCDaQOhPIrfoV5rYceqet7OY/h3941/kuapx0noMcpTiVoNN3EHXsTYlsg==",
-      "dev": true,
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.45",
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-module-context": "1.9.1",
-        "@webassemblyjs/wasm-edit": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1",
-        "acorn": "^8.0.4",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.3.1",
-        "eslint-scope": "^5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.1.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "pkg-dir": "^5.0.0",
-        "schema-utils": "^3.0.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.0.3",
-        "watchpack": "^2.0.0",
-        "webpack-sources": "^2.1.1"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack-cli": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz",
-      "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==",
-      "dev": true,
-      "dependencies": {
-        "@webpack-cli/info": "^1.1.0",
-        "@webpack-cli/serve": "^1.1.0",
-        "colorette": "^1.2.1",
-        "command-line-usage": "^6.1.0",
-        "commander": "^6.2.0",
-        "enquirer": "^2.3.6",
-        "execa": "^4.1.0",
-        "import-local": "^3.0.2",
-        "interpret": "^2.2.0",
-        "leven": "^3.1.0",
-        "rechoir": "^0.7.0",
-        "v8-compile-cache": "^2.2.0",
-        "webpack-merge": "^4.2.2"
-      },
-      "bin": {
-        "webpack-cli": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack-cli/node_modules/commander": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/webpack-dev-middleware": {
-      "version": "3.7.3",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
-      "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
-      "dev": true,
-      "dependencies": {
-        "memory-fs": "^0.4.1",
-        "mime": "^2.4.4",
-        "mkdirp": "^0.5.1",
-        "range-parser": "^1.2.1",
-        "webpack-log": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 6"
-      },
-      "peerDependencies": {
-        "webpack": "^4.0.0 || ^5.0.0"
-      }
-    },
-    "node_modules/webpack-dev-middleware/node_modules/mime": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
-      "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
-      "dev": true,
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/webpack-dev-server": {
-      "version": "3.11.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
-      "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-html": "0.0.7",
-        "bonjour": "^3.5.0",
-        "chokidar": "^2.1.8",
-        "compression": "^1.7.4",
-        "connect-history-api-fallback": "^1.6.0",
-        "debug": "^4.1.1",
-        "del": "^4.1.1",
-        "express": "^4.17.1",
-        "html-entities": "^1.3.1",
-        "http-proxy-middleware": "0.19.1",
-        "import-local": "^2.0.0",
-        "internal-ip": "^4.3.0",
-        "ip": "^1.1.5",
-        "is-absolute-url": "^3.0.3",
-        "killable": "^1.0.1",
-        "loglevel": "^1.6.8",
-        "opn": "^5.5.0",
-        "p-retry": "^3.0.1",
-        "portfinder": "^1.0.26",
-        "schema-utils": "^1.0.0",
-        "selfsigned": "^1.10.8",
-        "semver": "^6.3.0",
-        "serve-index": "^1.9.1",
-        "sockjs": "^0.3.21",
-        "sockjs-client": "^1.5.0",
-        "spdy": "^4.0.2",
-        "strip-ansi": "^3.0.1",
-        "supports-color": "^6.1.0",
-        "url": "^0.11.0",
-        "webpack-dev-middleware": "^3.7.2",
-        "webpack-log": "^2.0.0",
-        "ws": "^6.2.1",
-        "yargs": "^13.3.2"
-      },
-      "bin": {
-        "webpack-dev-server": "bin/webpack-dev-server.js"
-      },
-      "engines": {
-        "node": ">= 6.11.5"
-      },
-      "peerDependencies": {
-        "webpack": "^4.0.0 || ^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "dependencies": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "dependencies": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/chokidar": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-      "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.",
-      "dev": true,
-      "dependencies": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
-      },
-      "optionalDependencies": {
-        "fsevents": "^1.2.7"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/fsevents": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-      "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "dependencies": {
-        "bindings": "^1.5.0",
-        "nan": "^2.12.1"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/import-local": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
-      "dev": true,
-      "dependencies": {
-        "pkg-dir": "^3.0.0",
-        "resolve-cwd": "^2.0.0"
-      },
-      "bin": {
-        "import-local-fixture": "fixtures/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/is-absolute-url": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-      "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
-      "dependencies": {
-        "binary-extensions": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/pkg-dir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-      "dev": true,
-      "dependencies": {
-        "resolve-from": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/schema-utils": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.1.0",
-        "ajv-errors": "^1.0.0",
-        "ajv-keywords": "^3.1.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/ws": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
-      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
-      "dev": true,
-      "dependencies": {
-        "async-limiter": "~1.0.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-      "dev": true,
-      "dependencies": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
-    },
-    "node_modules/webpack-log": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
-      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
-      "dev": true,
-      "dependencies": {
-        "ansi-colors": "^3.0.0",
-        "uuid": "^3.3.2"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/webpack-log/node_modules/ansi-colors": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
-      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-merge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
-      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.15"
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
-      "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
-      "dev": true,
-      "dependencies": {
-        "source-list-map": "^2.0.1",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/websocket-driver": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
-      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
-      "dev": true,
-      "dependencies": {
-        "http-parser-js": ">=0.5.1",
-        "safe-buffer": ">=5.1.0",
-        "websocket-extensions": ">=0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/websocket-extensions": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
-      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "dev": true,
-      "dependencies": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "node_modules/whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
-      "dev": true
-    },
-    "node_modules/whatwg-url": {
-      "version": "8.4.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz",
-      "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==",
-      "dev": true,
-      "dependencies": {
-        "lodash.sortby": "^4.7.0",
-        "tr46": "^2.0.2",
-        "webidl-conversions": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "node_modules/which-pm-runs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
-      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
-      "dev": true
-    },
-    "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wordwrapjs": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
-      "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
-      "dev": true,
-      "dependencies": {
-        "reduce-flatten": "^2.0.0",
-        "typical": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/wrap-ansi/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "node_modules/write": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
-      "dev": true,
-      "dependencies": {
-        "mkdirp": "^0.5.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "node_modules/ws": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz",
-      "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.3.0"
-      }
-    },
-    "node_modules/xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
-      "dev": true
-    },
-    "node_modules/xmlchars": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
-      "dev": true
-    },
-    "node_modules/y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
-      "dev": true
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "node_modules/yaml": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
-      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/yargs": {
-      "version": "15.4.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
-      "dev": true,
-      "dependencies": {
-        "cliui": "^6.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^4.1.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^4.2.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^18.1.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "18.1.3",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs-parser/node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/yargs/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    }
-  },
-  "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-      "dev": true,
-      "requires": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "@babel/compat-data": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz",
-      "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==",
-      "dev": true
-    },
-    "@babel/core": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz",
-      "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.10",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helpers": "^7.12.5",
-        "@babel/parser": "^7.12.10",
-        "@babel/template": "^7.12.7",
-        "@babel/traverse": "^7.12.10",
-        "@babel/types": "^7.12.10",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.1",
-        "json5": "^2.1.2",
-        "lodash": "^4.17.19",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/generator": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz",
-      "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.10",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-annotate-as-pure": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz",
-      "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
-      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-compilation-targets": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz",
-      "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.12.5",
-        "@babel/helper-validator-option": "^7.12.1",
-        "browserslist": "^4.14.5",
-        "semver": "^5.5.0"
-      }
-    },
-    "@babel/helper-create-class-features-plugin": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
-      "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4"
-      }
-    },
-    "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz",
-      "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "regexpu-core": "^4.7.1"
-      }
-    },
-    "@babel/helper-define-map": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
-      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/types": "^7.10.5",
-        "lodash": "^4.17.19"
-      }
-    },
-    "@babel/helper-explode-assignable-expression": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
-      "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "@babel/helper-function-name": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
-      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-get-function-arity": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-get-function-arity": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz",
-      "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
-      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
-      "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.7"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
-      "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
-      "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-simple-access": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1",
-        "lodash": "^4.17.19"
-      }
-    },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz",
-      "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.10"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-      "dev": true
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-wrap-function": "^7.10.4",
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
-      "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.12.5",
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
-      "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
-      "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.1"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.11.0"
-      }
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-      "dev": true
-    },
-    "@babel/helper-validator-option": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
-      "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
-      "dev": true
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.12.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
-      "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helpers": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
-      "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.5",
-        "@babel/types": "^7.12.5"
-      }
-    },
-    "@babel/highlight": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      }
-    },
-    "@babel/parser": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz",
-      "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==",
-      "dev": true
-    },
-    "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
-      "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-class-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
-      "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
-      "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
-      "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-json-strings": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
-      "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-json-strings": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
-      "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
-      "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz",
-      "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
-      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-transform-parameters": "^7.12.1"
-      }
-    },
-    "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
-      "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz",
-      "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-private-methods": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
-      "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
-      "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-bigint": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-class-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
-      "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
-      }
-    },
-    "@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-top-level-await": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
-      "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-arrow-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
-      "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1"
-      }
-    },
-    "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
-      "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-block-scoping": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
-      "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-classes": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
-      "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-define-map": "^7.10.4",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4",
-        "globals": "^11.1.0"
-      }
-    },
-    "@babel/plugin-transform-computed-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
-      "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-destructuring": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
-      "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-dotall-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
-      "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
-      "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
-      "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-for-of": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
-      "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-function-name": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
-      "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
-      "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
-      "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-modules-amd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
-      "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
-      "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-simple-access": "^7.12.1",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
-      "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-hoist-variables": "^7.10.4",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-umd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
-      "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
-      "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1"
-      }
-    },
-    "@babel/plugin-transform-new-target": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
-      "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-object-super": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
-      "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1"
-      }
-    },
-    "@babel/plugin-transform-parameters": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
-      "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-property-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
-      "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-regenerator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
-      "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
-      "dev": true,
-      "requires": {
-        "regenerator-transform": "^0.14.2"
-      }
-    },
-    "@babel/plugin-transform-reserved-words": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
-      "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
-      "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
-      "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
-      }
-    },
-    "@babel/plugin-transform-sticky-regex": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz",
-      "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-template-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
-      "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz",
-      "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-unicode-escapes": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
-      "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-transform-unicode-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
-      "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/preset-env": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.10.tgz",
-      "integrity": "sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.12.7",
-        "@babel/helper-compilation-targets": "^7.12.5",
-        "@babel/helper-module-imports": "^7.12.5",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-option": "^7.12.1",
-        "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
-        "@babel/plugin-proposal-class-properties": "^7.12.1",
-        "@babel/plugin-proposal-dynamic-import": "^7.12.1",
-        "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
-        "@babel/plugin-proposal-json-strings": "^7.12.1",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
-        "@babel/plugin-proposal-numeric-separator": "^7.12.7",
-        "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
-        "@babel/plugin-proposal-optional-chaining": "^7.12.7",
-        "@babel/plugin-proposal-private-methods": "^7.12.1",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0",
-        "@babel/plugin-syntax-class-properties": "^7.12.1",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.0",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
-        "@babel/plugin-syntax-top-level-await": "^7.12.1",
-        "@babel/plugin-transform-arrow-functions": "^7.12.1",
-        "@babel/plugin-transform-async-to-generator": "^7.12.1",
-        "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
-        "@babel/plugin-transform-block-scoping": "^7.12.1",
-        "@babel/plugin-transform-classes": "^7.12.1",
-        "@babel/plugin-transform-computed-properties": "^7.12.1",
-        "@babel/plugin-transform-destructuring": "^7.12.1",
-        "@babel/plugin-transform-dotall-regex": "^7.12.1",
-        "@babel/plugin-transform-duplicate-keys": "^7.12.1",
-        "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
-        "@babel/plugin-transform-for-of": "^7.12.1",
-        "@babel/plugin-transform-function-name": "^7.12.1",
-        "@babel/plugin-transform-literals": "^7.12.1",
-        "@babel/plugin-transform-member-expression-literals": "^7.12.1",
-        "@babel/plugin-transform-modules-amd": "^7.12.1",
-        "@babel/plugin-transform-modules-commonjs": "^7.12.1",
-        "@babel/plugin-transform-modules-systemjs": "^7.12.1",
-        "@babel/plugin-transform-modules-umd": "^7.12.1",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
-        "@babel/plugin-transform-new-target": "^7.12.1",
-        "@babel/plugin-transform-object-super": "^7.12.1",
-        "@babel/plugin-transform-parameters": "^7.12.1",
-        "@babel/plugin-transform-property-literals": "^7.12.1",
-        "@babel/plugin-transform-regenerator": "^7.12.1",
-        "@babel/plugin-transform-reserved-words": "^7.12.1",
-        "@babel/plugin-transform-shorthand-properties": "^7.12.1",
-        "@babel/plugin-transform-spread": "^7.12.1",
-        "@babel/plugin-transform-sticky-regex": "^7.12.7",
-        "@babel/plugin-transform-template-literals": "^7.12.1",
-        "@babel/plugin-transform-typeof-symbol": "^7.12.10",
-        "@babel/plugin-transform-unicode-escapes": "^7.12.1",
-        "@babel/plugin-transform-unicode-regex": "^7.12.1",
-        "@babel/preset-modules": "^0.1.3",
-        "@babel/types": "^7.12.10",
-        "core-js-compat": "^3.8.0",
-        "semver": "^5.5.0"
-      }
-    },
-    "@babel/preset-modules": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
-      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
-      }
-    },
-    "@babel/runtime": {
-      "version": "7.12.5",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
-      "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
-      "dev": true,
-      "requires": {
-        "regenerator-runtime": "^0.13.4"
-      }
-    },
-    "@babel/template": {
-      "version": "7.12.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
-      "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/parser": "^7.12.7",
-        "@babel/types": "^7.12.7"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz",
-      "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.10",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/parser": "^7.12.10",
-        "@babel/types": "^7.12.10",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.19"
-      }
-    },
-    "@babel/types": {
-      "version": "7.12.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz",
-      "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "lodash": "^4.17.19",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
-    "@bcoe/v8-coverage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-      "dev": true
-    },
-    "@cnakazawa/watch": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
-      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
-      "dev": true,
-      "requires": {
-        "exec-sh": "^0.3.2",
-        "minimist": "^1.2.0"
-      }
-    },
-    "@eslint/eslintrc": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
-      "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      },
-      "dependencies": {
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        }
-      }
-    },
-    "@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        }
-      }
-    },
-    "@istanbuljs/schema": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
-      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
-      "dev": true
-    },
-    "@jest/console": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz",
-      "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "@jest/core": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz",
-      "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/reporters": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-changed-files": "^26.6.2",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-resolve-dependencies": "^26.6.3",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "jest-watcher": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "p-each-series": "^2.1.0",
-        "rimraf": "^3.0.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "@jest/environment": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
-      "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
-      "dev": true,
-      "requires": {
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2"
-      }
-    },
-    "@jest/fake-timers": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
-      "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@sinonjs/fake-timers": "^6.0.1",
-        "@types/node": "*",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
-      }
-    },
-    "@jest/globals": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz",
-      "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "expect": "^26.6.2"
-      }
-    },
-    "@jest/reporters": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz",
-      "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==",
-      "dev": true,
-      "requires": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.2.4",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.0.2",
-        "jest-haste-map": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "node-notifier": "^8.0.0",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.0",
-        "string-length": "^4.0.1",
-        "terminal-link": "^2.0.0",
-        "v8-to-istanbul": "^7.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "string-length": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
-          "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
-          "dev": true,
-          "requires": {
-            "char-regex": "^1.0.2",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "@jest/source-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz",
-      "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.4",
-        "source-map": "^0.6.0"
-      }
-    },
-    "@jest/test-result": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz",
-      "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      }
-    },
-    "@jest/test-sequencer": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz",
-      "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3"
-      }
-    },
-    "@jest/transform": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz",
-      "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/types": "^26.6.2",
-        "babel-plugin-istanbul": "^6.0.0",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^1.4.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-util": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pirates": "^4.0.1",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.1",
-        "write-file-atomic": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "@jest/types": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-      "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
-      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.3",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
-      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.3",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@npmcli/move-file": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
-      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^1.0.4"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        }
-      }
-    },
-    "@sinonjs/commons": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
-      "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
-      "dev": true,
-      "requires": {
-        "type-detect": "4.0.8"
-      }
-    },
-    "@sinonjs/fake-timers": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
-      "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
-      "dev": true,
-      "requires": {
-        "@sinonjs/commons": "^1.7.0"
-      }
-    },
-    "@types/anymatch": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
-      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
-      "dev": true
-    },
-    "@types/babel__core": {
-      "version": "7.1.12",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz",
-      "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==",
-      "dev": true,
-      "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "@types/babel__generator": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
-      "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__template": {
-      "version": "7.4.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz",
-      "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==",
-      "dev": true,
-      "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__traverse": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz",
-      "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.3.0"
-      }
-    },
-    "@types/eslint": {
-      "version": "7.2.6",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
-      "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==",
-      "dev": true,
-      "requires": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "@types/eslint-scope": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
-      "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
-      "dev": true,
-      "requires": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "@types/estree": {
-      "version": "0.0.45",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
-      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
-      "dev": true
-    },
-    "@types/glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
-      "dev": true,
-      "requires": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/graceful-fs": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",
-      "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/istanbul-lib-coverage": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
-      "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
-      "dev": true
-    },
-    "@types/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "*"
-      }
-    },
-    "@types/istanbul-reports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
-      "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "@types/jest": {
-      "version": "26.0.19",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz",
-      "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==",
-      "dev": true,
-      "requires": {
-        "jest-diff": "^26.0.0",
-        "pretty-format": "^26.0.0"
-      }
-    },
-    "@types/json-schema": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
-      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
-      "dev": true
-    },
-    "@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
-    },
-    "@types/minimatch": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
-      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
-      "dev": true
-    },
-    "@types/node": {
-      "version": "14.14.13",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.13.tgz",
-      "integrity": "sha512-vbxr0VZ8exFMMAjCW8rJwaya0dMCDyYW2ZRdTyjtrCvJoENMpdUHOT/eTzvgyA5ZnqRZ/sI0NwqAxNHKYokLJQ==",
-      "dev": true
-    },
-    "@types/normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
-      "dev": true
-    },
-    "@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
-      "dev": true
-    },
-    "@types/prettier": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz",
-      "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==",
-      "dev": true
-    },
-    "@types/q": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
-      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
-      "dev": true
-    },
-    "@types/source-list-map": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
-      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
-      "dev": true
-    },
-    "@types/stack-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
-      "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
-      "dev": true
-    },
-    "@types/tapable": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz",
-      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
-      "dev": true
-    },
-    "@types/uglify-js": {
-      "version": "3.11.1",
-      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz",
-      "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.6.1"
-      }
-    },
-    "@types/webpack": {
-      "version": "4.41.25",
-      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz",
-      "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==",
-      "dev": true,
-      "requires": {
-        "@types/anymatch": "*",
-        "@types/node": "*",
-        "@types/tapable": "*",
-        "@types/uglify-js": "*",
-        "@types/webpack-sources": "*",
-        "source-map": "^0.6.0"
-      }
-    },
-    "@types/webpack-sources": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz",
-      "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "@types/source-list-map": "*",
-        "source-map": "^0.7.3"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        }
-      }
-    },
-    "@types/yargs": {
-      "version": "15.0.12",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz",
-      "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==",
-      "dev": true,
-      "requires": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "@types/yargs-parser": {
-      "version": "15.0.0",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
-      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
-      "dev": true
-    },
-    "@typescript-eslint/experimental-utils": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz",
-      "integrity": "sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw==",
-      "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.10.0",
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/typescript-estree": "4.10.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^2.0.0"
-      }
-    },
-    "@typescript-eslint/scope-manager": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz",
-      "integrity": "sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/visitor-keys": "4.10.0"
-      }
-    },
-    "@typescript-eslint/types": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.10.0.tgz",
-      "integrity": "sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g==",
-      "dev": true
-    },
-    "@typescript-eslint/typescript-estree": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz",
-      "integrity": "sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.10.0",
-        "@typescript-eslint/visitor-keys": "4.10.0",
-        "debug": "^4.1.1",
-        "globby": "^11.0.1",
-        "is-glob": "^4.0.1",
-        "lodash": "^4.17.15",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
-      },
-      "dependencies": {
-        "array-union": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-          "dev": true
-        },
-        "globby": {
-          "version": "11.0.1",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
-          "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
-          "dev": true,
-          "requires": {
-            "array-union": "^2.1.0",
-            "dir-glob": "^3.0.1",
-            "fast-glob": "^3.1.1",
-            "ignore": "^5.1.4",
-            "merge2": "^1.3.0",
-            "slash": "^3.0.0"
-          }
-        },
-        "ignore": {
-          "version": "5.1.8",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "@typescript-eslint/visitor-keys": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz",
-      "integrity": "sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.10.0",
-        "eslint-visitor-keys": "^2.0.0"
-      }
-    },
-    "@webassemblyjs/ast": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz",
-      "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/helper-module-context": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/wast-parser": "1.9.1"
-      }
-    },
-    "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz",
-      "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-api-error": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz",
-      "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-buffer": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz",
-      "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-code-frame": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz",
-      "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/wast-printer": "1.9.1"
-      }
-    },
-    "@webassemblyjs/helper-fsm": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz",
-      "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-module-context": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz",
-      "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1"
-      }
-    },
-    "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz",
-      "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz",
-      "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1"
-      }
-    },
-    "@webassemblyjs/ieee754": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz",
-      "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==",
-      "dev": true,
-      "requires": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "@webassemblyjs/leb128": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz",
-      "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==",
-      "dev": true,
-      "requires": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/utf8": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz",
-      "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg==",
-      "dev": true
-    },
-    "@webassemblyjs/wasm-edit": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz",
-      "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/helper-wasm-section": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1",
-        "@webassemblyjs/wasm-opt": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1",
-        "@webassemblyjs/wast-printer": "1.9.1"
-      }
-    },
-    "@webassemblyjs/wasm-gen": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz",
-      "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/ieee754": "1.9.1",
-        "@webassemblyjs/leb128": "1.9.1",
-        "@webassemblyjs/utf8": "1.9.1"
-      }
-    },
-    "@webassemblyjs/wasm-opt": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz",
-      "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-buffer": "1.9.1",
-        "@webassemblyjs/wasm-gen": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1"
-      }
-    },
-    "@webassemblyjs/wasm-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz",
-      "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-api-error": "1.9.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
-        "@webassemblyjs/ieee754": "1.9.1",
-        "@webassemblyjs/leb128": "1.9.1",
-        "@webassemblyjs/utf8": "1.9.1"
-      }
-    },
-    "@webassemblyjs/wast-parser": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz",
-      "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.1",
-        "@webassemblyjs/helper-api-error": "1.9.1",
-        "@webassemblyjs/helper-code-frame": "1.9.1",
-        "@webassemblyjs/helper-fsm": "1.9.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz",
-      "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/wast-parser": "1.9.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webpack-cli/info": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz",
-      "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==",
-      "dev": true,
-      "requires": {
-        "envinfo": "^7.7.3"
-      }
-    },
-    "@webpack-cli/serve": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz",
-      "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==",
-      "dev": true
-    },
-    "@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "dev": true
-    },
-    "@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "dev": true
-    },
-    "abab": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
-      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
-      "dev": true
-    },
-    "accepts": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
-      "dev": true,
-      "requires": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
-      }
-    },
-    "acorn": {
-      "version": "8.0.4",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
-      "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
-      "dev": true
-    },
-    "acorn-globals": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.1.1",
-        "acorn-walk": "^7.1.1"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        }
-      }
-    },
-    "acorn-jsx": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-      "dev": true
-    },
-    "acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-      "dev": true
-    },
-    "aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
-      "requires": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      }
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ajv-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
-      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true,
-      "requires": {}
-    },
-    "ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "dev": true
-    },
-    "alphanum-sort": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
-      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
-      "dev": true
-    },
-    "angular": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.2.tgz",
-      "integrity": "sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw==",
-      "dev": true
-    },
-    "angular-animate": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.2.tgz",
-      "integrity": "sha512-Jbr9+grNMs9Kj57xuBU3Ju3NOPAjS1+g2UAwwDv7su1lt0/PLDy+9zEwDiu8C8xJceoTbmBNKiWGPJGBdCQLlA==",
-      "dev": true
-    },
-    "angular-aria": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.8.2.tgz",
-      "integrity": "sha512-xWT1Lm+Xug2GM6nGNMioBP4hXt3sj2eGaExa4cVCZUYSVWezgyuD1RiLgzJzwTkBGYplHQUzQaz3yDY8jVI6yQ==",
-      "dev": true
-    },
-    "angular-material": {
-      "version": "1.1.26",
-      "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.26.tgz",
-      "integrity": "sha512-DBLsoOP1D1E14EQsECZYabt3Jh1PpvsG8k1aZgaP/Ml57n4stpClzLhCsuTNbtB/pqq9CL8XtpCfB6fhVRWqIQ==",
-      "dev": true
-    },
-    "angular-messages": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.8.2.tgz",
-      "integrity": "sha512-M1qNh/30cLJi4yJJ+3YB8saPonRcavz5Dquqz0T/aUySKJhIkUoeCkmF+BcLH4SJ5PBp04yy4CZUUeNRVi7jZA==",
-      "dev": true
-    },
-    "angular-mocks": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.8.2.tgz",
-      "integrity": "sha512-I5L3P0l21HPdVsP4A4qWmENt4ePjjbkDFdAzOaM7QiibFySbt14DptPbt2IjeG4vFBr4vSLbhIz8Fk03DISl8Q==",
-      "dev": true
-    },
-    "angular-sortable-view": {
-      "version": "0.0.17",
-      "resolved": "https://registry.npmjs.org/angular-sortable-view/-/angular-sortable-view-0.0.17.tgz",
-      "integrity": "sha512-2WkhM0Lt/wyMyrX/+7ve9ejSegBd7A4eRBNHEIJz8XMBIOjt+3oM1WpcAm+qNThkmNmmQaDeaYv0TQZw/WDMBw==",
-      "dev": true
-    },
-    "angularjs-jest": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/angularjs-jest/-/angularjs-jest-0.1.4.tgz",
-      "integrity": "sha512-/RqIx8kArD+0HQhxuQAW8Yt7H8fte9QLz/OmzAhpWOkc3BDkPgRtl6ULnZY/w8PSMSLCNoa6lbHPHEYcGrucWg==",
-      "dev": true,
-      "requires": {
-        "html-minifier": ">=3.0.0"
-      }
-    },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
-      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.11.0"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.11.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
-          "dev": true
-        }
-      }
-    },
-    "ansi-html": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
-      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-back": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
-      "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
-      "dev": true
-    },
-    "array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
-      "dev": true
-    },
-    "array-includes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz",
-      "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1",
-        "get-intrinsic": "^1.0.1",
-        "is-string": "^1.0.5"
-      }
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "array.prototype.flat": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
-      "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      }
-    },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "dev": true
-    },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
-    },
-    "async-limiter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
-      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
-      "dev": true
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
-    },
-    "aws4": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-      "dev": true
-    },
-    "babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "babel-jest": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz",
-      "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==",
-      "dev": true,
-      "requires": {
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/babel__core": "^7.1.7",
-        "babel-plugin-istanbul": "^6.0.0",
-        "babel-preset-jest": "^26.6.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "babel-loader": {
-      "version": "8.2.2",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
-      "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
-      "dev": true,
-      "requires": {
-        "find-cache-dir": "^3.3.1",
-        "loader-utils": "^1.4.0",
-        "make-dir": "^3.1.0",
-        "schema-utils": "^2.6.5"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-          "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.5",
-            "ajv": "^6.12.4",
-            "ajv-keywords": "^3.5.2"
-          }
-        }
-      }
-    },
-    "babel-plugin-angularjs-annotate": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
-      "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/types": "^7.2.0",
-        "simple-is": "~0.2.0"
-      }
-    },
-    "babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "dev": true,
-      "requires": {
-        "object.assign": "^4.1.0"
-      }
-    },
-    "babel-plugin-istanbul": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
-      "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@istanbuljs/load-nyc-config": "^1.0.0",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-instrument": "^4.0.0",
-        "test-exclude": "^6.0.0"
-      }
-    },
-    "babel-plugin-jest-hoist": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz",
-      "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.3.3",
-        "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.0.0",
-        "@types/babel__traverse": "^7.0.6"
-      }
-    },
-    "babel-preset-current-node-syntax": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-      "dev": true,
-      "requires": {
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-bigint": "^7.8.3",
-        "@babel/plugin-syntax-class-properties": "^7.8.3",
-        "@babel/plugin-syntax-import-meta": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3"
-      }
-    },
-    "babel-preset-jest": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz",
-      "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==",
-      "dev": true,
-      "requires": {
-        "babel-plugin-jest-hoist": "^26.6.2",
-        "babel-preset-current-node-syntax": "^1.0.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "batch": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
-      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true
-    },
-    "bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "body-parser": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
-      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
-      "dev": true,
-      "requires": {
-        "bytes": "3.1.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
-      },
-      "dependencies": {
-        "bytes": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
-          "dev": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
-          "dev": true
-        }
-      }
-    },
-    "bonjour": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
-      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
-      "dev": true,
-      "requires": {
-        "array-flatten": "^2.1.0",
-        "deep-equal": "^1.0.1",
-        "dns-equal": "^1.0.0",
-        "dns-txt": "^2.0.2",
-        "multicast-dns": "^6.0.1",
-        "multicast-dns-service-types": "^1.1.0"
-      },
-      "dependencies": {
-        "array-flatten": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
-          "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
-          "dev": true
-        }
-      }
-    },
-    "boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
-      "dev": true
-    },
-    "browserslist": {
-      "version": "4.16.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz",
-      "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30001165",
-        "colorette": "^1.2.1",
-        "electron-to-chromium": "^1.3.621",
-        "escalade": "^3.1.1",
-        "node-releases": "^1.1.67"
-      }
-    },
-    "bser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-      "dev": true,
-      "requires": {
-        "node-int64": "^0.4.0"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
-    },
-    "buffer-indexof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
-      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
-      "dev": true
-    },
-    "bytes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
-      "dev": true
-    },
-    "cacache": {
-      "version": "15.0.5",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
-      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
-      "dev": true,
-      "requires": {
-        "@npmcli/move-file": "^1.0.1",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "glob": "^7.1.4",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^6.0.0",
-        "minipass": "^3.1.1",
-        "minipass-collect": "^1.0.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.2",
-        "mkdirp": "^1.0.3",
-        "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^8.0.0",
-        "tar": "^6.0.2",
-        "unique-filename": "^1.1.1"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        },
-        "p-map": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-          "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-          "dev": true,
-          "requires": {
-            "aggregate-error": "^3.0.0"
-          }
-        },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "caller-callsite": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
-      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
-      "dev": true,
-      "requires": {
-        "callsites": "^2.0.0"
-      },
-      "dependencies": {
-        "callsites": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
-          "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
-          "dev": true
-        }
-      }
-    },
-    "caller-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
-      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
-      "dev": true,
-      "requires": {
-        "caller-callsite": "^2.0.0"
-      }
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
-    },
-    "camel-case": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
-      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0",
-        "upper-case": "^1.1.1"
-      }
-    },
-    "camelcase": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
-      "dev": true
-    },
-    "caniuse-api": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
-      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "caniuse-lite": "^1.0.0",
-        "lodash.memoize": "^4.1.2",
-        "lodash.uniq": "^4.5.0"
-      }
-    },
-    "caniuse-lite": {
-      "version": "1.0.30001166",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001166.tgz",
-      "integrity": "sha512-nCL4LzYK7F4mL0TjEMeYavafOGnBa98vTudH5c8lW9izUjnB99InG6pmC1ElAI1p0GlyZajv4ltUdFXvOHIl1A==",
-      "dev": true
-    },
-    "capture-exit": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
-      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
-      "dev": true,
-      "requires": {
-        "rsvp": "^4.8.4"
-      }
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "char-regex": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-      "dev": true
-    },
-    "chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true
-    },
-    "chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-      "dev": true,
-      "requires": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      }
-    },
-    "chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true
-    },
-    "chrome-trace-event": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
-      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
-    "cjs-module-lexer": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz",
-      "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==",
-      "dev": true
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "clean-css": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
-      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
-      "dev": true,
-      "requires": {
-        "source-map": "~0.6.0"
-      }
-    },
-    "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
-    },
-    "clean-webpack-plugin": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz",
-      "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==",
-      "dev": true,
-      "requires": {
-        "@types/webpack": "^4.4.31",
-        "del": "^4.1.1"
-      }
-    },
-    "cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "requires": {
-        "restore-cursor": "^3.1.0"
-      }
-    },
-    "cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
-      "requires": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "dev": true
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-          "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "cli-width": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
-      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
-      "dev": true
-    },
-    "cliui": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "dependencies": {
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "coa": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
-      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
-      "dev": true,
-      "requires": {
-        "@types/q": "^1.5.1",
-        "chalk": "^2.4.1",
-        "q": "^1.1.2"
-      }
-    },
-    "collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-      "dev": true
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
-      "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.1",
-        "color-string": "^1.5.4"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "color-string": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
-      "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
-      "dev": true,
-      "requires": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "colorette": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
-      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
-      "dev": true
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "command-line-usage": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz",
-      "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==",
-      "dev": true,
-      "requires": {
-        "array-back": "^4.0.1",
-        "chalk": "^2.4.2",
-        "table-layout": "^1.0.1",
-        "typical": "^5.2.0"
-      }
-    },
-    "commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
-    },
-    "compare-versions": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "compressible": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
-      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
-      "dev": true,
-      "requires": {
-        "mime-db": ">= 1.43.0 < 2"
-      }
-    },
-    "compression": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
-      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.5",
-        "bytes": "3.0.0",
-        "compressible": "~2.0.16",
-        "debug": "2.6.9",
-        "on-headers": "~1.0.2",
-        "safe-buffer": "5.1.2",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "connect-history-api-fallback": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
-      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
-      "dev": true
-    },
-    "contains-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
-      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
-      "dev": true
-    },
-    "content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "5.1.2"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "cookie": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
-      "dev": true
-    },
-    "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
-      "dev": true
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "core-js-compat": {
-      "version": "3.8.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz",
-      "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.15.0",
-        "semver": "7.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-          "dev": true
-        }
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "cosmiconfig": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
-      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
-      "dev": true,
-      "requires": {
-        "import-fresh": "^2.0.0",
-        "is-directory": "^0.3.1",
-        "js-yaml": "^3.13.1",
-        "parse-json": "^4.0.0"
-      },
-      "dependencies": {
-        "import-fresh": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
-          "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
-          "dev": true,
-          "requires": {
-            "caller-path": "^2.0.0",
-            "resolve-from": "^3.0.0"
-          }
-        },
-        "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
-          "dev": true,
-          "requires": {
-            "error-ex": "^1.3.1",
-            "json-parse-better-errors": "^1.0.1"
-          }
-        },
-        "resolve-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-          "dev": true
-        }
-      }
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "css-color-names": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
-      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
-      "dev": true
-    },
-    "css-declaration-sorter": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
-      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.1",
-        "timsort": "^0.3.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "css-loader": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz",
-      "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^6.2.0",
-        "cssesc": "^3.0.0",
-        "icss-utils": "^5.0.0",
-        "loader-utils": "^2.0.0",
-        "postcss": "^8.1.4",
-        "postcss-modules-extract-imports": "^3.0.0",
-        "postcss-modules-local-by-default": "^4.0.0",
-        "postcss-modules-scope": "^3.0.0",
-        "postcss-modules-values": "^4.0.0",
-        "postcss-value-parser": "^4.1.0",
-        "schema-utils": "^3.0.0",
-        "semver": "^7.3.2"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "css-minimizer-webpack-plugin": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-1.1.5.tgz",
-      "integrity": "sha512-mXgaoFjNpIudZfxD49N1aPtLxfXGJt+BVPVjQ+H66I48b5n4wJtFpYfffVr7izK8W6fD01J7K0kUcP6HGjw90w==",
-      "dev": true,
-      "requires": {
-        "cacache": "^15.0.5",
-        "cssnano": "^4.1.10",
-        "find-cache-dir": "^3.3.1",
-        "jest-worker": "^26.3.0",
-        "p-limit": "^3.0.2",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
-        "source-map": "^0.6.1",
-        "webpack-sources": "^1.4.3"
-      },
-      "dependencies": {
-        "webpack-sources": {
-          "version": "1.4.3",
-          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-          "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-          "dev": true,
-          "requires": {
-            "source-list-map": "^2.0.0",
-            "source-map": "~0.6.1"
-          }
-        }
-      }
-    },
-    "css-select": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
-      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
-      "dev": true,
-      "requires": {
-        "boolbase": "^1.0.0",
-        "css-what": "^3.2.1",
-        "domutils": "^1.7.0",
-        "nth-check": "^1.0.2"
-      },
-      "dependencies": {
-        "dom-serializer": {
-          "version": "0.2.2",
-          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-          "dev": true,
-          "requires": {
-            "domelementtype": "^2.0.1",
-            "entities": "^2.0.0"
-          },
-          "dependencies": {
-            "domelementtype": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
-              "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
-              "dev": true
-            }
-          }
-        },
-        "domelementtype": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-          "dev": true
-        },
-        "domutils": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
-          "dev": true,
-          "requires": {
-            "dom-serializer": "0",
-            "domelementtype": "1"
-          }
-        }
-      }
-    },
-    "css-select-base-adapter": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
-      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
-      "dev": true
-    },
-    "css-tree": {
-      "version": "1.0.0-alpha.37",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
-      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
-      "dev": true,
-      "requires": {
-        "mdn-data": "2.0.4",
-        "source-map": "^0.6.1"
-      }
-    },
-    "css-what": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
-      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
-      "dev": true
-    },
-    "cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "dev": true
-    },
-    "cssnano": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
-      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
-      "dev": true,
-      "requires": {
-        "cosmiconfig": "^5.0.0",
-        "cssnano-preset-default": "^4.0.7",
-        "is-resolvable": "^1.0.0",
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "cssnano-preset-default": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
-      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
-      "dev": true,
-      "requires": {
-        "css-declaration-sorter": "^4.0.1",
-        "cssnano-util-raw-cache": "^4.0.1",
-        "postcss": "^7.0.0",
-        "postcss-calc": "^7.0.1",
-        "postcss-colormin": "^4.0.3",
-        "postcss-convert-values": "^4.0.1",
-        "postcss-discard-comments": "^4.0.2",
-        "postcss-discard-duplicates": "^4.0.2",
-        "postcss-discard-empty": "^4.0.1",
-        "postcss-discard-overridden": "^4.0.1",
-        "postcss-merge-longhand": "^4.0.11",
-        "postcss-merge-rules": "^4.0.3",
-        "postcss-minify-font-values": "^4.0.2",
-        "postcss-minify-gradients": "^4.0.2",
-        "postcss-minify-params": "^4.0.2",
-        "postcss-minify-selectors": "^4.0.2",
-        "postcss-normalize-charset": "^4.0.1",
-        "postcss-normalize-display-values": "^4.0.2",
-        "postcss-normalize-positions": "^4.0.2",
-        "postcss-normalize-repeat-style": "^4.0.2",
-        "postcss-normalize-string": "^4.0.2",
-        "postcss-normalize-timing-functions": "^4.0.2",
-        "postcss-normalize-unicode": "^4.0.1",
-        "postcss-normalize-url": "^4.0.1",
-        "postcss-normalize-whitespace": "^4.0.2",
-        "postcss-ordered-values": "^4.1.2",
-        "postcss-reduce-initial": "^4.0.3",
-        "postcss-reduce-transforms": "^4.0.2",
-        "postcss-svgo": "^4.0.2",
-        "postcss-unique-selectors": "^4.0.1"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "cssnano-util-get-arguments": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
-      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
-      "dev": true
-    },
-    "cssnano-util-get-match": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
-      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
-      "dev": true
-    },
-    "cssnano-util-raw-cache": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
-      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "cssnano-util-same-parent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
-      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
-      "dev": true
-    },
-    "csso": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
-      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
-      "dev": true,
-      "requires": {
-        "css-tree": "^1.1.2"
-      },
-      "dependencies": {
-        "css-tree": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
-          "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
-          "dev": true,
-          "requires": {
-            "mdn-data": "2.0.14",
-            "source-map": "^0.6.1"
-          }
-        },
-        "mdn-data": {
-          "version": "2.0.14",
-          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-          "dev": true
-        }
-      }
-    },
-    "cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
-      "dev": true
-    },
-    "cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-      "dev": true,
-      "requires": {
-        "cssom": "~0.3.6"
-      },
-      "dependencies": {
-        "cssom": {
-          "version": "0.3.8",
-          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-          "dev": true
-        }
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-      "dev": true,
-      "requires": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
-      }
-    },
-    "debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-      "dev": true,
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "decimal.js": {
-      "version": "10.2.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
-      "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "deep-equal": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
-      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
-      "dev": true,
-      "requires": {
-        "is-arguments": "^1.0.4",
-        "is-date-object": "^1.0.1",
-        "is-regex": "^1.0.4",
-        "object-is": "^1.0.1",
-        "object-keys": "^1.1.1",
-        "regexp.prototype.flags": "^1.2.0"
-      }
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "dev": true
-    },
-    "default-gateway": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
-      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
-      "dev": true,
-      "requires": {
-        "execa": "^1.0.0",
-        "ip-regex": "^2.1.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "is-stream": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-          "dev": true,
-          "requires": {
-            "path-key": "^2.0.0"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-          "dev": true
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "del": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-      "dev": true,
-      "requires": {
-        "@types/glob": "^7.1.1",
-        "globby": "^6.1.0",
-        "is-path-cwd": "^2.0.0",
-        "is-path-in-cwd": "^2.0.0",
-        "p-map": "^2.0.0",
-        "pify": "^4.0.1",
-        "rimraf": "^2.6.3"
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "destroy": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
-      "dev": true
-    },
-    "detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-      "dev": true
-    },
-    "detect-node": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
-      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
-      "dev": true
-    },
-    "diff-sequences": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
-      "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
-      "dev": true
-    },
-    "dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "requires": {
-        "path-type": "^4.0.0"
-      },
-      "dependencies": {
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        }
-      }
-    },
-    "dns-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
-      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
-      "dev": true
-    },
-    "dns-packet": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
-      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
-      "dev": true,
-      "requires": {
-        "ip": "^1.1.0",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "dns-txt": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
-      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
-      "dev": true,
-      "requires": {
-        "buffer-indexof": "^1.0.0"
-      }
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "dev": true,
-      "requires": {
-        "webidl-conversions": "^5.0.0"
-      },
-      "dependencies": {
-        "webidl-conversions": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-          "dev": true
-        }
-      }
-    },
-    "dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
-      "requires": {
-        "is-obj": "^2.0.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
-    },
-    "electron-to-chromium": {
-      "version": "1.3.626",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.626.tgz",
-      "integrity": "sha512-7CanEvJx74EnvjHu1X8gf93KieyxvFLnqOXAH/ddjWD4RrUZYqdg3pykrQ/7t6SLI7DTsp4tfQXEfzeK5t6oAw==",
-      "dev": true
-    },
-    "emittery": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz",
-      "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==",
-      "dev": true
-    },
-    "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "dev": true
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz",
-      "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.0.0"
-      }
-    },
-    "enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^4.1.1"
-      }
-    },
-    "entities": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
-      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
-      "dev": true
-    },
-    "envinfo": {
-      "version": "7.7.3",
-      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
-      "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
-      "dev": true
-    },
-    "errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "dev": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.18.0-next.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-      "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-      "dev": true,
-      "requires": {
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1",
-        "is-callable": "^1.2.2",
-        "is-negative-zero": "^2.0.0",
-        "is-regex": "^1.1.1",
-        "object-inspect": "^1.8.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.1",
-        "string.prototype.trimend": "^1.0.1",
-        "string.prototype.trimstart": "^1.0.1"
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
-    },
-    "escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "dev": true,
-      "requires": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "dev": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-          "dev": true
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        }
-      }
-    },
-    "eslint": {
-      "version": "7.15.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz",
-      "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.2.2",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.2.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.0",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "eslint-config-esnext": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz",
-      "integrity": "sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA==",
-      "dev": true,
-      "requires": {
-        "babel-eslint": "^10.0.1",
-        "eslint": "^6.8.0",
-        "eslint-plugin-babel": "^5.2.1",
-        "eslint-plugin-import": "^2.14.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        },
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
-            }
-          }
-        },
-        "eslint": {
-          "version": "6.8.0",
-          "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
-          "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "ajv": "^6.10.0",
-            "chalk": "^2.1.0",
-            "cross-spawn": "^6.0.5",
-            "debug": "^4.0.1",
-            "doctrine": "^3.0.0",
-            "eslint-scope": "^5.0.0",
-            "eslint-utils": "^1.4.3",
-            "eslint-visitor-keys": "^1.1.0",
-            "espree": "^6.1.2",
-            "esquery": "^1.0.1",
-            "esutils": "^2.0.2",
-            "file-entry-cache": "^5.0.1",
-            "functional-red-black-tree": "^1.0.1",
-            "glob-parent": "^5.0.0",
-            "globals": "^12.1.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.0.0",
-            "imurmurhash": "^0.1.4",
-            "inquirer": "^7.0.0",
-            "is-glob": "^4.0.0",
-            "js-yaml": "^3.13.1",
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "levn": "^0.3.0",
-            "lodash": "^4.17.14",
-            "minimatch": "^3.0.4",
-            "mkdirp": "^0.5.1",
-            "natural-compare": "^1.4.0",
-            "optionator": "^0.8.3",
-            "progress": "^2.0.0",
-            "regexpp": "^2.0.1",
-            "semver": "^6.1.2",
-            "strip-ansi": "^5.2.0",
-            "strip-json-comments": "^3.0.1",
-            "table": "^5.2.3",
-            "text-table": "^0.2.0",
-            "v8-compile-cache": "^2.0.3"
-          }
-        },
-        "eslint-utils": {
-          "version": "1.4.3",
-          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
-          "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        },
-        "espree": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
-          "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.1.1",
-            "acorn-jsx": "^5.2.0",
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "file-entry-cache": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-          "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-          "dev": true,
-          "requires": {
-            "flat-cache": "^2.0.1"
-          }
-        },
-        "flat-cache": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-          "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-          "dev": true,
-          "requires": {
-            "flatted": "^2.0.0",
-            "rimraf": "2.6.3",
-            "write": "1.0.3"
-          }
-        },
-        "flatted": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-          "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-          "dev": true
-        },
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "dev": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-          "dev": true
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-          "dev": true
-        },
-        "regexpp": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
-          "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "eslint-config-node": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-node/-/eslint-config-node-4.1.0.tgz",
-      "integrity": "sha512-Wz17xV5O2WFG8fGdMYEBdbiL6TL7YNJSJvSX9V4sXQownewfYmoqlly7wxqLkOUv/57pq6LnnotMiQQrrPjCqQ==",
-      "dev": true,
-      "requires": {
-        "eslint": "^6.8.0",
-        "eslint-config-esnext": "^4.1.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        },
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
-            }
-          }
-        },
-        "eslint": {
-          "version": "6.8.0",
-          "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
-          "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "ajv": "^6.10.0",
-            "chalk": "^2.1.0",
-            "cross-spawn": "^6.0.5",
-            "debug": "^4.0.1",
-            "doctrine": "^3.0.0",
-            "eslint-scope": "^5.0.0",
-            "eslint-utils": "^1.4.3",
-            "eslint-visitor-keys": "^1.1.0",
-            "espree": "^6.1.2",
-            "esquery": "^1.0.1",
-            "esutils": "^2.0.2",
-            "file-entry-cache": "^5.0.1",
-            "functional-red-black-tree": "^1.0.1",
-            "glob-parent": "^5.0.0",
-            "globals": "^12.1.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.0.0",
-            "imurmurhash": "^0.1.4",
-            "inquirer": "^7.0.0",
-            "is-glob": "^4.0.0",
-            "js-yaml": "^3.13.1",
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "levn": "^0.3.0",
-            "lodash": "^4.17.14",
-            "minimatch": "^3.0.4",
-            "mkdirp": "^0.5.1",
-            "natural-compare": "^1.4.0",
-            "optionator": "^0.8.3",
-            "progress": "^2.0.0",
-            "regexpp": "^2.0.1",
-            "semver": "^6.1.2",
-            "strip-ansi": "^5.2.0",
-            "strip-json-comments": "^3.0.1",
-            "table": "^5.2.3",
-            "text-table": "^0.2.0",
-            "v8-compile-cache": "^2.0.3"
-          }
-        },
-        "eslint-utils": {
-          "version": "1.4.3",
-          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
-          "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        },
-        "espree": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
-          "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.1.1",
-            "acorn-jsx": "^5.2.0",
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "file-entry-cache": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-          "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-          "dev": true,
-          "requires": {
-            "flat-cache": "^2.0.1"
-          }
-        },
-        "flat-cache": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-          "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-          "dev": true,
-          "requires": {
-            "flatted": "^2.0.0",
-            "rimraf": "2.6.3",
-            "write": "1.0.3"
-          }
-        },
-        "flatted": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-          "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-          "dev": true
-        },
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "dev": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-          "dev": true
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-          "dev": true
-        },
-        "regexpp": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
-          "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "eslint-import-resolver-node": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
-      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.9",
-        "resolve": "^1.13.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-loader": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz",
-      "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==",
-      "dev": true,
-      "requires": {
-        "find-cache-dir": "^3.3.1",
-        "fs-extra": "^8.1.0",
-        "loader-utils": "^2.0.0",
-        "object-hash": "^2.0.3",
-        "schema-utils": "^2.6.5"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "schema-utils": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-          "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.5",
-            "ajv": "^6.12.4",
-            "ajv-keywords": "^3.5.2"
-          }
-        }
-      }
-    },
-    "eslint-module-utils": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
-      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.9",
-        "pkg-dir": "^2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "find-up": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-          "dev": true,
-          "requires": {
-            "locate-path": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "p-try": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-          "dev": true,
-          "requires": {
-            "find-up": "^2.1.0"
-          }
-        }
-      }
-    },
-    "eslint-plugin-babel": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz",
-      "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==",
-      "dev": true,
-      "requires": {
-        "eslint-rule-composer": "^0.3.0"
-      }
-    },
-    "eslint-plugin-es": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
-      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
-      "dev": true,
-      "requires": {
-        "eslint-utils": "^2.0.0",
-        "regexpp": "^3.0.0"
-      }
-    },
-    "eslint-plugin-import": {
-      "version": "2.22.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
-      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.1",
-        "array.prototype.flat": "^1.2.3",
-        "contains-path": "^0.1.0",
-        "debug": "^2.6.9",
-        "doctrine": "1.5.0",
-        "eslint-import-resolver-node": "^0.3.4",
-        "eslint-module-utils": "^2.6.0",
-        "has": "^1.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.1",
-        "read-pkg-up": "^2.0.0",
-        "resolve": "^1.17.0",
-        "tsconfig-paths": "^3.9.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "doctrine": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "isarray": "^1.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-jest": {
-      "version": "24.1.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz",
-      "integrity": "sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/experimental-utils": "^4.0.1"
-      }
-    },
-    "eslint-plugin-node": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
-      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
-      "dev": true,
-      "requires": {
-        "eslint-plugin-es": "^3.0.0",
-        "eslint-utils": "^2.0.0",
-        "ignore": "^5.1.1",
-        "minimatch": "^3.0.4",
-        "resolve": "^1.10.1",
-        "semver": "^6.1.0"
-      },
-      "dependencies": {
-        "ignore": {
-          "version": "5.1.8",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-rule-composer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
-      "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
-      "dev": true
-    },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-      "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
-      "dev": true
-    },
-    "espree": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        },
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.1.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-          "dev": true
-        }
-      }
-    },
-    "esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.2.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-          "dev": true
-        }
-      }
-    },
-    "estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
-      "dev": true
-    },
-    "eventemitter3": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
-    },
-    "events": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
-      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
-      "dev": true
-    },
-    "eventsource": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
-      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
-      "dev": true,
-      "requires": {
-        "original": "^1.0.0"
-      }
-    },
-    "exec-sh": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
-      "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
-      "dev": true
-    },
-    "execa": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
-      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.0",
-        "get-stream": "^5.0.0",
-        "human-signals": "^1.1.1",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.0",
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2",
-        "strip-final-newline": "^2.0.0"
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "expect": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz",
-      "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "ansi-styles": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "express": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
-      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.7",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.19.0",
-        "content-disposition": "0.5.3",
-        "content-type": "~1.0.4",
-        "cookie": "0.4.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "~1.1.2",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.5",
-        "qs": "6.7.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.1.2",
-        "send": "0.17.1",
-        "serve-static": "1.14.1",
-        "setprototypeof": "1.1.1",
-        "statuses": "~1.5.0",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "path-to-regexp": {
-          "version": "0.1.7",
-          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
-          "dev": true
-        },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
-          "dev": true
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-          "dev": true
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "external-editor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "dev": true,
-      "requires": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true
-    },
-    "fast-glob": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
-      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2",
-        "picomatch": "^2.2.1"
-      }
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fastq": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
-      "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
-      "dev": true,
-      "requires": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "faye-websocket": {
-      "version": "0.11.3",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
-      "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
-      "dev": true,
-      "requires": {
-        "websocket-driver": ">=0.5.1"
-      }
-    },
-    "fb-watchman": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
-      "dev": true,
-      "requires": {
-        "bser": "2.1.1"
-      }
-    },
-    "figures": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
-      }
-    },
-    "file-entry-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-      "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^3.0.4"
-      }
-    },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true,
-      "optional": true
-    },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "requires": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "find-cache-dir": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
-      "dev": true,
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^3.0.2",
-        "pkg-dir": "^4.1.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        }
-      }
-    },
-    "find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "requires": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      }
-    },
-    "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
-      "dev": true,
-      "requires": {
-        "semver-regex": "^2.0.0"
-      }
-    },
-    "flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
-      "requires": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "flatted": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
-      "dev": true
-    },
-    "follow-redirects": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
-      "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
-      "dev": true
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
-      "dev": true
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
-      "dev": true
-    },
-    "fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      }
-    },
-    "fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
-      "dev": true
-    },
-    "get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      }
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "dev": true
-    },
-    "globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
-    },
-    "globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dev": true,
-      "requires": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-      "dev": true
-    },
-    "growly": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
-      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
-      "dev": true,
-      "optional": true
-    },
-    "handle-thing": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
-      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
-      "dev": true
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "dev": true
-    },
-    "hex-color-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
-      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
-      "dev": true
-    },
-    "hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-      "dev": true
-    },
-    "hpack.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
-      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "obuf": "^1.0.0",
-        "readable-stream": "^2.0.1",
-        "wbuf": "^1.1.0"
-      }
-    },
-    "hsl-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
-      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
-      "dev": true
-    },
-    "hsla-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
-      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
-      "dev": true
-    },
-    "html-comment-regex": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
-      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
-      "dev": true
-    },
-    "html-encoding-sniffer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-      "dev": true,
-      "requires": {
-        "whatwg-encoding": "^1.0.5"
-      }
-    },
-    "html-entities": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
-      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
-      "dev": true
-    },
-    "html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
-    },
-    "html-minifier": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
-      "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
-      "dev": true,
-      "requires": {
-        "camel-case": "^3.0.0",
-        "clean-css": "^4.2.1",
-        "commander": "^2.19.0",
-        "he": "^1.2.0",
-        "param-case": "^2.1.1",
-        "relateurl": "^0.2.7",
-        "uglify-js": "^3.5.1"
-      }
-    },
-    "http-deceiver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
-      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
-      "dev": true
-    },
-    "http-errors": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
-      "dev": true,
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-          "dev": true
-        }
-      }
-    },
-    "http-parser-js": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
-      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
-      "dev": true
-    },
-    "http-proxy": {
-      "version": "1.18.1",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
-      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
-      "dev": true,
-      "requires": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "http-proxy-middleware": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
-      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
-      "dev": true,
-      "requires": {
-        "http-proxy": "^1.17.0",
-        "is-glob": "^4.0.0",
-        "lodash": "^4.17.11",
-        "micromatch": "^3.1.10"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        }
-      }
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "human-signals": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
-      "dev": true
-    },
-    "husky": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz",
-      "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "ci-info": "^2.0.0",
-        "compare-versions": "^3.6.0",
-        "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
-        "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
-        "please-upgrade-node": "^3.2.0",
-        "slash": "^3.0.0",
-        "which-pm-runs": "^1.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "cosmiconfig": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-          "dev": true,
-          "requires": {
-            "@types/parse-json": "^4.0.0",
-            "import-fresh": "^3.2.1",
-            "parse-json": "^5.0.0",
-            "path-type": "^4.0.0",
-            "yaml": "^1.10.0"
-          }
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        }
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "icss-utils": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
-      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-      "dev": true
-    },
-    "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true
-    },
-    "import-fresh": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
-      "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
-      "dev": true,
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      }
-    },
-    "import-local": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
-      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        }
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true
-    },
-    "indexes-of": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
-      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
-      "dev": true
-    },
-    "infer-owner": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "inquirer": {
-      "version": "7.3.3",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
-      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "internal-ip": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
-      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
-      "dev": true,
-      "requires": {
-        "default-gateway": "^4.2.0",
-        "ipaddr.js": "^1.9.0"
-      }
-    },
-    "interpret": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
-      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
-      "dev": true
-    },
-    "ip": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
-      "dev": true
-    },
-    "ip-regex": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
-      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
-      "dev": true
-    },
-    "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-      "dev": true
-    },
-    "is-absolute-url": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
-      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
-      "dev": true
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-arguments": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
-      "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0"
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-callable": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
-      "dev": true
-    },
-    "is-ci": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
-      "requires": {
-        "ci-info": "^2.0.0"
-      }
-    },
-    "is-color-stop": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
-      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
-      "dev": true,
-      "requires": {
-        "css-color-names": "^0.0.4",
-        "hex-color-regex": "^1.1.0",
-        "hsl-regex": "^1.0.0",
-        "hsla-regex": "^1.0.0",
-        "rgb-regex": "^1.0.1",
-        "rgba-regex": "^1.0.0"
-      }
-    },
-    "is-core-module": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
-      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-date-object": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
-      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
-      "dev": true
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "is-directory": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
-      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
-      "dev": true
-    },
-    "is-docker": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
-      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
-      "dev": true,
-      "optional": true
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
-    },
-    "is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
-      "dev": true
-    },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true
-    },
-    "is-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-      "dev": true
-    },
-    "is-path-cwd": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
-      "dev": true
-    },
-    "is-path-in-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^2.1.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-      "dev": true,
-      "requires": {
-        "path-is-inside": "^1.0.2"
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-potential-custom-element-name": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
-      "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
-      "dev": true
-    },
-    "is-regex": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-      "dev": true,
-      "requires": {
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
-      "dev": true
-    },
-    "is-resolvable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
-      "dev": true
-    },
-    "is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-      "dev": true
-    },
-    "is-string": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
-      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
-      "dev": true
-    },
-    "is-svg": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
-      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
-      "dev": true,
-      "requires": {
-        "html-comment-regex": "^1.1.0"
-      }
-    },
-    "is-symbol": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
-      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
-      "dev": true,
-      "requires": {
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-docker": "^2.0.0"
-      }
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "istanbul-lib-coverage": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
-      "dev": true
-    },
-    "istanbul-lib-instrument": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.7.5",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.0.0",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
-      "requires": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "istanbul-lib-source-maps": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
-      "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      }
-    },
-    "istanbul-reports": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
-      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
-      "dev": true,
-      "requires": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      }
-    },
-    "jest": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz",
-      "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==",
-      "dev": true,
-      "requires": {
-        "@jest/core": "^26.6.3",
-        "import-local": "^3.0.2",
-        "jest-cli": "^26.6.3"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "jest-cli": {
-          "version": "26.6.3",
-          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz",
-          "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==",
-          "dev": true,
-          "requires": {
-            "@jest/core": "^26.6.3",
-            "@jest/test-result": "^26.6.2",
-            "@jest/types": "^26.6.2",
-            "chalk": "^4.0.0",
-            "exit": "^0.1.2",
-            "graceful-fs": "^4.2.4",
-            "import-local": "^3.0.2",
-            "is-ci": "^2.0.0",
-            "jest-config": "^26.6.3",
-            "jest-util": "^26.6.2",
-            "jest-validate": "^26.6.2",
-            "prompts": "^2.0.1",
-            "yargs": "^15.4.1"
-          }
-        }
-      }
-    },
-    "jest-changed-files": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz",
-      "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "execa": "^4.0.0",
-        "throat": "^5.0.0"
-      }
-    },
-    "jest-config": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz",
-      "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/test-sequencer": "^26.6.3",
-        "@jest/types": "^26.6.2",
-        "babel-jest": "^26.6.3",
-        "chalk": "^4.0.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.2.4",
-        "jest-environment-jsdom": "^26.6.2",
-        "jest-environment-node": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-jasmine2": "^26.6.3",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-diff": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
-      "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "diff-sequences": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-docblock": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
-      "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
-      "dev": true,
-      "requires": {
-        "detect-newline": "^3.0.0"
-      }
-    },
-    "jest-each": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz",
-      "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-environment-jsdom": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
-      "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jsdom": "^16.4.0"
-      }
-    },
-    "jest-environment-node": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz",
-      "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
-      }
-    },
-    "jest-get-type": {
-      "version": "26.3.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-      "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-      "dev": true
-    },
-    "jest-haste-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz",
-      "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/graceful-fs": "^4.1.2",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "fsevents": "^2.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-regex-util": "^26.0.0",
-        "jest-serializer": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "sane": "^4.0.3",
-        "walker": "^1.0.7"
-      }
-    },
-    "jest-jasmine2": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz",
-      "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==",
-      "dev": true,
-      "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@jest/environment": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "expect": "^26.6.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2",
-        "throat": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-leak-detector": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz",
-      "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==",
-      "dev": true,
-      "requires": {
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      }
-    },
-    "jest-matcher-utils": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz",
-      "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-message-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
-      "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-mock": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
-      "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*"
-      }
-    },
-    "jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true
-    },
-    "jest-raw-loader": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/jest-raw-loader/-/jest-raw-loader-1.0.1.tgz",
-      "integrity": "sha1-zp9W1UZQ8VfEp9FtIkul1hO81iY=",
-      "dev": true
-    },
-    "jest-regex-util": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
-      "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
-      "dev": true
-    },
-    "jest-resolve": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
-      "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^26.6.2",
-        "read-pkg-up": "^7.0.1",
-        "resolve": "^1.18.1",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "read-pkg": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-          "dev": true,
-          "requires": {
-            "@types/normalize-package-data": "^2.4.0",
-            "normalize-package-data": "^2.5.0",
-            "parse-json": "^5.0.0",
-            "type-fest": "^0.6.0"
-          },
-          "dependencies": {
-            "type-fest": {
-              "version": "0.6.0",
-              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-              "dev": true
-            }
-          }
-        },
-        "read-pkg-up": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.1.0",
-            "read-pkg": "^5.2.0",
-            "type-fest": "^0.8.1"
-          }
-        }
-      }
-    },
-    "jest-resolve-dependencies": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz",
-      "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-snapshot": "^26.6.2"
-      }
-    },
-    "jest-runner": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz",
-      "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.7.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-docblock": "^26.0.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-leak-detector": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "source-map-support": "^0.5.6",
-        "throat": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-runtime": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz",
-      "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/globals": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^0.6.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0",
-        "yargs": "^15.4.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "strip-bom": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-          "dev": true
-        }
-      }
-    },
-    "jest-serializer": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz",
-      "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "graceful-fs": "^4.2.4"
-      }
-    },
-    "jest-snapshot": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz",
-      "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/babel__traverse": "^7.0.4",
-        "@types/prettier": "^2.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^26.6.2",
-        "semver": "^7.3.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "jest-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
-      "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "is-ci": "^2.0.0",
-        "micromatch": "^4.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-validate": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz",
-      "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "camelcase": "^6.0.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-watcher": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz",
-      "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "jest-util": "^26.6.2",
-        "string-length": "^4.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "string-length": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
-          "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
-          "dev": true,
-          "requires": {
-            "char-regex": "^1.0.2",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
-      }
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
-    },
-    "jsdom": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
-      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
-      "dev": true,
-      "requires": {
-        "abab": "^2.0.3",
-        "acorn": "^7.1.1",
-        "acorn-globals": "^6.0.0",
-        "cssom": "^0.4.4",
-        "cssstyle": "^2.2.0",
-        "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.0",
-        "domexception": "^2.0.1",
-        "escodegen": "^1.14.1",
-        "html-encoding-sniffer": "^2.0.1",
-        "is-potential-custom-element-name": "^1.0.0",
-        "nwsapi": "^2.2.0",
-        "parse5": "5.1.1",
-        "request": "^2.88.2",
-        "request-promise-native": "^1.0.8",
-        "saxes": "^5.0.0",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^3.0.1",
-        "w3c-hr-time": "^1.0.2",
-        "w3c-xmlserializer": "^2.0.0",
-        "webidl-conversions": "^6.1.0",
-        "whatwg-encoding": "^1.0.5",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0",
-        "ws": "^7.2.3",
-        "xml-name-validator": "^3.0.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        },
-        "tough-cookie": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
-          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
-          "dev": true,
-          "requires": {
-            "ip-regex": "^2.1.0",
-            "psl": "^1.1.28",
-            "punycode": "^2.1.1"
-          }
-        }
-      }
-    },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
-    },
-    "json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "json3": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
-      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
-      "dev": true
-    },
-    "json5": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "killable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
-      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true
-    },
-    "kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true
-    },
-    "klona": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
-      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
-      "dev": true
-    },
-    "leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true
-    },
-    "levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      }
-    },
-    "lines-and-columns": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
-      "dev": true
-    },
-    "lint-staged": {
-      "version": "10.5.3",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz",
-      "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "commander": "^6.2.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.2.0",
-        "dedent": "^0.7.0",
-        "enquirer": "^2.3.6",
-        "execa": "^4.1.0",
-        "listr2": "^3.2.2",
-        "log-symbols": "^4.0.0",
-        "micromatch": "^4.0.2",
-        "normalize-path": "^3.0.0",
-        "please-upgrade-node": "^3.2.0",
-        "string-argv": "0.3.1",
-        "stringify-object": "^3.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "commander": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-          "dev": true
-        },
-        "cosmiconfig": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-          "dev": true,
-          "requires": {
-            "@types/parse-json": "^4.0.0",
-            "import-fresh": "^3.2.1",
-            "parse-json": "^5.0.0",
-            "path-type": "^4.0.0",
-            "yaml": "^1.10.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        }
-      }
-    },
-    "listr2": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz",
-      "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "figures": "^3.2.0",
-        "indent-string": "^4.0.0",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rxjs": "^6.6.3",
-        "through": "^2.3.8"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "p-map": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-          "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-          "dev": true,
-          "requires": {
-            "aggregate-error": "^3.0.0"
-          }
-        }
-      }
-    },
-    "load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "loader-runner": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
-      "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
-      "dev": true
-    },
-    "loader-utils": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-      "dev": true,
-      "requires": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        }
-      }
-    },
-    "locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^5.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-      "dev": true
-    },
-    "lodash.memoize": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
-      "dev": true
-    },
-    "lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
-      "dev": true
-    },
-    "lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
-      "dev": true
-    },
-    "log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "dev": true
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        }
-      }
-    },
-    "loglevel": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
-      "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
-      "dev": true
-    },
-    "lower-case": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
-      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
-      "dev": true
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
-      "requires": {
-        "semver": "^6.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "makeerror": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
-      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
-      "dev": true,
-      "requires": {
-        "tmpl": "1.0.x"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "mdi": {
-      "version": "2.2.43",
-      "resolved": "https://registry.npmjs.org/mdi/-/mdi-2.2.43.tgz",
-      "integrity": "sha512-g3m6z4303qieltUM20JL2gdsJZvoVzIzO74qa2XxZ2kg9JPwrPEAgooVhRDHZi1vvRh0gB8Dg+c9XqNdz4jcIg==",
-      "dev": true
-    },
-    "mdn-data": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
-      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
-      "dev": true
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
-      "dev": true
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
-      "dev": true
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-      "dev": true,
-      "requires": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.0.5"
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.27",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-      "dev": true,
-      "requires": {
-        "mime-db": "1.44.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "mini-css-extract-plugin": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz",
-      "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0",
-        "webpack-sources": "^1.1.0"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "webpack-sources": {
-          "version": "1.4.3",
-          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-          "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-          "dev": true,
-          "requires": {
-            "source-list-map": "^2.0.0",
-            "source-map": "~0.6.1"
-          }
-        }
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
-    "minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "minipass-collect": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "multicast-dns": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
-      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
-      "dev": true,
-      "requires": {
-        "dns-packet": "^1.3.1",
-        "thunky": "^1.0.2"
-      }
-    },
-    "multicast-dns-service-types": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
-      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
-      "dev": true
-    },
-    "mute-stream": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
-      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
-      "dev": true,
-      "optional": true
-    },
-    "nanoid": {
-      "version": "3.1.20",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
-      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
-      "dev": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "negotiator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
-      "dev": true
-    },
-    "neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "dev": true
-    },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
-    "no-case": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
-      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
-      "dev": true,
-      "requires": {
-        "lower-case": "^1.1.1"
-      }
-    },
-    "node-forge": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
-      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
-      "dev": true
-    },
-    "node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
-      "dev": true
-    },
-    "node-modules-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
-      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
-      "dev": true
-    },
-    "node-notifier": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz",
-      "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "growly": "^1.3.0",
-        "is-wsl": "^2.2.0",
-        "semver": "^7.3.2",
-        "shellwords": "^0.1.1",
-        "uuid": "^8.3.0",
-        "which": "^2.0.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "uuid": {
-          "version": "8.3.2",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "node-releases": {
-      "version": "1.1.67",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
-      "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
-      "dev": true
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "normalize-url": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
-      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
-      "dev": true
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
-      "dev": true,
-      "requires": {
-        "boolbase": "~1.0.0"
-      }
-    },
-    "nwsapi": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
-      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-hash": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
-      "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
-      "dev": true
-    },
-    "object-inspect": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
-      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
-      "dev": true
-    },
-    "object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "object.getownpropertydescriptors": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz",
-      "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.values": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz",
-      "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1",
-        "has": "^1.0.3"
-      }
-    },
-    "obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "dev": true,
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^2.1.0"
-      }
-    },
-    "opencollective-postinstall": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
-      "dev": true
-    },
-    "opn": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
-      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
-      "dev": true,
-      "requires": {
-        "is-wsl": "^1.1.0"
-      },
-      "dependencies": {
-        "is-wsl": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-          "dev": true
-        }
-      }
-    },
-    "optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      }
-    },
-    "original": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
-      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
-      "dev": true,
-      "requires": {
-        "url-parse": "^1.4.3"
-      }
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "p-each-series": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
-      "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
-      "dev": true
-    },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "requires": {
-        "yocto-queue": "^0.1.0"
-      }
-    },
-    "p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^3.0.2"
-      }
-    },
-    "p-map": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-      "dev": true
-    },
-    "p-retry": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
-      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
-      "dev": true,
-      "requires": {
-        "retry": "^0.12.0"
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "param-case": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
-      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0"
-      }
-    },
-    "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse5": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
-      "dev": true
-    },
-    "parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
-    },
-    "path-type": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
-      "dev": true,
-      "requires": {
-        "pify": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
-    },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pirates": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
-      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
-      "dev": true,
-      "requires": {
-        "node-modules-regexp": "^1.0.0"
-      }
-    },
-    "pkg-dir": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
-      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
-      "dev": true,
-      "requires": {
-        "find-up": "^5.0.0"
-      }
-    },
-    "please-upgrade-node": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
-      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
-      "dev": true,
-      "requires": {
-        "semver-compare": "^1.0.0"
-      }
-    },
-    "portfinder": {
-      "version": "1.0.28",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
-      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.2",
-        "debug": "^3.1.1",
-        "mkdirp": "^0.5.5"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.14"
-          }
-        },
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
-    },
-    "postcss": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz",
-      "integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==",
-      "dev": true,
-      "requires": {
-        "colorette": "^1.2.1",
-        "nanoid": "^3.1.20",
-        "source-map": "^0.6.1"
-      }
-    },
-    "postcss-calc": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
-      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.27",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.0.2"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-colormin": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
-      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "color": "^3.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-convert-values": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
-      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-discard-comments": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
-      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-discard-duplicates": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
-      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-discard-empty": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
-      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-discard-overridden": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
-      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-merge-longhand": {
-      "version": "4.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
-      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
-      "dev": true,
-      "requires": {
-        "css-color-names": "0.0.4",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "stylehacks": "^4.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-merge-rules": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
-      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "caniuse-api": "^3.0.0",
-        "cssnano-util-same-parent": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0",
-        "vendors": "^1.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-          "dev": true,
-          "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-minify-font-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
-      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-minify-gradients": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
-      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "is-color-stop": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-minify-params": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
-      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "^1.0.0",
-        "browserslist": "^4.0.0",
-        "cssnano-util-get-arguments": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "uniqs": "^2.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-minify-selectors": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
-      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "^1.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-          "dev": true,
-          "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-modules-extract-imports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
-      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-      "dev": true
-    },
-    "postcss-modules-local-by-default": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
-      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
-      "dev": true,
-      "requires": {
-        "icss-utils": "^5.0.0",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.1.0"
-      }
-    },
-    "postcss-modules-scope": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
-      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
-      "dev": true,
-      "requires": {
-        "postcss-selector-parser": "^6.0.4"
-      }
-    },
-    "postcss-modules-values": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
-      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
-      "dev": true,
-      "requires": {
-        "icss-utils": "^5.0.0"
-      }
-    },
-    "postcss-normalize-charset": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
-      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-display-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
-      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-positions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
-      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-repeat-style": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
-      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-string": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
-      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-timing-functions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
-      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-unicode": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
-      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-url": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
-      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
-      "dev": true,
-      "requires": {
-        "is-absolute-url": "^2.0.0",
-        "normalize-url": "^3.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-normalize-whitespace": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
-      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-ordered-values": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
-      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-reduce-initial": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
-      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "caniuse-api": "^3.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-reduce-transforms": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
-      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-selector-parser": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
-      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
-      "dev": true,
-      "requires": {
-        "cssesc": "^3.0.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1",
-        "util-deprecate": "^1.0.2"
-      }
-    },
-    "postcss-svgo": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
-      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
-      "dev": true,
-      "requires": {
-        "is-svg": "^3.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "svgo": "^1.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-unique-selectors": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
-      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "^1.0.0",
-        "postcss": "^7.0.0",
-        "uniqs": "^2.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "postcss-value-parser": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
-      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
-      "dev": true
-    },
-    "pretty-format": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-      "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "ansi-regex": "^5.0.0",
-        "ansi-styles": "^4.0.0",
-        "react-is": "^17.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
-    },
-    "prompts": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz",
-      "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
-      "dev": true,
-      "requires": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      }
-    },
-    "proxy-addr": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
-      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
-      "dev": true,
-      "requires": {
-        "forwarded": "~0.1.2",
-        "ipaddr.js": "1.9.1"
-      }
-    },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
-    },
-    "psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-      "dev": true
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
-    },
-    "querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "dev": true
-    },
-    "raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
-      "dev": true,
-      "requires": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "bytes": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
-          "dev": true
-        }
-      }
-    },
-    "raw-loader": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz",
-      "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        }
-      }
-    },
-    "react-is": {
-      "version": "17.0.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
-      "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==",
-      "dev": true
-    },
-    "read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-          "dev": true,
-          "requires": {
-            "locate-path": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "p-try": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "rechoir": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-      "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
-      "dev": true,
-      "requires": {
-        "resolve": "^1.9.0"
-      }
-    },
-    "reduce-flatten": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
-      "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
-      "dev": true
-    },
-    "regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
-    },
-    "regenerate-unicode-properties": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.4.0"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
-      "dev": true
-    },
-    "regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "regexp.prototype.flags": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "regexpp": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
-      "dev": true
-    },
-    "regexpu-core": {
-      "version": "4.7.1",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.4.0",
-        "regenerate-unicode-properties": "^8.2.0",
-        "regjsgen": "^0.5.1",
-        "regjsparser": "^0.6.4",
-        "unicode-match-property-ecmascript": "^1.0.4",
-        "unicode-match-property-value-ecmascript": "^1.2.0"
-      }
-    },
-    "regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
-      "dev": true
-    },
-    "regjsparser": {
-      "version": "0.6.4",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
-      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
-      "dev": true,
-      "requires": {
-        "jsesc": "~0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        }
-      }
-    },
-    "relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
-      "dev": true
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
-    },
-    "request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-      "dev": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      }
-    },
-    "request-promise-core": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
-      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.19"
-      }
-    },
-    "request-promise-native": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
-      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
-      "dev": true,
-      "requires": {
-        "request-promise-core": "1.1.4",
-        "stealthy-require": "^1.1.1",
-        "tough-cookie": "^2.3.3"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
-      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.1.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^5.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        }
-      }
-    },
-    "resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
-      "requires": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
-      "dev": true
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
-    },
-    "rgb-regex": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
-      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
-      "dev": true
-    },
-    "rgba-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
-      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "rsvp": {
-      "version": "4.8.5",
-      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
-      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
-      "dev": true
-    },
-    "run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
-      "dev": true
-    },
-    "run-parallel": {
-      "version": "1.1.10",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
-      "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
-      "dev": true
-    },
-    "rxjs": {
-      "version": "6.6.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
-      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "sane": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
-      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
-      "dev": true,
-      "requires": {
-        "@cnakazawa/watch": "^1.0.3",
-        "anymatch": "^2.0.0",
-        "capture-exit": "^2.0.0",
-        "exec-sh": "^0.3.2",
-        "execa": "^1.0.0",
-        "fb-watchman": "^2.0.0",
-        "micromatch": "^3.1.4",
-        "minimist": "^1.1.1",
-        "walker": "~1.0.5"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          }
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-stream": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        },
-        "npm-run-path": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-          "dev": true,
-          "requires": {
-            "path-key": "^2.0.0"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-          "dev": true
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "sass": {
-      "version": "1.30.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.30.0.tgz",
-      "integrity": "sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw==",
-      "dev": true,
-      "requires": {
-        "chokidar": ">=2.0.0 <4.0.0"
-      }
-    },
-    "sass-loader": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.0.tgz",
-      "integrity": "sha512-ZCKAlczLBbFd3aGAhowpYEy69Te3Z68cg8bnHHl6WnSCvnKpbM6pQrz957HWMa8LKVuhnD9uMplmMAHwGQtHeg==",
-      "dev": true,
-      "requires": {
-        "klona": "^2.0.4",
-        "loader-utils": "^2.0.0",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.0.0",
-        "semver": "^7.3.2"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "semver": {
-          "version": "7.3.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "dev": true
-    },
-    "saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dev": true,
-      "requires": {
-        "xmlchars": "^2.2.0"
-      }
-    },
-    "schema-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
-      "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
-      "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.6",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      }
-    },
-    "select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
-      "dev": true
-    },
-    "selfsigned": {
-      "version": "1.10.8",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
-      "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
-      "dev": true,
-      "requires": {
-        "node-forge": "^0.10.0"
-      }
-    },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true
-    },
-    "semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
-      "dev": true
-    },
-    "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-      "dev": true
-    },
-    "send": {
-      "version": "0.17.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
-      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "destroy": "~1.0.4",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "~1.7.2",
-        "mime": "1.6.0",
-        "ms": "2.1.1",
-        "on-finished": "~2.3.0",
-        "range-parser": "~1.2.1",
-        "statuses": "~1.5.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          },
-          "dependencies": {
-            "ms": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-              "dev": true
-            }
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        }
-      }
-    },
-    "serialize-javascript": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
-      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "serve-index": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
-      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "batch": "0.6.1",
-        "debug": "2.6.9",
-        "escape-html": "~1.0.3",
-        "http-errors": "~1.6.2",
-        "mime-types": "~2.1.17",
-        "parseurl": "~1.3.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.6.3",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
-          "dev": true,
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.0",
-            "statuses": ">= 1.4.0 < 2"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-          "dev": true
-        }
-      }
-    },
-    "serve-static": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
-      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
-      "dev": true,
-      "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.17.1"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "shellwords": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
-      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
-      "dev": true,
-      "optional": true
-    },
-    "signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
-    },
-    "simple-is": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
-      "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
-      "dev": true
-    },
-    "simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.3.1"
-      },
-      "dependencies": {
-        "is-arrayish": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
-          "dev": true
-        }
-      }
-    },
-    "sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-      "dev": true
-    },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      }
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "sockjs": {
-      "version": "0.3.21",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
-      "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
-      "dev": true,
-      "requires": {
-        "faye-websocket": "^0.11.3",
-        "uuid": "^3.4.0",
-        "websocket-driver": "^0.7.4"
-      }
-    },
-    "sockjs-client": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz",
-      "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.2.6",
-        "eventsource": "^1.0.7",
-        "faye-websocket": "^0.11.3",
-        "inherits": "^2.0.4",
-        "json3": "^3.3.3",
-        "url-parse": "^1.4.7"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
-      }
-    },
-    "source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
-      "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
-      "dev": true
-    },
-    "spdy": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
-      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.0",
-        "handle-thing": "^2.0.0",
-        "http-deceiver": "^1.2.7",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^3.0.0"
-      }
-    },
-    "spdy-transport": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
-      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.0",
-        "detect-node": "^2.0.4",
-        "hpack.js": "^2.1.6",
-        "obuf": "^1.1.2",
-        "readable-stream": "^3.0.6",
-        "wbuf": "^1.7.3"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "sshpk": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "ssri": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-      "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.1.1"
-      }
-    },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true
-    },
-    "stack-utils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
-      "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-          "dev": true
-        }
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-      "dev": true
-    },
-    "stealthy-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
-      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
-      "dev": true
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
-      "dev": true
-    },
-    "string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
-      "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
-      "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "dev": true,
-      "requires": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      },
-      "dependencies": {
-        "is-obj": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
-          "dev": true
-        }
-      }
-    },
-    "strip-ansi": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^5.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-      "dev": true
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "style-loader": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
-      "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^2.0.0",
-        "schema-utils": "^3.0.0"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        }
-      }
-    },
-    "stylehacks": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
-      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.35",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-          "dev": true,
-          "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0"
-      }
-    },
-    "supports-hyperlinks": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
-      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      }
-    },
-    "svgo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
-      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "coa": "^2.0.2",
-        "css-select": "^2.0.0",
-        "css-select-base-adapter": "^0.1.1",
-        "css-tree": "1.0.0-alpha.37",
-        "csso": "^4.0.2",
-        "js-yaml": "^3.13.1",
-        "mkdirp": "~0.5.1",
-        "object.values": "^1.1.0",
-        "sax": "~1.2.4",
-        "stable": "^0.1.8",
-        "unquote": "~1.1.1",
-        "util.promisify": "~1.0.0"
-      }
-    },
-    "symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-      "dev": true
-    },
-    "table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      }
-    },
-    "table-layout": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
-      "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
-      "dev": true,
-      "requires": {
-        "array-back": "^4.0.1",
-        "deep-extend": "~0.6.0",
-        "typical": "^5.2.0",
-        "wordwrapjs": "^4.0.0"
-      }
-    },
-    "tapable": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
-      "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
-      "dev": true
-    },
-    "tar": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
-      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
-      "dev": true,
-      "requires": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        }
-      }
-    },
-    "terminal-link": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "supports-hyperlinks": "^2.0.0"
-      }
-    },
-    "terser": {
-      "version": "5.5.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz",
-      "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==",
-      "dev": true,
-      "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        }
-      }
-    },
-    "terser-webpack-plugin": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
-      "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
-      "dev": true,
-      "requires": {
-        "jest-worker": "^26.6.1",
-        "p-limit": "^3.0.2",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
-        "source-map": "^0.6.1",
-        "terser": "^5.3.8"
-      }
-    },
-    "test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "requires": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "throat": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
-      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "thunky": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
-      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
-      "dev": true
-    },
-    "timsort": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
-      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
-      "dev": true
-    },
-    "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
-      "requires": {
-        "os-tmpdir": "~1.0.2"
-      }
-    },
-    "tmpl": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
-      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "^7.0.0"
-      }
-    },
-    "toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
-      "dev": true
-    },
-    "tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "dev": true,
-      "requires": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
-      }
-    },
-    "tr46": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
-      "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.1"
-      }
-    },
-    "tsconfig-paths": {
-      "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
-      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
-      "dev": true,
-      "requires": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        }
-      }
-    },
-    "tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "tsutils": {
-      "version": "3.17.1",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
-      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.8.1"
-      }
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
-    },
-    "type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1"
-      }
-    },
-    "type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-      "dev": true
-    },
-    "type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-      "dev": true
-    },
-    "type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "dev": true,
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      }
-    },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "requires": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "typical": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
-      "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "3.12.2",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz",
-      "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg==",
-      "dev": true
-    },
-    "unicode-canonical-property-names-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
-      "dev": true
-    },
-    "unicode-match-property-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
-      "dev": true,
-      "requires": {
-        "unicode-canonical-property-names-ecmascript": "^1.0.4",
-        "unicode-property-aliases-ecmascript": "^1.0.4"
-      }
-    },
-    "unicode-match-property-value-ecmascript": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
-      "dev": true
-    },
-    "unicode-property-aliases-ecmascript": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
-      "dev": true
-    },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      }
-    },
-    "uniq": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
-      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
-      "dev": true
-    },
-    "uniqs": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
-      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
-      "dev": true
-    },
-    "unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-      "dev": true,
-      "requires": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "unique-slug": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
-      "dev": true
-    },
-    "unquote": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
-      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
-      "dev": true
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true
-    },
-    "upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
-      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        }
-      }
-    },
-    "url-loader": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
-      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^2.0.0",
-        "mime-types": "^2.1.27",
-        "schema-utils": "^3.0.0"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        }
-      }
-    },
-    "url-parse": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
-      "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
-      "dev": true,
-      "requires": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "util.promisify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
-      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.2",
-        "has-symbols": "^1.0.1",
-        "object.getownpropertydescriptors": "^2.1.0"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
-      "dev": true
-    },
-    "uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "dev": true
-    },
-    "v8-compile-cache": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
-      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
-      "dev": true
-    },
-    "v8-to-istanbul": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz",
-      "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0",
-        "source-map": "^0.7.3"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        }
-      }
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
-      "dev": true
-    },
-    "vendors": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
-      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
-      "dev": true
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "dev": true,
-      "requires": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "dev": true,
-      "requires": {
-        "xml-name-validator": "^3.0.0"
-      }
-    },
-    "walker": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
-      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
-      "dev": true,
-      "requires": {
-        "makeerror": "1.0.x"
-      }
-    },
-    "watchpack": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz",
-      "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==",
-      "dev": true,
-      "requires": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      }
-    },
-    "wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
-      "dev": true,
-      "requires": {
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-      "dev": true
-    },
-    "webpack": {
-      "version": "5.10.2",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.10.2.tgz",
-      "integrity": "sha512-KpYTJerfb2KGxcOJNA1SMWXAf8/dxCDaQOhPIrfoV5rYceqet7OY/h3941/kuapx0noMcpTiVoNN3EHXsTYlsg==",
-      "dev": true,
-      "requires": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.45",
-        "@webassemblyjs/ast": "1.9.1",
-        "@webassemblyjs/helper-module-context": "1.9.1",
-        "@webassemblyjs/wasm-edit": "1.9.1",
-        "@webassemblyjs/wasm-parser": "1.9.1",
-        "acorn": "^8.0.4",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.3.1",
-        "eslint-scope": "^5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.1.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "pkg-dir": "^5.0.0",
-        "schema-utils": "^3.0.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.0.3",
-        "watchpack": "^2.0.0",
-        "webpack-sources": "^2.1.1"
-      }
-    },
-    "webpack-cli": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz",
-      "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==",
-      "dev": true,
-      "requires": {
-        "@webpack-cli/info": "^1.1.0",
-        "@webpack-cli/serve": "^1.1.0",
-        "colorette": "^1.2.1",
-        "command-line-usage": "^6.1.0",
-        "commander": "^6.2.0",
-        "enquirer": "^2.3.6",
-        "execa": "^4.1.0",
-        "import-local": "^3.0.2",
-        "interpret": "^2.2.0",
-        "leven": "^3.1.0",
-        "rechoir": "^0.7.0",
-        "v8-compile-cache": "^2.2.0",
-        "webpack-merge": "^4.2.2"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-          "dev": true
-        }
-      }
-    },
-    "webpack-dev-middleware": {
-      "version": "3.7.3",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
-      "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
-      "dev": true,
-      "requires": {
-        "memory-fs": "^0.4.1",
-        "mime": "^2.4.4",
-        "mkdirp": "^0.5.1",
-        "range-parser": "^1.2.1",
-        "webpack-log": "^2.0.0"
-      },
-      "dependencies": {
-        "mime": {
-          "version": "2.5.2",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
-          "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
-          "dev": true
-        }
-      }
-    },
-    "webpack-dev-server": {
-      "version": "3.11.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
-      "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
-      "dev": true,
-      "requires": {
-        "ansi-html": "0.0.7",
-        "bonjour": "^3.5.0",
-        "chokidar": "^2.1.8",
-        "compression": "^1.7.4",
-        "connect-history-api-fallback": "^1.6.0",
-        "debug": "^4.1.1",
-        "del": "^4.1.1",
-        "express": "^4.17.1",
-        "html-entities": "^1.3.1",
-        "http-proxy-middleware": "0.19.1",
-        "import-local": "^2.0.0",
-        "internal-ip": "^4.3.0",
-        "ip": "^1.1.5",
-        "is-absolute-url": "^3.0.3",
-        "killable": "^1.0.1",
-        "loglevel": "^1.6.8",
-        "opn": "^5.5.0",
-        "p-retry": "^3.0.1",
-        "portfinder": "^1.0.26",
-        "schema-utils": "^1.0.0",
-        "selfsigned": "^1.10.8",
-        "semver": "^6.3.0",
-        "serve-index": "^1.9.1",
-        "sockjs": "^0.3.21",
-        "sockjs-client": "^1.5.0",
-        "spdy": "^4.0.2",
-        "strip-ansi": "^3.0.1",
-        "supports-color": "^6.1.0",
-        "url": "^0.11.0",
-        "webpack-dev-middleware": "^3.7.2",
-        "webpack-log": "^2.0.0",
-        "ws": "^6.2.1",
-        "yargs": "^13.3.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "dev": true
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
-        },
-        "cliui": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-          "dev": true,
-          "requires": {
-            "string-width": "^3.1.0",
-            "strip-ansi": "^5.2.0",
-            "wrap-ansi": "^5.1.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.0",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "import-local": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-          "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
-          "dev": true,
-          "requires": {
-            "pkg-dir": "^3.0.0",
-            "resolve-cwd": "^2.0.0"
-          }
-        },
-        "is-absolute-url": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-          "dev": true
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-          "dev": true,
-          "requires": {
-            "find-up": "^3.0.0"
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "resolve-cwd": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-          "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^3.0.0"
-          }
-        },
-        "resolve-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        },
-        "wrap-ansi": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.0",
-            "string-width": "^3.0.0",
-            "strip-ansi": "^5.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.0",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            }
-          }
-        },
-        "ws": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
-          "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
-          "dev": true,
-          "requires": {
-            "async-limiter": "~1.0.0"
-          }
-        },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
-        }
-      }
-    },
-    "webpack-log": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
-      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^3.0.0",
-        "uuid": "^3.3.2"
-      },
-      "dependencies": {
-        "ansi-colors": {
-          "version": "3.2.4",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
-          "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
-          "dev": true
-        }
-      }
-    },
-    "webpack-merge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
-      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.15"
-      }
-    },
-    "webpack-sources": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
-      "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
-      "dev": true,
-      "requires": {
-        "source-list-map": "^2.0.1",
-        "source-map": "^0.6.1"
-      }
-    },
-    "websocket-driver": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
-      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
-      "dev": true,
-      "requires": {
-        "http-parser-js": ">=0.5.1",
-        "safe-buffer": ">=5.1.0",
-        "websocket-extensions": ">=0.1.1"
-      }
-    },
-    "websocket-extensions": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
-      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
-      "dev": true
-    },
-    "whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "dev": true,
-      "requires": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
-      "dev": true
-    },
-    "whatwg-url": {
-      "version": "8.4.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz",
-      "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==",
-      "dev": true,
-      "requires": {
-        "lodash.sortby": "^4.7.0",
-        "tr46": "^2.0.2",
-        "webidl-conversions": "^6.1.0"
-      }
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "which-pm-runs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
-      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
-      "dev": true
-    },
-    "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "dev": true
-    },
-    "wordwrapjs": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
-      "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
-      "dev": true,
-      "requires": {
-        "reduce-flatten": "^2.0.0",
-        "typical": "^5.0.0"
-      }
-    },
-    "wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
-    "write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "ws": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz",
-      "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==",
-      "dev": true
-    },
-    "xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
-      "dev": true
-    },
-    "xmlchars": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
-      "dev": true
-    },
-    "y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
-      "dev": true
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "yaml": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
-      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
-      "dev": true
-    },
-    "yargs": {
-      "version": "15.4.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
-      "dev": true,
-      "requires": {
-        "cliui": "^6.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^4.1.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^4.2.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^18.1.2"
-      },
-      "dependencies": {
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "18.1.3",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        }
-      }
-    },
-    "yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true
-    }
-  }
-}
diff --git a/public/assets/plugins/angular-material-form-builder/package.json b/public/assets/plugins/angular-material-form-builder/package.json
index bb37f4d..17465a3 100644
--- a/public/assets/plugins/angular-material-form-builder/package.json
+++ b/public/assets/plugins/angular-material-form-builder/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@xenialab/angular-material-form-builder",
-  "version": "1.1.0",
+  "version": "1.2.0",
   "description": "Form builder for Angular Material (AngularJS version)",
   "main": "dist/angular-material-form-builder.min.js",
   "scripts": {
@@ -10,7 +10,8 @@
     "lint": "eslint src/",
     "lint-fix": "eslint src/ --fix",
     "prettify": "prettier --write src/",
-    "test": "jest"
+    "test": "jest",
+    "prepare": "husky install"
   },
   "repository": {
     "type": "git",
@@ -27,7 +28,8 @@
     "Daniele Cinti <[email-masked]>",
     "Andrea Bianco <[email-masked]>",
     "Vito Macchia <[email-masked]>",
-    "Marco Messina <[email-masked]>"
+    "Marco Messina <[email-masked]>",
+    "Rodolfo Bevione <[email-masked]>"
   ],
   "engines": {
     "node": ">=14",
@@ -45,55 +47,50 @@
     "angular": "^1.8.2",
     "angular-animate": "^1.8.2",
     "angular-aria": "^1.8.2",
-    "angular-material": "^1.1.26",
+    "angular-material": ">=1.1.26 <=1.2.3",
     "angular-messages": "^1.8.2",
-    "angular-sortable-view": "0.0.17",
+    "angular-sortable-view": ">=0.0.17",
     "mdi": "^2.2.43"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.10",
-    "@babel/preset-env": "^7.12.10",
-    "@types/jest": "^26.0.19",
+    "@babel/core": "^7.15.8",
+    "@babel/preset-env": "^7.15.8",
+    "@types/jest": "^27.0.2",
     "angular": "^1.8.2",
     "angular-animate": "^1.8.2",
     "angular-aria": "^1.8.2",
-    "angular-material": "^1.1.26",
+    "angular-material": "^1.2.3",
     "angular-messages": "^1.8.2",
     "angular-mocks": "^1.8.2",
-    "angular-sortable-view": "0.0.17",
+    "angular-sortable-view": "0.0.21",
     "angularjs-jest": "^0.1.4",
-    "babel-loader": "^8.2.2",
+    "babel-loader": "^8.2.3",
     "babel-plugin-angularjs-annotate": "^0.10.0",
-    "clean-webpack-plugin": "^3.0.0",
-    "css-loader": "^5.0.1",
-    "css-minimizer-webpack-plugin": "^1.1.5",
-    "eslint": "^7.15.0",
+    "clean-webpack-plugin": "^4.0.0",
+    "css-loader": "^6.5.0",
+    "css-minimizer-webpack-plugin": "^3.1.1",
+    "eslint": "^8.1.0",
     "eslint-config-node": "^4.1.0",
-    "eslint-loader": "^4.0.2",
-    "eslint-plugin-import": "^2.22.1",
-    "eslint-plugin-jest": "^24.1.3",
+    "eslint-plugin-import": "^2.25.2",
+    "eslint-plugin-jest": "^25.2.2",
     "eslint-plugin-node": "^11.1.0",
-    "husky": "^4.3.6",
-    "jest": "^26.6.3",
+    "eslint-webpack-plugin": "^3.1.0",
+    "husky": "^7.0.0",
+    "jest": "^27.3.1",
     "jest-raw-loader": "^1.0.1",
-    "lint-staged": "^10.5.3",
+    "lint-staged": "^11.2.6",
     "mdi": "^2.2.43",
-    "mini-css-extract-plugin": "^1.3.3",
-    "prettier": "^2.2.1",
+    "mini-css-extract-plugin": "^2.4.3",
+    "prettier": "^2.4.1",
     "raw-loader": "^4.0.2",
-    "sass": "^1.30.0",
-    "sass-loader": "^10.1.0",
-    "style-loader": "^2.0.0",
-    "terser-webpack-plugin": "^5.0.3",
+    "sass": "^1.43.4",
+    "sass-loader": "^12.3.0",
+    "style-loader": "^3.3.1",
+    "terser-webpack-plugin": "^5.2.4",
     "url-loader": "^4.1.1",
-    "webpack": "^5.10.2",
-    "webpack-cli": "^4.2.0",
-    "webpack-dev-server": "^3.11.2"
-  },
-  "husky": {
-    "hooks": {
-      "pre-commit": "lint-staged"
-    }
+    "webpack": "^5.61.0",
+    "webpack-cli": "^4.9.1",
+    "webpack-dev-server": "^4.4.0"
   },
   "lint-staged": {
     "./*.js": [
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-item.tpl.html
deleted file mode 100644
index 071e514..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-item.tpl.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<div
-  class="sortable-container"
-  layout="column"
-  sv-root
-  sv-part="Agreement.item.options"
->
-  <!-- <div class="option-item" layout="row" ng-repeat="option in Agreement.item.options track by $index" sv-element>
-    <md-input-container class="md-block">
-      <label>Option {{$index + 1}}</label>
-      <input ng-model="option.value" />
-    </md-input-container>
-  </div> -->
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-view.tpl.html
deleted file mode 100644
index 120a1ab..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/agreement-item/agreement-view.tpl.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<md-input-container>
-  <div
-    layout="{{AgreementView.formItem.config.direction == 'horizontal' ? 'row' : 'columb'}}"
-  >
-    <md-checkbox
-      ng-model="AgreementView.formItem.options[0].selected"
-      ng-change="AgreementView.toggleSelectedOption(option)"
-      ng-disabled="AgreementView.disableOptions && !option.selected"
-      aria-label="..."
-      >{{AgreementView.formItem.options[0].value}}</md-checkbox
-    >
-  </div>
-
-  <div ng-messages="AgreementView.form.$error">
-    <div ng-message="minSelections">
-      Must select {{AgreementView.formItem.maxSelections || 1}} items
-    </div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-item.tpl.html
deleted file mode 100644
index ce348a8..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-item.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<div
-  class="sortable-container"
-  layout="column"
-  sv-root
-  sv-part="Checkboxes.item.options"
->
-  <md-input-container class="md-block">
-    <label>Max Selections</label>
-    <input type="number" ng-model="Checkboxes.item.config.maxSelections" />
-  </md-input-container>
-
-  <md-switch
-    ng-model="Checkboxes.item.config.direction"
-    ng-true-value="'horizontal'"
-    ng-false-value="'vertical'"
-  >
-    Layout direction ({{Checkboxes.item.config.direction == 'horizontal' ?
-    'Horizontal' : 'Vertical'}})
-  </md-switch>
-
-  <div
-    class="option-item"
-    layout="row"
-    ng-repeat="option in Checkboxes.item.options track by $index"
-    sv-element
-  >
-    <md-button
-      class="md-button handle"
-      md-no-ink
-      aria-label="reorder option item"
-      sv-handle
-    >
-      <md-icon class="material-icons">reorder</md-icon>
-    </md-button>
-
-    <md-input-container class="md-block">
-      <label>Option {{$index + 1}}</label>
-      <input ng-model="option.value" />
-    </md-input-container>
-
-    <md-button class="md-button" ng-click="Checkboxes.deleteOption($index)">
-      <md-icon class="material-icons">delete</md-icon>
-    </md-button>
-  </div>
-  <div layout="row" layout-align="start">
-    <md-button
-      class="md-primary add-option-button"
-      ng-click="Checkboxes.addOption()"
-    >
-      <md-icon class="material-icons">add</md-icon>
-    </md-button>
-  </div>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-view.tpl.html
deleted file mode 100644
index de22d81..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/checkboxes-item/checkboxes-view.tpl.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<md-input-container>
-  <div
-    layout="{{CheckboxesView.formItem.config.direction == 'horizontal' ? 'row' : 'column'}}"
-  >
-    <md-checkbox
-      ng-repeat="option in CheckboxesView.formItem.options track by $index"
-      ng-model="option.selected"
-      ng-change="CheckboxesView.toggleSelectedOption(option)"
-      ng-disabled="CheckboxesView.disableOptions && !option.selected"
-      aria-label="..."
-      >{{option.value}}</md-checkbox
-    >
-  </div>
-
-  <div ng-messages="CheckboxesView.form.$error">
-    <div ng-message="minSelections">
-      Must select {{CheckboxesView.formItem.maxSelections || 1}} items
-    </div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-item/form-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-item/form-item.tpl.html
deleted file mode 100644
index 2ad4766..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-item/form-item.tpl.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<div class="form-item-container md-inline-form">
-  <div class="form-item-actions">
-    <md-button
-      class="md-button"
-      ng-if="FormItem.Attrs.onDelete"
-      ng-click="FormItem.deleteClicked()"
-    >
-      <md-icon class="material-icons small">delete</md-icon>
-    </md-button>
-    <md-button
-      class="md-button"
-      ng-if="FormItem.Attrs.onUp"
-      ng-click="FormItem.onUp({item: FormItem.item, index: FormItem.index()})"
-    >
-      <md-icon class="material-icons small">arrow_drop_up</md-icon>
-    </md-button>
-    <md-button
-      class="md-button"
-      ng-if="FormItem.Attrs.onDown"
-      ng-click="FormItem.onDown({item: FormItem.item, index: FormItem.index()})"
-    >
-      <md-icon class="material-icons small">arrow_drop_down</md-icon>
-    </md-button>
-  </div>
-
-  <md-input-container ng-if="FormItem.item.type != 'label'" class="md-block">
-    <label>Field Title</label>
-    <input ng-model="FormItem.item.props.title" />
-  </md-input-container>
-
-  <md-input-container ng-if="FormItem.item.type != 'label'" class="md-block">
-    <label>Help Text</label>
-    <input ng-model="FormItem.item.props.helpText" />
-  </md-input-container>
-
-  <md-input-container
-    ng-if="FormItem.item.type === 'agreement'"
-    class="md-block"
-  >
-    <label>Option Text</label>
-    <input ng-model="FormItem.item.options[0].value" />
-  </md-input-container>
-
-  <div ng-switch="FormItem.item.type">
-    <upload-item ng-switch-when="upload" item="FormItem.item"></upload-item>
-    <agreement-item
-      ng-switch-when="agreement"
-      item="FormItem.item"
-    ></agreement-item>
-    <label-item ng-switch-when="label" item="FormItem.item"></label-item>
-    <input-item ng-switch-when="input" item="FormItem.item"></input-item>
-    <radio-button-item
-      ng-switch-when="multipleChoices"
-      item="FormItem.item"
-    ></radio-button-item>
-    <matrix-item ng-switch-when="matrix" item="FormItem.item"></matrix-item>
-    <checkboxes-item
-      ng-switch-when="checkboxes"
-      item="FormItem.item"
-    ></checkboxes-item>
-    <textarea-item
-      ng-switch-when="textarea"
-      item="FormItem.item"
-    ></textarea-item>
-    <select-item
-      ng-switch-when="chooseFromList"
-      item="FormItem.item"
-    ></select-item>
-    <p ng-switch-default>UNKNOWN TYPE</p>
-  </div>
-
-  <md-input-container
-    ng-if="FormItem.item.type != 'label' && FormItem.item.type != 'upload'"
-    class="md-block"
-  >
-    <md-checkbox ng-model="FormItem.item.config.required"
-      >Required field</md-checkbox
-    >
-  </md-input-container>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-items-container/form-items-container.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-items-container/form-items-container.tpl.html
deleted file mode 100644
index 897131e..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-items-container/form-items-container.tpl.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div>
-  <form-item
-    ng-repeat="item in container.form.items track by $index"
-    type="{{item.type}}"
-    item="item"
-    index="$index"
-    on-delete="container.delete(item, index)"
-    on-up="container.up(item, index)"
-    on-down="container.down(item, index)"
-  >
-  </form-item>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-view/form-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-view/form-view.tpl.html
deleted file mode 100644
index 2b038a5..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/form-view/form-view.tpl.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<div class="md-inline-form">
-  <div
-    class="formItem"
-    ng-repeat="formItem in FormView.form.items track by $index"
-    ng-switch="formItem.type"
-    layout="column"
-  >
-    <ng-form name="formItemForm">
-      <div>
-        <div class="formItem-title">{{formItem.props.title}}</div>
-        <div class="formItem-help-text">{{formItem.props.helpText}}</div>
-
-        <upload-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="upload"
-        ></upload-view>
-        <agreement-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="agreement"
-        ></agreement-view>
-        <checkboxes-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="checkboxes"
-        ></checkboxes-view>
-        <radio-button-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="multipleChoices"
-        ></radio-button-view>
-        <input-view
-          form-item="formItem"
-          form="formItemForm"
-          ng-switch-when="input"
-        ></input-view>
-        <textarea-view
-          form-item="formItem"
-          form="formItemForm"
-          ng-switch-when="textarea"
-        ></textarea-view>
-        <matrix-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="matrix"
-        ></matrix-view>
-        <select-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="chooseFromList"
-        ></select-view>
-        <label-view
-          form-item="formItem"
-          is-preview="true"
-          form="formItemForm"
-          ng-switch-when="label"
-        ></label-view>
-      </div>
-    </ng-form>
-  </div>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-item.tpl.html
deleted file mode 100644
index 007fe70..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-item.tpl.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<md-input-container class="md-block">
-  <label>Placeholder</label>
-  <input type="text" ng-model="Input.item.config.placeholder" />
-</md-input-container>
-<md-input-container class="md-block">
-  <label>Type</label>
-  <md-select ng-model="Input.item.config.type">
-    <md-option value="text">Text</md-option>
-    <md-option value="number">Number</md-option>
-    <md-option value="email">Email</md-option>
-  </md-select>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-view.tpl.html
deleted file mode 100644
index 1c10269..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/input-item/input-view.tpl.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<md-input-container class="md-block">
-  <input
-    ng-model="InputView.formItem.value"
-    type="{{InputView.formItem.config.type}}"
-    placeholder="{{InputView.formItem.config.placeholder}}"
-    ng-required="InputView.formItem.config.required"
-  />
-  <div ng-messages="InputView.form.$error">
-    <div ng-message="required">This field is required</div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-item.tpl.html
deleted file mode 100644
index 96b90c6..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-item.tpl.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<md-input-container class="md-block">
-  <label>Text</label>
-  <textarea ng-model="Label.item.value" md-maxlength="150" rows="5"></textarea>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-view.tpl.html
deleted file mode 100644
index e595521..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/label-item/label-view.tpl.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<md-input-container class="md-block">
-  <md-content flex layout-padding layout="row" layout-align="center center">
-    <pre>
-      <span class="formItem-content">{{LabelView.formItem.value}}</span>
-    </pre>
-  </md-content>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-item.tpl.html
deleted file mode 100644
index f384eef..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-item.tpl.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<div
-  class="sortable-container columnContainer"
-  layout="column"
-  sv-root
-  sv-part="Matrix.item.config.columns"
->
-  <div
-    class="option-item"
-    layout="row"
-    ng-repeat="column in Matrix.item.config.columns track by $index"
-    sv-element
-  >
-    <md-button
-      class="md-button handle"
-      md-no-ink
-      aria-label="reorder option item"
-      sv-handle
-    >
-      <md-icon class="material-icons">reorder</md-icon>
-    </md-button>
-
-    <md-input-container class="input-container">
-      <label>Column {{$index + 1}}</label>
-      <input ng-model="column.value" />
-    </md-input-container>
-
-    <md-button
-      class="md-button"
-      md-no-ink
-      aria-label="delete column item"
-      ng-click="Matrix.deleteColumn($index)"
-    >
-      <md-icon class="material-icons">delete</md-icon>
-      <md-tooltip md-autohide="true">Delete</md-tooltip>
-    </md-button>
-  </div>
-  <div layout="row" layout-align="start">
-    <md-button
-      class="md-primary add-option-button"
-      md-no-ink
-      aria-label="add option item"
-      ng-click="Matrix.addColumn()"
-      >Add Column</md-button
-    >
-  </div>
-</div>
-
-<div
-  class="sortable-container rowContainer"
-  layout="column"
-  sv-root
-  sv-part="Matrix.item.config.rows"
->
-  <div
-    class="option-item"
-    layout="row"
-    ng-repeat="row in Matrix.item.config.rows track by $index"
-    sv-element
-  >
-    <md-button
-      class="md-button handle"
-      md-no-ink
-      aria-label="reorder row item"
-      sv-handle
-    >
-      <md-icon class="material-icons">reorder</md-icon>
-    </md-button>
-
-    <md-input-container class="input-container">
-      <label>Row {{$index + 1}}</label>
-      <input ng-model="row.value" />
-    </md-input-container>
-
-    <md-button
-      class="md-button"
-      md-no-ink
-      aria-label="delete row item"
-      ng-click="Matrix.deleteRow($index)"
-    >
-      <md-icon class="material-icons">delete</md-icon>
-      <md-tooltip md-autohide="true">Delete</md-tooltip>
-    </md-button>
-  </div>
-  <div layout="row" layout-align="start">
-    <md-button
-      class="md-primary add-option-button"
-      md-no-ink
-      aria-label="add row item"
-      ng-click="Matrix.addRow()"
-      >Add row</md-button
-    >
-  </div>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-view.tpl.html
deleted file mode 100644
index 051ded0..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/matrix-item/matrix-view.tpl.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<md-input-container class="matrix-container md-block" layout="column">
-  <div class="matrix">
-    <div class="matrix-row" flex layout="row">
-      <span class="matrix-cell" flex="20"></span>
-      <span
-        class="matrix-cell matrix-cell-header"
-        flex
-        ng-repeat="column in MatrixView.formItem.config.columns track by $index"
-        >{{column.value}}</span
-      >
-    </div>
-    <div
-      class="matrix-row"
-      ng-repeat="row in MatrixView.formItem.config.rows track by $index"
-      layout="row"
-    >
-      <span class="matrix-cell" flex="20" layout="column" layout-align="center"
-        >{{row.value}}</span
-      >
-      <md-radio-group
-        ng-model="row.selected"
-        ng-change="MatrixView._updateValidity()"
-        flex
-        layout="row"
-      >
-        <span
-          class="matrix-cell radio-button-cell"
-          flex
-          ng-repeat="column in MatrixView.formItem.config.columns track by $index"
-        >
-          <md-radio-button
-            value="{{column.value}}"
-            aria-label="..."
-          ></md-radio-button>
-        </span>
-      </md-radio-group>
-    </div>
-  </div>
-
-  <div ng-messages="MatrixView.form.$error">
-    <div ng-message="required">This is required</div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-item.tpl.html
deleted file mode 100644
index 95ecc06..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-item.tpl.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<div
-  class="sortable-container"
-  layout="column"
-  sv-root
-  sv-part="RadioButton.item.options"
->
-  <md-switch
-    ng-model="RadioButton.item.config.direction"
-    ng-true-value="'horizontal'"
-    ng-false-value="'vertical'"
-  >
-    Layout direction ({{RadioButton.item.config.direction == 'horizontal' ?
-    'Horizontal' : 'Vertical'}})
-  </md-switch>
-
-  <div
-    class="option-item"
-    layout="row"
-    ng-repeat="option in RadioButton.item.options track by $index"
-    sv-element
-  >
-    <md-button
-      class="md-button handle"
-      md-no-ink
-      aria-label="reorder option item"
-      sv-handle
-    >
-      <md-icon class="material-icons">reorder</md-icon>
-    </md-button>
-
-    <md-input-container class="md-block">
-      <label>Option {{$index + 1}}</label>
-      <input ng-model="option.value" />
-    </md-input-container>
-
-    <md-button
-      class="md-button md-warn"
-      ng-click="RadioButton.deleteOption($index)"
-    >
-      <md-icon class="material-icons">delete</md-icon>
-    </md-button>
-  </div>
-
-  <md-button class="md-raised md-accent" ng-click="RadioButton.addOption()"
-    >Add Option</md-button
-  >
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-view.tpl.html
deleted file mode 100644
index 73f0a55..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/radio-button-item/radio-button-view.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<md-input-container class="md-block">
-  <md-radio-group
-    name="formItemInput"
-    ng-required="RadioButtonView.formItem.config.required"
-    ng-model="RadioButtonView.formItem.value"
-    layout="{{RadioButtonView.formItem.config.direction == 'horizontal' ? 'row' : 'column'}}"
-    required
-  >
-    <md-radio-button
-      ng-repeat="option in RadioButtonView.formItem.options track by $index"
-      value="{{option.value}}"
-      aria-label="..."
-    >
-      {{option.value}}
-    </md-radio-button>
-  </md-radio-group>
-
-  <div ng-messages="RadioButtonView.form.$error">
-    <div ng-message="required">This field is required</div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-item.tpl.html
deleted file mode 100644
index 0281ca2..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-item.tpl.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<div
-  class="sortable-container"
-  layout="column"
-  sv-root
-  sv-part="Select.item.options"
->
-  <div
-    class="option-item"
-    layout="row"
-    ng-repeat="option in Select.item.options track by $index"
-    sv-element
-  >
-    <md-button
-      class="md-button handle"
-      md-no-ink
-      aria-label="reorder option item"
-      sv-handle
-    >
-      <md-icon class="material-icons">reorder</md-icon>
-    </md-button>
-
-    <md-input-container class="md-block">
-      <label>Option {{$index + 1}}</label>
-      <input ng-model="option.value" />
-    </md-input-container>
-
-    <md-button class="md-button md-warn" ng-click="Select.deleteOption($index)">
-      <md-icon class="material-icons">delete</md-icon>
-    </md-button>
-  </div>
-
-  <md-button class="md-raised md-accent" ng-click="Select.addOption()"
-    >Add Option</md-button
-  >
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-view.tpl.html
deleted file mode 100644
index 29a16dc..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/select-item/select-view.tpl.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<md-input-container class="md-block">
-  <md-select
-    name="formItemInput"
-    ng-required="SelectView.formItem.config.required"
-    ng-model="SelectView.formItem.value"
-  >
-    <md-option
-      ng-repeat="option in SelectView.formItem.options track by $index"
-      ng-value="option.value"
-      >{{ option.value }}</md-option
-    >
-  </md-select>
-  <div ng-messages="SelectView.form.$error">
-    <div ng-message="required">This field is required</div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-item.tpl.html
deleted file mode 100644
index 2364691..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-item.tpl.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<md-input-container class="md-block">
-  <label>Placeholder</label>
-  <input type="text" ng-model="Textarea.item.config.placeholder" />
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-view.tpl.html
deleted file mode 100644
index c56e967..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/textarea-item/textarea-view.tpl.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<md-input-container class="md-block">
-  <textarea
-    ng-model="TextareaView.formItem.value"
-    placeholder="{{TextareaView.formItem.config.placeholder}}"
-    ng-required="TextareaView.formItem.config.required"
-  ></textarea>
-  <div ng-messages="TextareaView.form.$error">
-    <div ng-message="required">This field is required</div>
-  </div>
-</md-input-container>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-item.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-item.tpl.html
deleted file mode 100644
index 8c144c0..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-item.tpl.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<div
-  class="sortable-container"
-  layout="column"
-  sv-root
-  sv-part="Upload.item.options"
->
-  <md-input-container class="md-block">
-    <label>Upload Button label</label>
-    <input ng-model="Upload.item.config.uploadFileButtonLabel" />
-  </md-input-container>
-
-  <md-switch
-    ng-model="Upload.item.config.multipleUpload"
-    ng-true-value="true"
-    ng-false-value="false"
-  >
-    Multiple
-  </md-switch>
-
-  <md-input-container class="md-block">
-    <span>Max File size: {{Upload.item.config.size}} Mb</span>
-    <input
-      type="number"
-      id="size"
-      name="size"
-      min="0.1"
-      max="999"
-      step="0.1"
-      aria-label="size"
-      ng-model="Upload.item.config.size"
-    />
-  </md-input-container>
-
-  <md-input-container class="md-block">
-    <label>Max file size error message</label>
-    <textarea
-      ng-model="Upload.item.config.sizeErrMessage"
-      md-maxlength="150"
-      rows="2"
-    ></textarea>
-  </md-input-container>
-
-  <md-switch
-    ng-model="Upload.item.config.showAccept"
-    ng-true-value="true"
-    ng-false-value="false"
-  >
-    Configure allowed file types
-  </md-switch>
-
-  <md-input-container class="md-block" ng-if="Upload.item.config.showAccept">
-    <label>Allowed Types</label>
-    <textarea
-      ng-model="Upload.item.config.accept"
-      md-maxlength="150"
-      rows="2"
-    ></textarea>
-  </md-input-container>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-view.tpl.html b/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-view.tpl.html
deleted file mode 100644
index 0587291..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/directives/upload-item/upload-view.tpl.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<div layout="row" class="option-item upload-item">
-  <md-input-container class="md-block" style="margin: 0">
-    <input type="file" class="ng-hide" aria-label="file" />
-    <md-input-container flex class="md-block">
-      <input
-        type="text"
-        ng-model="fileName"
-        class="ng-hide"
-        disabled
-        aria-label="fileName"
-      />
-    </md-input-container>
-  </md-input-container>
-
-  <md-button class="md-raised md-accent upload-button"
-    ><md-icon class="material-icons">attach_file</md-icon
-    ><span
-      >{{UploadView.formItem.config.uploadFileButtonLabel}}</span
-    ></md-button
-  >
-</div>
-
-<div>
-  <label></label>
-  <div
-    style="display: grid; grid-template-columns: 8em auto; align-items: center"
-    layout="row"
-    ng-repeat="option in UploadView.formItem.options track by $index"
-  >
-    <md-button ng-click="UploadView.removeItem($index)" class="md-icon-button">
-      <md-icon class="material-icons">close</md-icon>
-    </md-button>
-    <span>{{option.name}}</span>
-  </div>
-</div>
diff --git a/public/assets/plugins/angular-material-form-builder/src/lib/index.scss b/public/assets/plugins/angular-material-form-builder/src/lib/index.scss
deleted file mode 100644
index 5326fa6..0000000
--- a/public/assets/plugins/angular-material-form-builder/src/lib/index.scss
+++ /dev/null
@@ -1,116 +0,0 @@
-@import url(https://fonts.googleapis.com/icon?family=Material+Icons);
-
-$button-dim: 36px;
-
-.main-view {
-  .content {
-    .builder,
-    .view,
-    .json {
-      border-right: 1px solid #cccccc;
-      height: 800px;
-      overflow: auto;
-    }
-  }
-}
-
-.builder-icon {
-  min-height: $button-dim;
-  min-width: $button-dim;
-  height: $button-dim;
-  width: $button-dim;
-  line-height: 0;
-}
-
-form-item {
-  .option-item {
-    min-height: 75px;
-
-    .md-button {
-      @extend .builder-icon;
-      line-height: 0;
-      margin-top: 20px;
-
-      &.handle:active,
-      &.handle:hover {
-        cursor: move;
-      }
-    }
-  }
-
-  .form-item-container {
-    position: relative;
-    padding-top: 30px;
-
-    .form-item-actions {
-      position: absolute;
-      right: 20px;
-      top: 0;
-    }
-
-    .md-button {
-      @extend .builder-icon;
-    }
-  }
-}
-
-form-view {
-  .formItem-title {
-    font-size: 18px;
-  }
-
-  .formItem-content {
-    font-size: 18px;
-  }
-
-  .formItem-help-text {
-    font-size: 14px;
-    color: #6c6c6c;
-  }
-
-  .matrix-container {
-    overflow: auto;
-
-    .matrix {
-      .matrix-row {
-        border-bottom: 1px solid #4caf50;
-      }
-
-      .matrix-cell {
-        text-align: center;
-        overflow: hidden;
-      }
-
-      md-radio-button {
-        .md-label {
-          margin-left: 0;
-          margin-right: 0;
-        }
-      }
-
-      md-radio-button,
-      .md-switch-thumb {
-        margin: 15px 0;
-      }
-    }
-  }
-}
-
-i.material-icons {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-
-  &.medium {
-    font-size: 36px;
-  }
-}
-
-.md-button.upload-button {
-  padding: 0 16px;
-  height: 36px;
-  md-icon {
-    font-size: 16px;
-  }
-}
diff --git a/public/assets/plugins/jscookie/js.cookie.min.js b/public/assets/plugins/jscookie/js.cookie.min.js
new file mode 100644
index 0000000..1549485
--- /dev/null
+++ b/public/assets/plugins/jscookie/js.cookie.min.js
@@ -0,0 +1,2 @@
+/*! js-cookie v3.0.0-rc.1 | MIT */
diff --git a/public/index.html b/public/index.html
index e57d337..0d1ed53 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,34 +1,36 @@
-<!doctype html>
+<!DOCTYPE html>
 <html ng-app="motion">
 
 <head>
-  <base href="/">
-  <meta charset="utf-8">
-  <meta name="description" content="">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <base href="/" />
+  <meta charset="utf-8" />
+  <meta name="description" content="" />
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
   <title id="pageTitle">xCALLY Motion</title>
 
   <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
 
   <link rel="icon" href="/api/settings/1/favicon" />
 
-  <link rel="stylesheet" href="assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css">
+  <link rel="stylesheet" href="assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.css" />
 
   <link rel="stylesheet" href="styles/vendor.31358ad3.css">
 
-  <link rel="stylesheet" href="styles/app.7678e788.css">
+  <link rel="stylesheet" href="styles/app.afa72799.css">
 
   <!-- <link href='//fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700italic,700,900,900italic'
               rel='stylesheet' type='text/css'> -->
 </head>
 
 <!--[if lt IE 10]>
-    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade
-        your browser</a> to improve your experience.</p>
-    <![endif]-->
+    <p class="browsehappy">
+      You are using an <strong>outdated</strong> browser. Please
+      <a href="http://browsehappy.com/">upgrade your browser</a> to improve your
+      experience.
+    </p>
+  <![endif]-->
 
 <body md-theme="{{vm.themes.active.name}}" md-theme-watch ng-controller="IndexController as vm" class="{{state.current.bodyClass || ''}}" dir="{{vm.direction}}">
-
   <!-- SPLASH SCREEN -->
   <ms-splash-screen id="splash-screen">
     <div class="center">
@@ -66,7 +68,7 @@
   <script src="assets/plugins/angular-material-form-builder/dist/angular-material-form-builder.min.js"></script>
   <!-- ANGULAR-MATERIAL-FORM-BUILDER -->
 
-  <script src="scripts/app.9665f55f.js"></script>
+  <script src="scripts/app.aff19bf0.js"></script>
 
   <!-- CKEDITOR -->
   <script src="assets/plugins/ckeditor/ckeditor.js"></script>
@@ -80,6 +82,10 @@
   <script type="text/javascript" src="/socket.io/socket.io.js"></script>
   <!-- Socket.io -->
 
+  <!-- JSCOOKIE -->
+  <script src="assets/plugins/jscookie/js.cookie.min.js"></script>
+  <!-- JSCOOKIE -->
+
   <!-- Jira report issue -->
   <!-- <script type="text/javascript" src="https://track.xcallymotion.com/s/90265372adde7bfa418545eae35b3bba-T/fkd960/72003/b6b48b2829824b869586ac216d119363/2.0.21/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=en-US&collectorId=e823d908"></script> -->
   <!-- /Jira report issue -->
diff --git a/public/scripts/app.9665f55f.js b/public/scripts/app.aff19bf0.js
similarity index 52%
rename from public/scripts/app.9665f55f.js
rename to public/scripts/app.aff19bf0.js
index 108fcdf..db6ba85 100644
--- a/public/scripts/app.9665f55f.js
+++ b/public/scripts/app.aff19bf0.js
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/public/styles/app.7678e788.css b/public/styles/app.7678e788.css
deleted file mode 100644
index 2c1731d..0000000
--- a/public/styles/app.7678e788.css
+++ /dev/null
@@ -1 +0,0 @@
\ No newline at end of file
diff --git a/public/styles/app.afa72799.css b/public/styles/app.afa72799.css
new file mode 100644
index 0000000..11e0350
--- /dev/null
+++ b/public/styles/app.afa72799.css
@@ -0,0 +1 @@
\ No newline at end of file
diff --git a/public/tvox/answer.controller.js b/public/tvox/answer.controller.js
new file mode 100644
index 0000000..9aa5de5
--- /dev/null
+++ b/public/tvox/answer.controller.js
@@ -0,0 +1,575 @@
+// Include app dependency on ngMaterial
+angular.module('AnswerApp', ['ngMaterial', 'ngCookies', 'motion', 'ngResource', 'flow', 'ngSanitize'])
+  .controller("AnswerController", function($rootScope, $scope, $http, $cookies, socket, $location, $timeout, $document, $window) {
+    $scope.text = {
+      content: null
+    };
+    $scope.textMessage = "";
+    $scope.messageId = 0;
+    $scope.contactId = "";
+    $scope.interactionId = 0;
+    $scope.interactionClosed = false;
+    $scope.userId = "";
+    $scope.motionUrl = "";
+    $scope.chatWebsiteId = "";
+    $scope.logo = "";
+    $scope.token = "";
+    $scope.userData = {};
+    $scope.interactionData = {};
+    $scope.error_message = "";
+    $scope.messages = {
+      count: 0,
+      rows: []
+    };
+    $scope.reportMemberId = 0;
+    $scope.contactName = "";
+    $scope.ngFlowOptions = {
+      target: '/api/attachments',
+      singleFile: true,
+      maxChunkRetries: 1,
+      chunkSize: 10240000,
+      simultaneousUploads: 1,
+      testChunks: false,
+      progressCallbacksInterval: 1000,
+      allowDuplicateUploads: true
+    };
+    $scope.ngFlow = {
+      // ng-flow will be injected into here through its directive
+      flow: {}
+    };
+
+    $scope.errors = [];
+    $scope.dispositions = [];
+
+    $scope.dispo = {};
+    $scope.dispo.firstLevelDisposition = null;
+    $scope.dispo.secondLevelDisposition = null;
+    $scope.dispo.thirdLevelDisposition = null;
+    $scope.dispo.anySecondLevelDisposition = null;
+    $scope.dispo.anyThirdLevelDisposition = null;
+    $scope.dispo.mandatoryDisposition = false;
+    $scope.dispo.mandatoryDispositionPause = '';
+    $scope.dispo.note = '';
+
+    tvoxCallId = "";
+
+
+
+
+    function parseJwt(token) {
+      var base64Url = token.split('.')[1];
+      var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
+      var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
+        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+      }).join(''));
+
+      return JSON.parse(jsonPayload);
+    };
+
+
+    function closeInteraction() {
+
+
+      var msg = {
+        id: $scope.interactionId,
+        closed: true,
+        closeReason: 'contact',
+        closedAt: new Date() // moment().format('YYYY-MM-DD HH:mm:ss'),
+      };
+
+      $http.put($scope.motionUrl + "/api/chat/interactions/" + $scope.interactionId + "/custom_update", msg, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(response) {}
+      );
+
+    }
+    $scope.close = function() {
+      closeInteraction();
+    }
+
+    $scope.keyPress = function(keyEvent) {
+      if (keyEvent.which === 13)
+        if ($scope.text.content) {
+          var msg = {};
+          msg.body = $scope.text.content;
+          sendMessage(msg);
+        }
+    }
+
+
+    this.$onInit = function() {
+      var urlParams = new URLSearchParams(window.location.search);
+      var params = urlParams.get("params");
+      var arr = params.split("|");
+      if (arr) {
+        $scope.messageId = arr[0];
+        $scope.motionUrl = arr[1];
+        $scope.chatWebsiteId = arr[2];
+        $scope.interactionId = arr[3];
+      }
+
+
+      $scope.token = $cookies.get('motion.token');
+      if (_.isNil($scope.token))
+        $scope.error_message = "XCally motion token not valid, please connect to XCally Motion, then retry";
+      else {
+
+        window.addEventListener("message", function(event) {
+
+          let message = event.data;
+          if (message == null || message.namespace == null || message.namespace != 'webclient.teleniasoftware.com') {
+            console.info("Received Unknown message", message);
+            return;
+          }
+
+          if (message.event == 'callEvent') {
+            tvoxCallId = message.data.callId;
+            if (message.data.state == "IDLE") {
+              closeInteraction();
+            }
+            /*
+            if (!_primaryCallInfo) {
+                _primaryCallInfo = message.data;
+                alert(_primaryCallInfo)
+                if (_callInfoCallback !== null)
+                    _callInfoCallback(_primaryCallInfo);
+            } */
+          }
+        }, false);
+        tvoxSendReadyEvent();
+        var js = parseJwt($scope.token);
+        $scope.userId = js.id;
+        $rootScope.userId = js.id;
+        $http.get($scope.motionUrl + "/api/users/" + $scope.userId, {
+          headers: {
+            'Authorization': 'Bearer ' + $scope.token
+          }
+        }).
+        then(function(response) {
+          $scope.userData = response.data;
+
+          $http.get($scope.motionUrl + "/api/chat/interactions/" + $scope.interactionId, {
+            headers: {
+              'Authorization': 'Bearer ' + $scope.token
+            }
+          }).
+          then(function(response) {
+            $scope.interactionData = response.data;
+          });
+
+        });
+
+
+        socket.on('chatMessage:save', onMessageSave);
+        socket.on('chatInteraction:save', onInteractionSave);
+        socket.on('chatInteraction:update', onInteractionSave);
+
+
+        $http.get($scope.motionUrl + "/api/chat/websites/" + $scope.chatWebsiteId, {
+          headers: {
+            'Authorization': 'Bearer ' + $scope.token
+          }
+        }).
+        then(
+          function successCallback(response) {
+            $scope.dispo.mandatoryDisposition = response.mandatoryDisposition;
+
+            //if ($scope.mandatoryDisposition) {
+            //$scope.mandatoryDispositionPause = response.mandatoryDispositionPause.name;
+            //}
+
+            $scope.logo = $scope.motionUrl + "/api/chat/websites/" + $scope.chatWebsiteId + "/logo?token=" + response.token;
+            $http({
+                url: $scope.motionUrl + "/api/chat/messages/" + $scope.messageId + "/accept",
+                method: "PUT",
+                headers: {
+                  'Authorization': 'Bearer ' + $scope.token
+                },
+                data: {
+                  id: $scope.messageId,
+                  UserId: $scope.userId,
+                  manual: true
+                }
+              })
+              .then(function(message) {
+                  $scope.userId = message.data.interaction.UserId;
+                  $scope.contactId = message.data.interaction.ContactId;
+                  $http.get($scope.motionUrl + "/api/chat/interactions/" + message.data.interaction.id + "/messages", {
+                    headers: {
+                      'Authorization': 'Bearer ' + $scope.token
+                    }
+                  }).
+                  then(
+                    function ret(response) {
+                      $scope.messages.rows = response.data.rows;
+                      $http.get($scope.motionUrl + "/api/cm/contacts/" + $scope.contactId, {
+                        headers: {
+                          'Authorization': 'Bearer ' + $scope.token
+                        }
+                      }).
+                      then(
+                        function ret(contact) {
+                          var fn = "";
+                          var ln = "";
+                          $scope.contactData = contact.data;
+                          if (contact.data.firstName !== null)
+                            fn = contact.data.firstName;
+                          if (contact.data.lastName !== null)
+                            ln = contact.data.lastName;
+                          $scope.contactName = fn + " " + ln;
+                          createReportSession();
+                          loadDispositions();
+                        }
+                      );
+                    }
+                  );
+                },
+                function(err) {
+                  $http.get($scope.motionUrl + "/api/chat/interactions/" + $scope.interactionId + "/messages", {
+                    headers: {
+                      'Authorization': 'Bearer ' + $scope.token
+                    }
+                  }).
+                  then(
+                    function ret(response) {
+                      $scope.messages.rows = response.data.rows;
+                      $http.get($scope.motionUrl + "/api/chat/interactions/" + $scope.interactionId, {
+                        headers: {
+                          'Authorization': 'Bearer ' + $scope.token
+                        }
+                      }).
+                      then(
+                        function ret(response) {
+                          $scope.userId = response.data.UserId;
+                          $scope.contactId = response.data.ContactId;
+                          $http.get($scope.motionUrl + "/api/cm/contacts/" + $scope.contactId, {
+                            headers: {
+                              'Authorization': 'Bearer ' + $scope.token
+                            }
+                          }).
+                          then(
+                            function ret(contact) {
+                              $scope.contactData = contact.data;
+                              var fn = "";
+                              var ln = "";
+                              if (contact.data.firstName !== null)
+                                fn = contact.data.firstName;
+                              if (contact.data.lastName !== null)
+                                ln = contact.data.lastName;
+                              $scope.contactName = fn + " " + ln;
+                              createReportSession();
+                              loadDispositions();
+
+                            }
+                          );
+                        }
+                      );
+                    }
+                  );
+                });
+          },
+          function errorCallback(response) {
+            console.log("Unable to perform get request", response);
+          }
+        );
+
+      }
+    }
+
+    function createReportSession() {
+      if ($scope.reportMemberId > 0) {
+        closeReportSession(true);
+      } else {
+        openReportSession();
+      }
+    }
+
+    function openReportSession() {
+      var obj = {
+        channel: "tvox",
+        membername: $scope.userData.name,
+        interface: $scope.userData.interface,
+        type: "TVOX_SESSION",
+        enterAt: new Date(),
+        role: $scope.userData.role,
+        internal: $scope.userData.internal,
+        uniqueid: $scope.interactionId
+      };
+      $http.post($scope.motionUrl + "/api/members/reports", obj, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(response) {
+          console.log("RMID", response.data.id);
+          $scope.reportMemberId = response.data.id;
+        }
+      );
+    }
+
+    function loadDispositions() {
+      var dispositions = [];
+      var filters = "ChatWebsiteId=null&FaxAccountId=null&ListId=null&MailAccountId=null&OpenchannelAccountId=null&SmsAccountId=null&WhatsappAccountId=null&nolimit=true";
+      $http.get($scope.motionUrl + "/api/dispositions?" + filters, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(res) {
+          if (res.data.rows.length) {
+            $scope.dispositions = _.concat($scope.dispositions, res.data.rows);
+          }
+          filters = "ChatWebsiteId=" + $scope.chatWebsiteId + "&nolimit=true";
+          $http.get($scope.motionUrl + "/api/dispositions?" + filters, {
+            headers: {
+              'Authorization': 'Bearer ' + $scope.token
+            }
+          }).
+          then(
+            function ret(res) {
+              if (res.data.rows.length) {
+                $scope.dispositions = _.concat(dispositions, res.data.rows);
+
+              }
+            }
+          );
+        }
+      );
+
+    }
+
+    $scope.onDispositionChange = function(level) {
+      if (level === 'first') {
+        $scope.dispo.anySecondLevelDisposition = $scope.dispo.firstLevelDisposition ?
+          _.some($scope.dispositions, ['ParentId', $scope.dispo.firstLevelDisposition.id]) : false;
+
+        if (!$scope.dispo.firstLevelDisposition) $scope.dispo.secondLevelDisposition = undefined;
+      } else if (level === 'second') {
+        $scope.dispo.anyThirdLevelDisposition = _.some($scope.dispositions, ['ParentId', $scope.dispo.secondLevelDisposition.id]);
+      }
+    }
+
+    $scope.clearDispositionSelection = function(level) {
+      if (level === 'second') {
+        $scope.dispo.secondLevelDisposition = undefined;
+        $scope.dispo.thirdLevelDisposition = undefined;
+      } else if (level === 'third') {
+        $scope.dispo.thirdLevelDisposition = undefined;
+      }
+    }
+
+
+    $scope.upload = function() {
+      // Set headers
+      $scope.ngFlow.flow.opts.headers = {
+        'X-Requested-With': 'XMLHttpRequest',
+        Authorization: 'Bearer ' + $scope.token
+      };
+
+      $scope.ngFlow.flow.upload();
+    }
+
+
+
+
+    $scope.send = function() {
+      if ($scope.text.content) {
+        var msg = {};
+        msg.body = $scope.text.content;
+
+        sendMessage(msg);
+      }
+    }
+
+    function sendMessage(msg) {
+      if (msg) {
+        msg.ChatInteractionId = $scope.interactionId;
+        msg.ChatWebsiteId = $scope.chatWebsiteId;
+        msg.ContactId = $scope.contactId;
+        msg.UserId = $scope.userId;
+        msg.direction = "out";
+        msg.secret = false;
+
+        $http.post($scope.motionUrl + "/api/chat/messages", msg, {
+          headers: {
+            'Authorization': 'Bearer ' + $scope.token
+          }
+        }).
+        then(
+          function ret(response) {
+            $scope.text.content = "";
+          }
+        );
+      }
+    }
+
+    function onInteractionSave(interaction) {
+      // NOTE: return when is not a right interaction
+      if (interaction && interaction.id != $scope.interactionId) {
+        return;
+      }
+
+      if (interaction.closed) {
+        $scope.interactionClosed = true;
+        closeReportSession(false);
+      }
+    }
+
+
+    $scope.fileAdded = function(file) {
+      if (file.size > 10240000) {
+        alert("File too big");
+        /*
+          toasty.error({
+            title: 'File too big',
+            msg: 'The max allowed size is ' + maxFileSizeMb + 'MB'
+          });
+          */
+        return false;
+      }
+
+      return true;
+    }
+
+    /**
+     * Success
+     * Automatically triggers when files added to the uploader
+     */
+    $scope.fileSuccess = function(file, message) {
+      var attachment = JSON.parse(message);
+      var body = attachment.name;
+
+
+      body =
+        '<a href="' +
+        ($location.protocol() + '://' + $location.host()) +
+        '/api/chat/interactions/' +
+        $scope.interactionId +
+        '/attachment_download?attachId=' +
+        attachment.id +
+        '&token=' +
+        $scope.token +
+        '" target="_self">' +
+        attachment.name +
+        '</a>';
+
+      sendMessage({
+        body: body,
+        AttachmentId: attachment.id
+      });
+    }
+
+    $scope.saveDisposition = function() {
+
+      var obj = {
+        closed: true,
+        closeReason: 'agent',
+        disposition: $scope.dispo.firstLevelDisposition ? $scope.dispo.firstLevelDisposition.name : null,
+        secondDisposition: $scope.dispo.secondLevelDisposition ? $scope.dispo.secondLevelDisposition.name : undefined,
+        thirdDisposition: $scope.dispo.thirdLevelDisposition ? $scope.dispo.thirdLevelDisposition.name : undefined,
+        mote: $scope.dispo.note
+      };
+
+      $http.put($scope.motionUrl + "/api/chat/interactions/" + $scope.interactionId, obj, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(response) {
+          if ($scope.reportMemberId > 0)
+            closeReportSession(false);
+          tvoxCloseInteraction(tvoxCallId);
+
+        }
+      );
+
+    }
+
+
+    function scrollToBottom() {
+      $timeout(function() {
+        var interactionContent = angular.element($document.find("md-content"));
+        if (interactionContent && interactionContent[0]) {
+          interactionContent[0].scrollTop = interactionContent[0].scrollHeight;
+        }
+      }, 0);
+    }
+
+
+    function onMessageSave(msg) {
+      var found = false;
+
+      if (msg.ChatWebsiteId == $scope.chatWebsiteId && msg.ChatInteractionId == $scope.interactionId) {
+        if ($scope.messages) {
+          found = _.find($scope.messages.rows, {
+            id: msg.id
+          });
+        } else {
+          $scope.messages = {
+            rows: [],
+            count: 0
+          };
+        }
+
+        if (found) {
+          _.merge(found, msg);
+        } else {
+          $scope.messages.rows.push(msg);
+          if (msg.direction == "in") {
+            $http.put($scope.motionUrl + "/api/chat/messages/" + msg.id + "/accept", {
+              id: msg.id,
+              UserId: $scope.userId
+            }, {
+              headers: {
+                'Authorization': 'Bearer ' + $scope.token
+              }
+            }).
+            then(
+              function ret(response) {}
+            );
+          }
+
+        }
+        scrollToBottom();
+      }
+    }
+
+    $scope.accept = function(event) {}
+
+    $window.onfocus = function() {
+      createReportSession();
+    }
+    $window.onblur = function() {
+      if ($scope.reportMemberId > 0) {
+        closeReportSession(false);
+      }
+    }
+
+    function closeReportSession(openNewSession) {
+      var obj = {
+        exitAt: new Date()
+      };
+      $http.put($scope.motionUrl + "/api/members/reports/" + $scope.reportMemberId, obj, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(response) {
+          $scope.reportMemberId = 0;
+          if (openNewSession) {
+            openReportSession();
+          }
+        }
+      );
+
+    }
+
+  });
\ No newline at end of file
diff --git a/public/tvox/answer.html b/public/tvox/answer.html
new file mode 100644
index 0000000..36fd6cd
--- /dev/null
+++ b/public/tvox/answer.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+
+<head>
+  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
+  <link rel="stylesheet" href="css/angular-material.min.css">
+  <link rel="stylesheet" href="css/style.css">
+</head>
+
+<body ng-app="AnswerApp">
+  <div ng-controller="AnswerController" layout="row" layout-fill>
+    <div ng-if="error_message!=''">{{error_message}}</div>
+    <div ng-if="error_message==''" layout="column" layout-fill>
+      <div flex="1">
+        <div layout="row" layout-align="space-between center">
+
+          <img width=100 layout-align="center" layout="row" src="{{logo}}">
+          <div layout-align="end">
+            Client informations:
+            <div>
+              <table class="legenda">
+                <tr>
+                  <td><strong>First name:</strong></td>
+                  <td>{{contactData.firstName}}</td>
+                </tr>
+                <tr>
+                  <td><strong>Last name:</strong></td>
+                  <td>{{contactData.lastName}}</td>
+                </tr>
+                <tr>
+                  <td><strong>Email:</strong></td>
+                  <td>{{contactData.email}}</td>
+                </tr>
+                <tr>
+                  <td><strong>IP Address:</strong></td>
+                  <td>{{interactionData.customerIp}}</td>
+                </tr>
+                <tr>
+                  <td><strong>Website:</strong></td>
+                  <td>{{interactionData.referer}}</td>
+                </tr>
+                <tr>
+                  <td><strong>Browser:</strong></td>
+                  <td>{{interactionData.browserName}}</td>
+                </tr>
+              </table>
+            </div>
+          </div>
+        </div>
+        <br>
+      </div>
+      <md-content flex="grow" style="overflow-y:auto;padding:10px" ng-if="!interactionClosed">
+        <div ng-repeat="message in messages.rows" class="message">
+          <div ng-if="message.direction=='in'" layout="row" layout-align="start">
+            <div style="display:inline-block">
+              <span class="message-data-name">{{contactName}}</span>
+              <span class="message-data-time">{{message.createdAt.substring(11,16)}}</span>
+              <div class="user-message" ng-bind-html="message.body">
+              </div>
+            </div>
+          </div>
+          <div ng-if="message.direction=='out'" layout="row" layout-align="end">
+            <div style="display:inline-block">
+              <span class="message-data-time">{{message.createdAt.substring(11,16)}}</span>
+              <div class="agent-message" ng-bind-html="message.body">
+              </div>
+            </div>
+          </div>
+        </div>
+      </md-content>
+      <div layout="row" flex="1" layout-align="start center" ng-if="!interactionClosed" class="block-footer">
+        <md-input-container style="width:100%" class="md-block">
+          <label>Post your message</label>
+          <textarea ng-model="text.content" rows="2" ng-keypress="keyPress($event)" md-select-on-focus></textarea>
+        </md-input-container>
+        <md-button ng-click="send()" class="md-raised md-primary">Send</md-button>
+        <md-button aria-label="attachment" flow-btn flow-name="ngFlow.flow" flow-files-submitted="upload()" flow-init="ngFlowOptions" class="md-raised md-primary" flow-file-added="fileAdded($file)" flow-file-success="fileSuccess($file, $message)">Attach</md-button>
+      </div>
+      <div ng-if="interactionClosed">
+        <md-input-container class="md-block">
+          <label>Disposition</label>
+          <md-select name="disposition" ng-model="dispo.firstLevelDisposition" ng-change="onDispositionChange('first')" required>
+            <md-option ng-value="null" ng-if="!dispo.mandatoryDisposition">NONE</md-option>
+            <md-option ng-value="disposition" ng-repeat="disposition in dispositions | filter: { level: 'first' } : true">
+              {{ disposition.name }}</md-option>
+          </md-select>
+          <div ng-messages="dispositionForm.disposition.$error" ng-show="dispositionForm.disposition.$touched" role="alert">
+            <div ng-message="required">
+              <span>Disposition field is required</span>
+            </div>
+          </div>
+        </md-input-container>
+        <div ng-if="dispo.firstLevelDisposition && dispo.anySecondLevelDisposition" layout="row" layout-align="start center">
+          <md-input-container class="md-block" flex>
+            <label>Second Level Disposition</label>
+            <md-select name="secondLevelDisposition" ng-model="dispo.secondLevelDisposition" ng-change="onDispositionChange('second')">
+              <md-option ng-value="disposition" ng-repeat="disposition in dispositions | filter: { level: 'second', ParentId: dispo.firstLevelDisposition.id } : true">
+                {{ disposition.name }}</md-option>
+            </md-select>
+          </md-input-container>
+          <md-button ng-if="dispo.secondLevelDisposition" ng-click="clearDispositionSelection('second')" class="md-icon-button">
+            <md-icon md-font-icon="icon-cancel" aria-label="Clear second level disposition selection">
+            </md-icon>
+          </md-button>
+        </div>
+        <div ng-if="dispo.secondLevelDisposition && dispo.anyThirdLevelDisposition" layout="row" layout-align="start center">
+          <md-input-container class="md-block" flex>
+            <label>Third Level Disposition</label>
+            <md-select name="thirdLevelDisposition" ng-model="dispo.thirdLevelDisposition">
+              <md-option ng-value="disposition" ng-repeat="disposition in dispositions | filter: { level: 'third', ParentId: dispo.secondLevelDisposition.id } : true" ng-disabled="disposition.canSelect === false">{{ disposition.name }}</md-option>
+            </md-select>
+          </md-input-container>
+          <md-button ng-if="dispo.thirdLevelDisposition" ng-click="clearDispositionSelection('third')" class="md-icon-button">
+            <md-icon md-font-icon="icon-cancel" aria-label="Clear third level disposition selection">
+            </md-icon>
+          </md-button>
+        </div>
+
+        <md-input-container class="md-block">
+          <label>Note</label>
+          <textarea ng-model="dispo.note" md-maxlength="255" max-rows="5" autofocus></textarea>
+          <div layout="row" layout-align="center center"></div>
+          <md-button class="md-raised md-primary" ng-click="saveDisposition()">Save disposition</md-button>
+      </div>
+      </md-input-container>
+    </div>
+  </div>
+  </div>
+</body>
+
+</html>
+<script src="js/angular.min.js"></script>
+<script src="js/angular-animate.min.js"></script>
+<script src="js/angular-aria.min.js"></script>
+<script src="js/angular-messages.min.js"></script>
+<script src="js/angular-material.min.js"></script>
+<script src="js/angular-sanitize.min.js"></script>
+<script src="js/angular-cookies.min.js"></script>
+<script src="js/ng-flow-standalone.min.js"></script>
+<script type="text/javascript" src="/socket.io/socket.io.js"></script>
+<script src="js/angular-resource.js"></script>
+<script src="js/index.socket.js"></script>
+<script src="js/lodash.min.js"></script>
+<script src="js/tvox_integration.min.js"></script>
+<script type="text/javascript" src="answer.controller.js"></script>
\ No newline at end of file
diff --git a/public/tvox/css/angular-material.min.css b/public/tvox/css/angular-material.min.css
new file mode 100644
index 0000000..12f2e6f
--- /dev/null
+++ b/public/tvox/css/angular-material.min.css
@@ -0,0 +1,18778 @@
+/*!
+ * AngularJS Material Design
+ * https://github.com/angular/material
+ * @license MIT
+ * v1.2.2
+ */
+body,
+html {
+  height: 100%;
+  position: relative;
+}
+body {
+  margin: 0;
+  padding: 0;
+}
+[tabindex='-1']:focus {
+  outline: none;
+}
+.inset {
+  padding: 10px;
+}
+a.md-no-style,
+button.md-no-style {
+  font-weight: 400;
+  background-color: inherit;
+  text-align: left;
+  border: none;
+  padding: 0;
+  margin: 0;
+}
+button,
+input,
+select,
+textarea {
+  vertical-align: baseline;
+}
+button,
+html input[type='button'],
+input[type='reset'],
+input[type='submit'] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+button[disabled],
+html input[type='button'][disabled],
+input[type='reset'][disabled],
+input[type='submit'][disabled] {
+  cursor: default;
+}
+textarea {
+  vertical-align: top;
+  overflow: auto;
+}
+input[type='search'] {
+  -webkit-appearance: textfield;
+  box-sizing: content-box;
+  -webkit-box-sizing: content-box;
+}
+input[type='search']::-webkit-search-cancel-button,
+input[type='search']::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+input:-webkit-autofill {
+  text-shadow: none;
+}
+.md-visually-hidden {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  text-transform: none;
+  width: 1px;
+}
+.md-shadow {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  border-radius: inherit;
+  pointer-events: none;
+}
+.md-shadow-bottom-z-1 {
+  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+}
+.md-shadow-bottom-z-2 {
+  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4);
+}
+.md-shadow-animated.md-shadow {
+  transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+}
+.md-ripple-container {
+  pointer-events: none;
+  position: absolute;
+  overflow: hidden;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+.md-ripple {
+  position: absolute;
+  transform: translate(-50%, -50%) scale(0);
+  transform-origin: 50% 50%;
+  opacity: 0;
+  border-radius: 50%;
+}
+.md-ripple.md-ripple-placed {
+  transition: margin 0.9s cubic-bezier(0.25, 0.8, 0.25, 1),
+    border 0.9s cubic-bezier(0.25, 0.8, 0.25, 1),
+    width 0.9s cubic-bezier(0.25, 0.8, 0.25, 1),
+    height 0.9s cubic-bezier(0.25, 0.8, 0.25, 1),
+    opacity 0.9s cubic-bezier(0.25, 0.8, 0.25, 1),
+    transform 0.9s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+.md-ripple.md-ripple-scaled {
+  transform: translate(-50%, -50%) scale(1);
+}
+.md-ripple.md-ripple-active,
+.md-ripple.md-ripple-full,
+.md-ripple.md-ripple-visible {
+  opacity: 0.2;
+}
+.md-ripple.md-ripple-remove {
+  -webkit-animation: md-remove-ripple 0.9s cubic-bezier(0.25, 0.8, 0.25, 1);
+  animation: md-remove-ripple 0.9s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+@-webkit-keyframes md-remove-ripple {
+  0% {
+    opacity: 0.15;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@keyframes md-remove-ripple {
+  0% {
+    opacity: 0.15;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.md-padding {
+  padding: 8px;
+}
+.md-margin {
+  margin: 8px;
+}
+.md-scroll-mask {
+  position: absolute;
+  background-color: transparent;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 50;
+}
+.md-scroll-mask > .md-scroll-mask-bar {
+  display: block;
+  position: absolute;
+  background-color: #fafafa;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 65;
+  box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.3);
+}
+.md-no-momentum {
+  -webkit-overflow-scrolling: auto;
+}
+.md-no-flicker {
+  -webkit-filter: blur(0);
+}
+@media (min-width: 960px) {
+  .md-padding {
+    padding: 16px;
+  }
+}
+body[dir='ltr'],
+body[dir='rtl'],
+html[dir='ltr'],
+html[dir='rtl'] {
+  unicode-bidi: embed;
+}
+bdo[dir='rtl'] {
+  direction: rtl;
+  unicode-bidi: bidi-override;
+}
+bdo[dir='ltr'] {
+  direction: ltr;
+  unicode-bidi: bidi-override;
+}
+@media (max-width: 599px) {
+  .layout-row:not(.layout-xs-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-xs-row > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 16px;
+  }
+  [dir='rtl']
+    .layout-row:not(.layout-xs-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl'] .layout-xs-row > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 0;
+    margin-right: 16px;
+  }
+}
+@media (min-width: 600px) and (max-width: 959px) {
+  .layout-gt-xs-row:not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-row:not(.layout-gt-xs-column):not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-sm-row:not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 16px;
+  }
+  [dir='rtl']
+    .layout-gt-xs-row:not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-row:not(.layout-gt-xs-column):not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-sm-row:not(.layout-sm-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 0;
+    margin-right: 16px;
+  }
+}
+@media (min-width: 960px) and (max-width: 1279px) {
+  .layout-gt-sm-row:not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-md-row:not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 16px;
+  }
+  [dir='rtl']
+    .layout-gt-sm-row:not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-md-row:not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-md-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 0;
+    margin-right: 16px;
+  }
+}
+@media (min-width: 1280px) and (max-width: 1919px) {
+  .layout-gt-md-row:not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-lg-row:not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 16px;
+  }
+  [dir='rtl']
+    .layout-gt-md-row:not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-lg-row:not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 0;
+    margin-right: 16px;
+  }
+}
+@media (min-width: 1920px) {
+  .layout-gt-lg-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-md-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  .layout-xl-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 16px;
+  }
+  [dir='rtl']
+    .layout-gt-lg-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-md-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child),
+  [dir='rtl']
+    .layout-xl-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > .md-auto-horizontal-margin:not(:first-child) {
+    margin-left: 0;
+    margin-right: 16px;
+  }
+}
+body,
+html {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  -webkit-touch-callout: default;
+  min-height: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.md-display-4 {
+  font-size: 112px;
+  font-weight: 300;
+  letter-spacing: -0.01em;
+  line-height: 112px;
+}
+.md-display-3 {
+  font-size: 56px;
+  font-weight: 400;
+  letter-spacing: -0.005em;
+  line-height: 56px;
+}
+.md-display-2 {
+  font-size: 45px;
+  font-weight: 400;
+  line-height: 64px;
+}
+.md-display-1 {
+  font-size: 34px;
+  font-weight: 400;
+  line-height: 40px;
+}
+.md-headline {
+  font-size: 24px;
+  font-weight: 400;
+  line-height: 32px;
+}
+.md-title {
+  font-size: 20px;
+  font-weight: 500;
+  letter-spacing: 0.005em;
+}
+.md-subhead {
+  font-size: 16px;
+  line-height: 24px;
+}
+.md-body-1,
+.md-subhead {
+  font-weight: 400;
+  letter-spacing: 0.01em;
+}
+.md-body-1 {
+  font-size: 14px;
+  line-height: 20px;
+}
+.md-body-2 {
+  font-size: 14px;
+  font-weight: 500;
+  letter-spacing: 0.01em;
+  line-height: 24px;
+}
+.md-caption {
+  font-size: 12px;
+  letter-spacing: 0.02em;
+}
+.md-button {
+  letter-spacing: 0.01em;
+}
+button,
+html,
+input,
+select,
+textarea {
+  font-family: Roboto, Helvetica Neue, sans-serif;
+}
+button,
+input,
+select,
+textarea {
+  font-size: 100%;
+}
+.md-panel-outer-wrapper {
+  height: 100%;
+  left: 0;
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.md-panel-inner-wrapper {
+  position: fixed;
+}
+._md-panel-offscreen {
+  left: -9999px;
+}
+._md-panel-hidden {
+  display: none;
+}
+._md-panel-shown .md-panel {
+  opacity: 1;
+  transition: none;
+}
+.md-panel {
+  opacity: 0;
+  position: relative;
+}
+.md-panel._md-panel-shown {
+  opacity: 1;
+  transition: none;
+}
+.md-panel._md-panel-animate-enter {
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+.md-panel._md-panel-animate-leave {
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0.4, 0, 1, 1);
+}
+.md-panel._md-panel-animate-fade-out,
+.md-panel._md-panel-animate-scale-out {
+  opacity: 0;
+}
+.md-panel._md-panel-backdrop {
+  height: 100%;
+  position: fixed;
+  width: 100%;
+}
+.md-panel._md-opaque-enter {
+  opacity: 0.48;
+  transition: opacity 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+.md-panel._md-opaque-leave {
+  transition: opacity 0.3s cubic-bezier(0.4, 0, 1, 1);
+}
+._md-panel-fullscreen {
+  border-radius: 0;
+  left: 0;
+  min-height: 100%;
+  min-width: 100%;
+  position: fixed;
+  top: 0;
+}
+md-autocomplete {
+  border-radius: 2px;
+  display: block;
+  height: 40px;
+  position: relative;
+  overflow: visible;
+  min-width: 190px;
+}
+md-autocomplete[disabled] input {
+  cursor: default;
+}
+md-autocomplete[md-floating-label] {
+  border-radius: 0;
+  background: transparent;
+  height: auto;
+}
+md-autocomplete[md-floating-label] md-input-container {
+  padding-bottom: 0;
+}
+md-autocomplete[md-floating-label] md-autocomplete-wrap {
+  height: auto;
+}
+md-autocomplete[md-floating-label] .md-show-clear-button button {
+  display: block;
+  position: absolute;
+  right: 0;
+  top: 20px;
+  width: 30px;
+  height: 30px;
+}
+md-autocomplete[md-floating-label] .md-show-clear-button input {
+  padding-right: 30px;
+}
+[dir='rtl'] md-autocomplete[md-floating-label] .md-show-clear-button input {
+  padding-right: 0;
+  padding-left: 30px;
+}
+md-autocomplete md-autocomplete-wrap {
+  display: flex;
+  flex-direction: row;
+  box-sizing: border-box;
+  position: relative;
+  overflow: visible;
+  height: 40px;
+}
+md-autocomplete md-autocomplete-wrap.md-menu-showing {
+  z-index: 51;
+}
+md-autocomplete md-autocomplete-wrap input,
+md-autocomplete md-autocomplete-wrap md-input-container {
+  flex: 1 1 0;
+  box-sizing: border-box;
+  min-width: 0;
+}
+md-autocomplete md-autocomplete-wrap md-progress-linear {
+  position: absolute;
+  bottom: -2px;
+  left: 0;
+}
+md-autocomplete md-autocomplete-wrap md-progress-linear.md-inline {
+  bottom: 40px;
+  right: 2px;
+  left: 2px;
+  width: auto;
+}
+md-autocomplete md-autocomplete-wrap md-progress-linear .md-mode-indeterminate {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 3px;
+  transition: none;
+}
+md-autocomplete
+  md-autocomplete-wrap
+  md-progress-linear
+  .md-mode-indeterminate
+  .md-container {
+  transition: none;
+  height: 3px;
+}
+md-autocomplete
+  md-autocomplete-wrap
+  md-progress-linear
+  .md-mode-indeterminate.ng-enter {
+  transition: opacity 0.15s linear;
+}
+md-autocomplete
+  md-autocomplete-wrap
+  md-progress-linear
+  .md-mode-indeterminate.ng-enter.ng-enter-active {
+  opacity: 1;
+}
+md-autocomplete
+  md-autocomplete-wrap
+  md-progress-linear
+  .md-mode-indeterminate.ng-leave {
+  transition: opacity 0.15s linear;
+}
+md-autocomplete
+  md-autocomplete-wrap
+  md-progress-linear
+  .md-mode-indeterminate.ng-leave.ng-leave-active {
+  opacity: 0;
+}
+md-autocomplete input:not(.md-input) {
+  font-size: 14px;
+  box-sizing: border-box;
+  border: none;
+  box-shadow: none;
+  outline: none;
+  background: transparent;
+  width: 100%;
+  padding: 0 15px;
+  line-height: 40px;
+  height: 40px;
+}
+md-autocomplete input:not(.md-input)::-ms-clear {
+  display: none;
+}
+md-autocomplete .md-show-clear-button button {
+  position: relative;
+  line-height: 20px;
+  text-align: center;
+  width: 30px;
+  height: 30px;
+  cursor: pointer;
+  border: none;
+  border-radius: 50%;
+  padding: 0;
+  font-size: 12px;
+  background: transparent;
+  margin: auto 5px;
+}
+md-autocomplete .md-show-clear-button button:after {
+  content: '';
+  position: absolute;
+  top: -6px;
+  right: -6px;
+  bottom: -6px;
+  left: -6px;
+  border-radius: 50%;
+  transform: scale(0);
+  opacity: 0;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-autocomplete .md-show-clear-button button:focus {
+  outline: none;
+}
+md-autocomplete .md-show-clear-button button:focus:after {
+  transform: scale(1);
+  opacity: 1;
+}
+md-autocomplete .md-show-clear-button button md-icon {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate3d(-50%, -50%, 0) scale(0.9);
+}
+md-autocomplete .md-show-clear-button button md-icon path {
+  stroke-width: 0;
+}
+md-autocomplete .md-show-clear-button button.ng-enter {
+  transform: scale(0);
+  transition: transform 0.15s ease-out;
+}
+md-autocomplete .md-show-clear-button button.ng-enter.ng-enter-active {
+  transform: scale(1);
+}
+md-autocomplete .md-show-clear-button button.ng-leave {
+  transition: transform 0.15s ease-out;
+}
+md-autocomplete .md-show-clear-button button.ng-leave.ng-leave-active {
+  transform: scale(0);
+}
+@media screen and (-ms-high-contrast: active) {
+  md-autocomplete input {
+    border: 1px solid #fff;
+  }
+  md-autocomplete .md-autocomplete-suggestion:focus {
+    color: #fff;
+  }
+}
+.md-standard-list-container.md-autocomplete-suggestions-container,
+.md-virtual-repeat-container.md-autocomplete-suggestions-container {
+  position: absolute;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+  z-index: 100;
+  height: 100%;
+}
+.md-standard-list-container.md-autocomplete-suggestions-container .highlight,
+.md-virtual-repeat-container.md-autocomplete-suggestions-container .highlight {
+  font-weight: 700;
+}
+.md-standard-list-container {
+  box-sizing: border-box;
+  display: block;
+  margin: 0;
+  overflow: hidden;
+  overflow-y: auto;
+  padding: 0;
+}
+.md-standard-list-container.md-not-found,
+.md-virtual-repeat-container.md-not-found {
+  height: 48px;
+}
+.md-autocomplete-suggestions {
+  margin: 0;
+  list-style: none;
+  padding: 0;
+}
+.md-autocomplete-suggestions .md-autocomplete-suggestion {
+  font-size: 14px;
+  overflow: hidden;
+  padding: 0 15px;
+  line-height: 48px;
+  height: 48px;
+  transition: background 0.15s linear;
+  margin: 0;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.md-autocomplete-suggestions .md-autocomplete-suggestion:focus {
+  outline: none;
+}
+.md-autocomplete-suggestions
+  .md-autocomplete-suggestion:not(.md-not-found-wrapper) {
+  cursor: pointer;
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-autocomplete-suggestions,
+  md-autocomplete {
+    border: 1px solid #fff;
+  }
+}
+md-backdrop {
+  transition: opacity 0.45s;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  z-index: 50;
+}
+md-backdrop.md-menu-backdrop {
+  position: fixed !important;
+  z-index: 99;
+}
+md-backdrop.md-select-backdrop {
+  z-index: 81;
+  transition-duration: 0;
+}
+md-backdrop.md-dialog-backdrop {
+  z-index: 79;
+}
+md-backdrop.md-bottom-sheet-backdrop {
+  z-index: 69;
+}
+md-backdrop.md-sidenav-backdrop {
+  z-index: 59;
+}
+md-backdrop.md-click-catcher {
+  position: absolute;
+}
+md-backdrop.md-opaque {
+  opacity: 0.48;
+}
+md-backdrop.md-opaque.ng-enter {
+  opacity: 0;
+}
+md-backdrop.md-opaque.ng-enter.md-opaque.ng-enter-active {
+  opacity: 0.48;
+}
+md-backdrop.md-opaque.ng-leave {
+  opacity: 0.48;
+  transition: opacity 0.4s;
+}
+md-backdrop.md-opaque.ng-leave.md-opaque.ng-leave-active {
+  opacity: 0;
+}
+md-bottom-sheet {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 8px 16px 88px;
+  z-index: 70;
+  border-top-width: 1px;
+  border-top-style: solid;
+  transform: translate3d(0, 80px, 0);
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-property: transform;
+}
+md-bottom-sheet.md-has-header {
+  padding-top: 0;
+}
+md-bottom-sheet.ng-enter {
+  opacity: 0;
+  transform: translate3d(0, 100%, 0);
+}
+md-bottom-sheet.ng-enter-active {
+  opacity: 1;
+  display: block;
+  transform: translate3d(0, 80px, 0) !important;
+}
+md-bottom-sheet.ng-leave-active {
+  transform: translate3d(0, 100%, 0) !important;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-bottom-sheet .md-subheader {
+  background-color: transparent;
+  font-family: Roboto, Helvetica Neue, sans-serif;
+  line-height: 56px;
+  padding: 0;
+  white-space: nowrap;
+}
+md-bottom-sheet md-inline-icon {
+  display: inline-block;
+  height: 24px;
+  width: 24px;
+  fill: #444;
+}
+md-bottom-sheet md-list-item {
+  display: flex;
+  outline: none;
+}
+md-bottom-sheet md-list-item:hover {
+  cursor: pointer;
+}
+md-bottom-sheet.md-list md-list-item {
+  padding: 0;
+  align-items: center;
+  height: 48px;
+}
+md-bottom-sheet.md-grid {
+  padding-left: 24px;
+  padding-right: 24px;
+  padding-top: 0;
+}
+md-bottom-sheet.md-grid md-list {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  transition: all 0.5s;
+  align-items: center;
+}
+md-bottom-sheet.md-grid md-list-item {
+  flex-direction: column;
+  align-items: center;
+  transition: all 0.5s;
+  height: 96px;
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+@media (max-width: 960px) {
+  md-bottom-sheet.md-grid md-list-item {
+    flex: 1 1 33.33333%;
+    max-width: 33.33333%;
+  }
+  md-bottom-sheet.md-grid md-list-item:nth-of-type(3n + 1) {
+    align-items: flex-start;
+  }
+  md-bottom-sheet.md-grid md-list-item:nth-of-type(3n) {
+    align-items: flex-end;
+  }
+}
+@media (min-width: 960px) and (max-width: 1279px) {
+  md-bottom-sheet.md-grid md-list-item {
+    flex: 1 1 25%;
+    max-width: 25%;
+  }
+}
+@media (min-width: 1280px) and (max-width: 1919px) {
+  md-bottom-sheet.md-grid md-list-item {
+    flex: 1 1 16.66667%;
+    max-width: 16.66667%;
+  }
+}
+@media (min-width: 1920px) {
+  md-bottom-sheet.md-grid md-list-item {
+    flex: 1 1 14.28571%;
+    max-width: 14.28571%;
+  }
+}
+md-bottom-sheet.md-grid md-list-item:before {
+  display: none;
+}
+md-bottom-sheet.md-grid md-list-item .md-list-item-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 48px;
+  padding-bottom: 16px;
+}
+md-bottom-sheet.md-grid md-list-item .md-grid-item-content {
+  border: 1px solid transparent;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 80px;
+}
+md-bottom-sheet.md-grid md-list-item .md-grid-text {
+  font-weight: 400;
+  line-height: 16px;
+  font-size: 13px;
+  margin: 0;
+  white-space: nowrap;
+  width: 64px;
+  text-align: center;
+  text-transform: none;
+  padding-top: 8px;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-bottom-sheet {
+    border: 1px solid #fff;
+  }
+}
+button.md-button::-moz-focus-inner {
+  border: 0;
+}
+.md-button {
+  display: inline-block;
+  position: relative;
+  cursor: pointer;
+  min-height: 36px;
+  min-width: 88px;
+  line-height: 36px;
+  vertical-align: middle;
+  align-items: center;
+  text-align: center;
+  border-radius: 2px;
+  box-sizing: border-box;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  outline: none;
+  border: 0;
+  padding: 0 8px;
+  margin: 6px 8px;
+  background: transparent;
+  color: currentColor;
+  white-space: nowrap;
+  text-transform: uppercase;
+  font-weight: 500;
+  font-size: 14px;
+  font-style: inherit;
+  font-variant: inherit;
+  font-family: inherit;
+  text-decoration: none;
+  overflow: hidden;
+  transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1),
+    background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+.md-dense :not(.md-dense-disabled) .md-button:not(.md-dense-disabled),
+.md-dense > .md-button:not(.md-dense-disabled) {
+  min-height: 32px;
+}
+.md-dense :not(.md-dense-disabled) .md-button:not(.md-dense-disabled),
+.md-dense > .md-button:not(.md-dense-disabled) {
+  line-height: 32px;
+}
+.md-dense :not(.md-dense-disabled) .md-button:not(.md-dense-disabled),
+.md-dense > .md-button:not(.md-dense-disabled) {
+  font-size: 13px;
+}
+.md-button:focus {
+  outline: none;
+}
+.md-button:focus,
+.md-button:hover {
+  text-decoration: none;
+}
+.md-button.ng-hide,
+.md-button.ng-leave {
+  transition: none;
+}
+.md-button.md-cornered {
+  border-radius: 0;
+}
+.md-button.md-icon {
+  padding: 0;
+  background: none;
+}
+.md-button.md-raised:not([disabled]) {
+  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+}
+.md-button.md-icon-button {
+  margin: 0 6px;
+  height: 40px;
+  min-width: 0;
+  line-height: 24px;
+  padding: 8px;
+  width: 40px;
+  border-radius: 50%;
+}
+.md-button.md-fab {
+  z-index: 20;
+  line-height: 56px;
+  min-width: 0;
+  width: 56px;
+  height: 56px;
+  vertical-align: middle;
+  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+  border-radius: 50%;
+  background-clip: padding-box;
+  overflow: hidden;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-property: background-color, box-shadow, transform;
+}
+.md-button.md-fab.md-fab-bottom-right {
+  top: auto;
+  right: 20px;
+  bottom: 20px;
+  left: auto;
+  position: absolute;
+}
+.md-button.md-fab.md-fab-bottom-left {
+  top: auto;
+  right: auto;
+  bottom: 20px;
+  left: 20px;
+  position: absolute;
+}
+.md-button.md-fab.md-fab-top-right {
+  top: 20px;
+  right: 20px;
+  bottom: auto;
+  left: auto;
+  position: absolute;
+}
+.md-button.md-fab.md-fab-top-left {
+  top: 20px;
+  right: auto;
+  bottom: auto;
+  left: 20px;
+  position: absolute;
+}
+.md-button.md-fab.md-mini {
+  line-height: 40px;
+  width: 40px;
+  height: 40px;
+}
+.md-button.md-fab.ng-hide,
+.md-button.md-fab.ng-leave {
+  transition: none;
+}
+.md-button.md-fab[disabled] {
+  box-shadow: none;
+}
+.md-button:not([disabled]).md-fab.md-focused,
+.md-button:not([disabled]).md-raised.md-focused {
+  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+}
+.md-button:not([disabled]).md-fab:active,
+.md-button:not([disabled]).md-raised:active {
+  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4);
+}
+.md-button .md-ripple-container {
+  border-radius: inherit;
+  background-clip: padding-box;
+  overflow: hidden;
+  -webkit-transform: translateZ(0);
+}
+.md-button.md-icon-button md-icon,
+button.md-button.md-fab md-icon {
+  display: block;
+}
+.md-toast-open-top .md-button.md-fab-top-left,
+.md-toast-open-top .md-button.md-fab-top-right {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transform: translate3d(0, 42px, 0);
+}
+.md-toast-open-top .md-button.md-fab-top-left:not([disabled]).md-focused,
+.md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover,
+.md-toast-open-top .md-button.md-fab-top-right:not([disabled]).md-focused,
+.md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover {
+  transform: translate3d(0, 41px, 0);
+}
+.md-toast-open-bottom .md-button.md-fab-bottom-left,
+.md-toast-open-bottom .md-button.md-fab-bottom-right {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transform: translate3d(0, -42px, 0);
+}
+.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]).md-focused,
+.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover,
+.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]).md-focused,
+.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover {
+  transform: translate3d(0, -43px, 0);
+}
+.md-button-group {
+  display: flex;
+  flex: 1;
+  width: 100%;
+}
+.md-button-group > .md-button {
+  flex: 1;
+  display: block;
+  overflow: hidden;
+  width: 0;
+  border-width: 1px 0 1px 1px;
+  border-radius: 0;
+  text-align: center;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.md-button-group > .md-button:first-child {
+  border-radius: 2px 0 0 2px;
+}
+.md-button-group > .md-button:last-child {
+  border-right-width: 1px;
+  border-radius: 0 2px 2px 0;
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-button.md-fab,
+  .md-button.md-raised {
+    border: 1px solid #fff;
+  }
+}
+md-card {
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  margin: 8px;
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
+    0 2px 1px -1px rgba(0, 0, 0, 0.12);
+}
+md-card md-card-header {
+  padding: 16px;
+  display: flex;
+  flex-direction: row;
+}
+md-card md-card-header:first-child md-card-avatar {
+  margin-right: 12px;
+}
+[dir='rtl'] md-card md-card-header:first-child md-card-avatar {
+  margin-right: auto;
+  margin-left: 12px;
+}
+md-card md-card-header:last-child md-card-avatar {
+  margin-left: 12px;
+}
+[dir='rtl'] md-card md-card-header:last-child md-card-avatar {
+  margin-left: auto;
+  margin-right: 12px;
+}
+md-card md-card-header md-card-avatar {
+  width: 40px;
+  height: 40px;
+}
+md-card md-card-header md-card-avatar .md-user-avatar,
+md-card md-card-header md-card-avatar md-icon {
+  border-radius: 50%;
+}
+md-card md-card-header md-card-avatar md-icon {
+  padding: 8px;
+}
+md-card md-card-header md-card-avatar md-icon > svg {
+  height: inherit;
+  width: inherit;
+}
+md-card md-card-header md-card-avatar + md-card-header-text {
+  max-height: 40px;
+}
+md-card md-card-header md-card-avatar + md-card-header-text .md-title {
+  font-size: 14px;
+}
+md-card md-card-header md-card-header-text {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+}
+md-card md-card-header md-card-header-text .md-subhead {
+  font-size: 14px;
+}
+md-card > img,
+md-card > md-card-header img,
+md-card md-card-title-media img {
+  box-sizing: border-box;
+  display: flex;
+  flex: 0 0 auto;
+  width: 100%;
+  height: auto;
+}
+md-card md-card-title {
+  padding: 24px 16px 16px;
+  display: flex;
+  flex: 1 1 auto;
+  flex-direction: row;
+}
+md-card md-card-title + md-card-content {
+  padding-top: 0;
+}
+md-card md-card-title md-card-title-text {
+  flex: 1;
+  flex-direction: column;
+  display: flex;
+}
+md-card md-card-title md-card-title-text .md-subhead {
+  padding-top: 0;
+  font-size: 14px;
+}
+md-card md-card-title md-card-title-text:only-child .md-subhead {
+  padding-top: 12px;
+}
+md-card md-card-title md-card-title-media {
+  margin-top: -8px;
+}
+md-card md-card-title md-card-title-media .md-media-sm {
+  height: 80px;
+  width: 80px;
+}
+md-card md-card-title md-card-title-media .md-media-md {
+  height: 112px;
+  width: 112px;
+}
+md-card md-card-title md-card-title-media .md-media-lg {
+  height: 152px;
+  width: 152px;
+}
+md-card md-card-content {
+  display: block;
+  padding: 16px;
+}
+md-card md-card-content > p:first-child {
+  margin-top: 0;
+}
+md-card md-card-content > p:last-child {
+  margin-bottom: 0;
+}
+md-card md-card-content .md-media-xl {
+  height: 240px;
+  width: 240px;
+}
+md-card md-card-actions {
+  margin: 8px;
+}
+md-card md-card-actions.layout-column .md-button:not(.md-icon-button) {
+  margin: 2px 0;
+}
+md-card
+  md-card-actions.layout-column
+  .md-button:not(.md-icon-button):first-of-type {
+  margin-top: 0;
+}
+md-card
+  md-card-actions.layout-column
+  .md-button:not(.md-icon-button):last-of-type {
+  margin-bottom: 0;
+}
+md-card md-card-actions.layout-column .md-button.md-icon-button {
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+md-card md-card-actions md-card-icon-actions {
+  flex: 1;
+  justify-content: flex-start;
+  display: flex;
+  flex-direction: row;
+}
+md-card md-card-actions:not(.layout-column) .md-button:not(.md-icon-button) {
+  margin: 0 4px;
+}
+md-card
+  md-card-actions:not(.layout-column)
+  .md-button:not(.md-icon-button):first-of-type {
+  margin-left: 0;
+}
+[dir='rtl']
+  md-card
+  md-card-actions:not(.layout-column)
+  .md-button:not(.md-icon-button):first-of-type {
+  margin-left: auto;
+  margin-right: 0;
+}
+md-card
+  md-card-actions:not(.layout-column)
+  .md-button:not(.md-icon-button):last-of-type {
+  margin-right: 0;
+}
+[dir='rtl']
+  md-card
+  md-card-actions:not(.layout-column)
+  .md-button:not(.md-icon-button):last-of-type {
+  margin-right: auto;
+  margin-left: 0;
+}
+md-card md-card-actions:not(.layout-column) .md-button.md-icon-button {
+  margin-left: 6px;
+  margin-right: 6px;
+}
+md-card
+  md-card-actions:not(.layout-column)
+  .md-button.md-icon-button:first-of-type {
+  margin-left: 12px;
+}
+[dir='rtl']
+  md-card
+  md-card-actions:not(.layout-column)
+  .md-button.md-icon-button:first-of-type {
+  margin-left: auto;
+  margin-right: 12px;
+}
+md-card
+  md-card-actions:not(.layout-column)
+  .md-button.md-icon-button:last-of-type {
+  margin-right: 12px;
+}
+[dir='rtl']
+  md-card
+  md-card-actions:not(.layout-column)
+  .md-button.md-icon-button:last-of-type {
+  margin-right: auto;
+  margin-left: 12px;
+}
+md-card md-card-actions:not(.layout-column) .md-button + md-card-icon-actions {
+  flex: 1;
+  justify-content: flex-end;
+  display: flex;
+  flex-direction: row;
+}
+md-card md-card-footer {
+  margin-top: auto;
+  padding: 16px;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-card {
+    border: 1px solid #fff;
+  }
+}
+.md-image-no-fill > img {
+  width: auto;
+  height: auto;
+}
+.md-inline-form md-checkbox {
+  margin-top: 14px;
+  margin-bottom: auto;
+}
+md-checkbox {
+  box-sizing: border-box;
+  display: inline-block;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  position: relative;
+  min-width: 18px;
+  min-height: 48px;
+}
+.md-dense :not(.md-dense-disabled) md-checkbox:not(.md-dense-disabled),
+.md-dense > md-checkbox:not(.md-dense-disabled) {
+  min-height: 36px;
+}
+md-checkbox.md-focused:not([disabled]) .md-container:before {
+  left: -8px;
+  top: -8px;
+  right: -8px;
+  bottom: -8px;
+}
+md-checkbox.md-focused:not([disabled]):not(.md-checked) .md-container:before {
+  background-color: rgba(0, 0, 0, 0.12);
+}
+md-checkbox .md-container {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  box-sizing: border-box;
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  left: 0;
+}
+[dir='rtl'] md-checkbox .md-container {
+  left: auto;
+}
+[dir='rtl'] md-checkbox .md-container {
+  right: 0;
+}
+md-checkbox .md-container:before {
+  box-sizing: border-box;
+  background-color: transparent;
+  border-radius: 50%;
+  content: '';
+  position: absolute;
+  display: block;
+  height: auto;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transition: all 0.5s;
+  width: auto;
+}
+md-checkbox .md-container:after {
+  box-sizing: border-box;
+  content: '';
+  position: absolute;
+  top: -10px;
+  right: -10px;
+  bottom: -10px;
+  left: -10px;
+}
+md-checkbox .md-container .md-ripple-container {
+  position: absolute;
+  display: block;
+  width: auto;
+  height: auto;
+  left: -15px;
+  top: -15px;
+  right: -15px;
+  bottom: -15px;
+}
+md-checkbox .md-icon {
+  box-sizing: border-box;
+  transition: 0.24s;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 18px;
+  height: 18px;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 2px;
+}
+md-checkbox.md-checked .md-icon {
+  border-color: transparent;
+}
+md-checkbox.md-checked .md-icon:after {
+  box-sizing: border-box;
+  transform: rotate(45deg);
+  position: absolute;
+  left: 4px;
+  top: 0;
+  display: table;
+  width: 6px;
+  height: 12px;
+  border-width: 2px;
+  border-style: solid;
+  border-top: 0;
+  border-left: 0;
+  content: '';
+}
+md-checkbox[disabled] {
+  cursor: default;
+}
+md-checkbox.md-indeterminate .md-icon:after {
+  box-sizing: border-box;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  display: table;
+  width: 10.8px;
+  height: 2px;
+  border-width: 2px;
+  border-style: solid;
+  border-top: 0;
+  border-left: 0;
+  content: '';
+}
+md-checkbox .md-container {
+  top: auto;
+  left: auto;
+  right: auto;
+  margin: 21px 3px 3px;
+}
+md-checkbox .md-label {
+  box-sizing: border-box;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  white-space: normal;
+  -webkit-user-select: text;
+  -moz-user-select: text;
+  -ms-user-select: text;
+  user-select: text;
+  margin-top: 10px;
+  margin-bottom: auto;
+  margin-left: 36px;
+}
+[dir='rtl'] md-checkbox .md-label {
+  margin-left: 0;
+  margin-right: 36px;
+}
+md-checkbox .md-label:empty {
+  margin-left: 24px;
+  margin-right: 0;
+}
+[dir='rtl'] md-checkbox .md-label:empty {
+  margin-left: 0;
+}
+[dir='rtl'] md-checkbox .md-label:empty {
+  margin-right: 24px;
+}
+md-input-container .md-checkbox-link-label {
+  box-sizing: border-box;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  white-space: normal;
+  -webkit-user-select: text;
+  -moz-user-select: text;
+  -ms-user-select: text;
+  user-select: text;
+  cursor: pointer;
+  top: -21px;
+  margin-left: 18px;
+  margin-right: 0;
+}
+[dir='rtl'] md-input-container .md-checkbox-link-label {
+  margin-left: 0;
+}
+[dir='rtl'] md-input-container .md-checkbox-link-label {
+  margin-right: 18px;
+}
+.md-contact-chips .md-chips md-chip {
+  padding: 0 25px 0 0;
+}
+[dir='rtl'] .md-contact-chips .md-chips md-chip {
+  padding: 0 0 0 25px;
+}
+.md-contact-chips .md-chips md-chip .md-contact-avatar {
+  float: left;
+}
+[dir='rtl'] .md-contact-chips .md-chips md-chip .md-contact-avatar {
+  float: right;
+}
+.md-contact-chips .md-chips md-chip .md-contact-avatar img {
+  height: 32px;
+  border-radius: 16px;
+}
+.md-contact-chips .md-chips md-chip .md-contact-name {
+  display: inline-block;
+  height: 32px;
+  margin-left: 8px;
+}
+[dir='rtl'] .md-contact-chips .md-chips md-chip .md-contact-name {
+  margin-left: auto;
+  margin-right: 8px;
+}
+.md-contact-suggestion {
+  height: 56px;
+}
+.md-contact-suggestion img {
+  height: 40px;
+  border-radius: 20px;
+  margin-top: 8px;
+}
+.md-contact-suggestion .md-contact-name {
+  margin-left: 8px;
+  width: 120px;
+}
+[dir='rtl'] .md-contact-suggestion .md-contact-name {
+  margin-left: auto;
+  margin-right: 8px;
+}
+.md-contact-suggestion .md-contact-email,
+.md-contact-suggestion .md-contact-name {
+  display: inline-block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.md-contact-chips-suggestions li {
+  height: 100%;
+}
+.md-chips,
+md-chips {
+  display: flex;
+}
+.md-chips {
+  flex-wrap: wrap;
+  flex-grow: 1;
+  font-family: Roboto, Helvetica Neue, sans-serif;
+  font-size: 13px;
+  padding: 0 0 8px 3px;
+  vertical-align: middle;
+}
+.md-chips:after {
+  content: '';
+  display: table;
+  clear: both;
+}
+[dir='rtl'] .md-chips {
+  padding: 0 3px 8px 0;
+}
+.md-chips.md-readonly .md-chip-input-container {
+  min-height: 32px;
+}
+.md-chips:not(.md-readonly) {
+  cursor: text;
+}
+.md-chips.md-removable md-chip {
+  padding-right: 28px;
+}
+[dir='rtl'] .md-chips.md-removable md-chip {
+  padding-right: 0;
+  padding-left: 28px;
+}
+.md-chips.md-removable md-chip .md-chip-content {
+  padding-right: 4px;
+}
+[dir='rtl'] .md-chips.md-removable md-chip .md-chip-content {
+  padding-right: 0;
+  padding-left: 4px;
+}
+.md-chips md-chip {
+  cursor: default;
+  border-radius: 16px;
+  display: block;
+  height: 32px;
+  line-height: 32px;
+  margin: 8px 8px 0 0;
+  padding: 0 12px;
+  float: left;
+  box-sizing: border-box;
+  max-width: 100%;
+  position: relative;
+}
+[dir='rtl'] .md-chips md-chip {
+  margin: 8px 0 0 8px;
+}
+[dir='rtl'] .md-chips md-chip {
+  float: right;
+}
+.md-chips md-chip .md-chip-content {
+  display: block;
+  float: left;
+  white-space: nowrap;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+[dir='rtl'] .md-chips md-chip .md-chip-content {
+  float: right;
+}
+.md-chips md-chip .md-chip-content:focus {
+  outline: none;
+}
+.md-chips md-chip._md-chip-content-edit-is-enabled {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -khtml-user-select: none;
+  -ms-user-select: none;
+}
+.md-chips md-chip .md-chip-remove-container {
+  position: absolute;
+  right: 0;
+  line-height: 22px;
+}
+[dir='rtl'] .md-chips md-chip .md-chip-remove-container {
+  right: auto;
+  left: 0;
+}
+.md-chips md-chip .md-chip-remove {
+  text-align: center;
+  width: 32px;
+  height: 32px;
+  min-width: 0;
+  padding: 0;
+  background: transparent;
+  border: none;
+  box-shadow: none;
+  margin: 0;
+  position: relative;
+}
+.md-chips md-chip .md-chip-remove md-icon {
+  height: 18px;
+  width: 18px;
+  min-height: 18px;
+  min-width: 18px;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate3d(-50%, -50%, 0);
+}
+.md-chips .md-chip-input-container {
+  display: block;
+  line-height: 32px;
+  margin: 8px 8px 0 0;
+  padding: 0;
+  flex-grow: 1;
+  float: left;
+}
+[dir='rtl'] .md-chips .md-chip-input-container {
+  margin: 8px 0 0 8px;
+}
+[dir='rtl'] .md-chips .md-chip-input-container {
+  float: right;
+}
+.md-chips .md-chip-input-container input {
+  width: 100%;
+}
+.md-chips .md-chip-input-container input:not([type]),
+.md-chips .md-chip-input-container input[type='email'],
+.md-chips .md-chip-input-container input[type='number'],
+.md-chips .md-chip-input-container input[type='tel'],
+.md-chips .md-chip-input-container input[type='text'],
+.md-chips .md-chip-input-container input[type='url'] {
+  border: 0;
+  height: 32px;
+  line-height: 32px;
+  padding: 0;
+}
+.md-chips .md-chip-input-container input:not([type]):focus,
+.md-chips .md-chip-input-container input[type='email']:focus,
+.md-chips .md-chip-input-container input[type='number']:focus,
+.md-chips .md-chip-input-container input[type='tel']:focus,
+.md-chips .md-chip-input-container input[type='text']:focus,
+.md-chips .md-chip-input-container input[type='url']:focus {
+  outline: none;
+}
+.md-chips .md-chip-input-container md-autocomplete,
+.md-chips .md-chip-input-container md-autocomplete-wrap {
+  background: transparent;
+}
+.md-chips .md-chip-input-container md-autocomplete md-autocomplete-wrap {
+  box-shadow: none;
+}
+.md-chips .md-chip-input-container input {
+  border: 0;
+  height: 32px;
+  line-height: 32px;
+  padding: 0;
+}
+.md-chips .md-chip-input-container input:focus {
+  outline: none;
+}
+.md-chips .md-chip-input-container md-autocomplete,
+.md-chips .md-chip-input-container md-autocomplete-wrap {
+  height: 32px;
+}
+.md-chips .md-chip-input-container md-autocomplete {
+  box-shadow: none;
+}
+.md-chips .md-chip-input-container md-autocomplete input {
+  position: relative;
+}
+.md-chips .md-chip-input-container:not(:first-child) {
+  margin: 8px 8px 0 0;
+}
+[dir='rtl'] .md-chips .md-chip-input-container:not(:first-child) {
+  margin: 8px 0 0 8px;
+}
+.md-chips .md-chip-input-container input {
+  background: transparent;
+  border-width: 0;
+}
+.md-chips md-autocomplete button {
+  display: none;
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-chip-input-container,
+  md-chip {
+    border: 1px solid #fff;
+  }
+  .md-chip-input-container md-autocomplete {
+    border: none;
+  }
+}
+md-content {
+  display: block;
+  position: relative;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+md-content[md-scroll-y] {
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+md-content[md-scroll-x] {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+@media print {
+  md-content {
+    overflow: visible !important;
+  }
+}
+md-calendar {
+  font-size: 13px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.md-calendar-scroll-mask {
+  display: inline-block;
+  overflow: hidden;
+  height: 308px;
+}
+.md-calendar-scroll-mask .md-virtual-repeat-scroller {
+  overflow-y: scroll;
+  -webkit-overflow-scrolling: touch;
+}
+.md-calendar-scroll-mask .md-virtual-repeat-scroller::-webkit-scrollbar {
+  display: none;
+}
+.md-calendar-scroll-mask .md-virtual-repeat-offsetter {
+  width: 100%;
+}
+.md-calendar-scroll-container {
+  box-shadow: inset -3px 3px 6px rgba(0, 0, 0, 0.2);
+  display: inline-block;
+  height: 308px;
+  width: 346px;
+}
+.md-calendar-date {
+  height: 44px;
+  width: 44px;
+  text-align: center;
+  padding: 0;
+  border: none;
+  box-sizing: content-box;
+}
+.md-calendar-date:first-child {
+  padding-left: 16px;
+}
+[dir='rtl'] .md-calendar-date:first-child {
+  padding-left: 0;
+  padding-right: 16px;
+}
+.md-calendar-date:last-child {
+  padding-right: 16px;
+}
+[dir='rtl'] .md-calendar-date:last-child {
+  padding-right: 0;
+  padding-left: 16px;
+}
+.md-calendar-date.md-calendar-date-disabled {
+  cursor: default;
+}
+.md-calendar-date-selection-indicator {
+  transition: background-color, color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  border-radius: 50%;
+  display: inline-block;
+  width: 40px;
+  height: 40px;
+  line-height: 40px;
+}
+.md-calendar-date:not(.md-disabled) .md-calendar-date-selection-indicator {
+  cursor: pointer;
+}
+.md-calendar-month-label {
+  height: 44px;
+  font-size: 14px;
+  font-weight: 500;
+  padding: 0 0 0 24px;
+}
+[dir='rtl'] .md-calendar-month-label {
+  padding: 0 24px 0 0;
+}
+.md-calendar-month-label.md-calendar-label-clickable {
+  cursor: pointer;
+}
+.md-calendar-month-label md-icon {
+  transform: rotate(180deg);
+}
+[dir='rtl'] .md-calendar-month-label md-icon {
+  transform: none;
+}
+.md-calendar-month-label span {
+  vertical-align: middle;
+}
+.md-calendar-day-header {
+  table-layout: fixed;
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+.md-calendar-day-header th {
+  height: 40px;
+  width: 44px;
+  text-align: center;
+  padding: 0;
+  border: none;
+  box-sizing: content-box;
+  font-weight: 400;
+}
+.md-calendar-day-header th:first-child {
+  padding-left: 16px;
+}
+[dir='rtl'] .md-calendar-day-header th:first-child {
+  padding-left: 0;
+  padding-right: 16px;
+}
+.md-calendar-day-header th:last-child {
+  padding-right: 16px;
+}
+[dir='rtl'] .md-calendar-day-header th:last-child {
+  padding-right: 0;
+  padding-left: 16px;
+}
+.md-calendar {
+  table-layout: fixed;
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+.md-calendar tr:last-child td {
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+}
+.md-calendar:first-child {
+  border-top: 1px solid transparent;
+}
+.md-calendar tbody,
+.md-calendar td,
+.md-calendar tr {
+  vertical-align: middle;
+  box-sizing: content-box;
+}
+md-datepicker {
+  white-space: nowrap;
+  overflow: hidden;
+  vertical-align: middle;
+}
+.md-inline-form md-datepicker {
+  margin-top: 12px;
+}
+.md-datepicker-button {
+  display: inline-block;
+  box-sizing: border-box;
+  background: none;
+  vertical-align: middle;
+  position: relative;
+}
+.md-datepicker-button:before {
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  position: absolute;
+  content: '';
+  speak: none;
+}
+.md-datepicker-input {
+  font-size: 14px;
+  box-sizing: border-box;
+  border: none;
+  box-shadow: none;
+  outline: none;
+  background: transparent;
+  min-width: 120px;
+  max-width: 328px;
+  padding: 0 0 5px;
+}
+.md-datepicker-input::-ms-clear {
+  display: none;
+}
+._md-datepicker-floating-label > md-datepicker {
+  overflow: visible;
+}
+._md-datepicker-floating-label > md-datepicker .md-datepicker-input-container {
+  border: none;
+}
+._md-datepicker-floating-label > md-datepicker .md-datepicker-button {
+  float: left;
+  margin-top: -16px;
+  top: 13.5px;
+}
+[dir='rtl']
+  ._md-datepicker-floating-label
+  > md-datepicker
+  .md-datepicker-button {
+  float: right;
+}
+._md-datepicker-floating-label .md-input {
+  float: none;
+}
+._md-datepicker-floating-label._md-datepicker-has-calendar-icon
+  > label:not(.md-no-float):not(.md-container-ignore) {
+  right: 18px;
+  left: auto;
+  width: calc(100% - 84px);
+}
+[dir='rtl']
+  ._md-datepicker-floating-label._md-datepicker-has-calendar-icon
+  > label:not(.md-no-float):not(.md-container-ignore) {
+  right: auto;
+}
+[dir='rtl']
+  ._md-datepicker-floating-label._md-datepicker-has-calendar-icon
+  > label:not(.md-no-float):not(.md-container-ignore) {
+  left: 18px;
+}
+._md-datepicker-floating-label._md-datepicker-has-calendar-icon
+  .md-input-message-animation {
+  margin-left: 64px;
+}
+[dir='rtl']
+  ._md-datepicker-floating-label._md-datepicker-has-calendar-icon
+  .md-input-message-animation {
+  margin-left: auto;
+  margin-right: 64px;
+}
+._md-datepicker-has-triangle-icon {
+  padding-right: 18px;
+  margin-right: -18px;
+}
+[dir='rtl'] ._md-datepicker-has-triangle-icon {
+  padding-right: 0;
+  padding-left: 18px;
+}
+[dir='rtl'] ._md-datepicker-has-triangle-icon {
+  margin-right: auto;
+  margin-left: -18px;
+}
+.md-datepicker-input-container {
+  position: relative;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  display: inline-block;
+  width: auto;
+}
+.md-icon-button + .md-datepicker-input-container {
+  margin-left: 12px;
+}
+[dir='rtl'] .md-icon-button + .md-datepicker-input-container {
+  margin-left: auto;
+  margin-right: 12px;
+}
+.md-datepicker-input-container.md-datepicker-focused {
+  border-bottom-width: 2px;
+}
+.md-datepicker-is-showing .md-scroll-mask {
+  z-index: 99;
+}
+.md-datepicker-calendar-pane {
+  position: absolute;
+  top: 0;
+  left: -100%;
+  z-index: 100;
+  border-width: 1px;
+  border-style: solid;
+  background: transparent;
+  transform: scale(0);
+  transform-origin: 0 0;
+  transition: transform 0.2s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+.md-datepicker-calendar-pane.md-pane-open {
+  transform: scale(1);
+}
+.md-datepicker-input-mask {
+  height: 40px;
+  width: 340px;
+  position: relative;
+  overflow: hidden;
+  background: transparent;
+  pointer-events: none;
+  cursor: text;
+}
+.md-datepicker-calendar {
+  opacity: 0;
+  transition: opacity 0.2s cubic-bezier(0.5, 0, 0.25, 1);
+}
+.md-pane-open .md-datepicker-calendar {
+  opacity: 1;
+}
+.md-datepicker-calendar md-calendar:focus {
+  outline: none;
+}
+.md-datepicker-expand-triangle {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: 0;
+  height: 0;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid;
+}
+.md-datepicker-triangle-button {
+  position: absolute;
+  right: 0;
+  bottom: -2.5px;
+  transform: translateX(45%);
+}
+[dir='rtl'] .md-datepicker-triangle-button {
+  right: auto;
+  left: 0;
+}
+[dir='rtl'] .md-datepicker-triangle-button {
+  transform: translateX(-45%);
+}
+.md-datepicker-triangle-button.md-button.md-icon-button {
+  height: 36px;
+  width: 36px;
+  position: absolute;
+  padding: 8px;
+}
+md-datepicker[disabled] .md-datepicker-input-container {
+  border-bottom-color: transparent;
+}
+md-datepicker[disabled] .md-datepicker-triangle-button {
+  display: none;
+}
+.md-datepicker-open {
+  overflow: hidden;
+}
+.md-datepicker-open .md-datepicker-input-container,
+.md-datepicker-open input.md-input {
+  border-bottom-color: transparent;
+}
+.md-datepicker-open .md-datepicker-triangle-button,
+.md-datepicker-open.md-input-has-placeholder > label,
+.md-datepicker-open.md-input-has-value > label {
+  display: none;
+}
+.md-datepicker-pos-adjusted .md-datepicker-input-mask {
+  display: none;
+}
+.md-datepicker-calendar-pane .md-calendar {
+  transform: translateY(-85px);
+  transition: transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-delay: 0.125s;
+}
+.md-datepicker-calendar-pane.md-pane-open .md-calendar {
+  transform: translateY(0);
+}
+.md-dialog-is-showing {
+  max-height: 100%;
+}
+.md-dialog-container {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 80;
+  overflow: hidden;
+}
+md-dialog {
+  opacity: 0;
+  min-width: 240px;
+  max-width: 80%;
+  max-height: 80%;
+  position: relative;
+  overflow: auto;
+  box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2),
+    0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12);
+  display: flex;
+  flex-direction: column;
+}
+md-dialog.md-transition-in {
+  opacity: 1;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transform: translate(0, 0) scale(1);
+}
+md-dialog.md-transition-out {
+  opacity: 0;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transform: translate(0, 100%) scale(0.2);
+}
+md-dialog > form {
+  display: flex;
+  flex-direction: column;
+  overflow: auto;
+}
+md-dialog .md-dialog-content {
+  padding: 24px;
+}
+md-dialog md-dialog-content {
+  order: 1;
+  flex-direction: column;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+md-dialog
+  md-dialog-content:not([layout='row'])
+  > :first-child:not(.md-subheader) {
+  margin-top: 0;
+}
+md-dialog md-dialog-content:focus {
+  outline: none;
+}
+md-dialog md-dialog-content .md-subheader {
+  margin: 0;
+}
+md-dialog md-dialog-content .md-dialog-content-body {
+  width: 100%;
+}
+md-dialog md-dialog-content .md-prompt-input-container {
+  width: 100%;
+  box-sizing: border-box;
+}
+md-dialog md-dialog-actions {
+  display: flex;
+  order: 2;
+  box-sizing: border-box;
+  align-items: center;
+  justify-content: flex-end;
+  margin-bottom: 0;
+  padding-right: 8px;
+  padding-left: 16px;
+  min-height: 52px;
+  overflow: hidden;
+}
+[dir='rtl'] md-dialog md-dialog-actions {
+  padding-right: 16px;
+}
+[dir='rtl'] md-dialog md-dialog-actions {
+  padding-left: 8px;
+}
+md-dialog md-dialog-actions .md-button {
+  margin: 8px 0 8px 8px;
+}
+[dir='rtl'] md-dialog md-dialog-actions .md-button {
+  margin-left: 0;
+}
+[dir='rtl'] md-dialog md-dialog-actions .md-button {
+  margin-right: 8px;
+}
+md-dialog.md-content-overflow md-dialog-actions {
+  border-top-width: 1px;
+  border-top-style: solid;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-dialog {
+    border: 1px solid #fff;
+  }
+}
+@media (max-width: 959px) {
+  md-dialog.md-dialog-fullscreen {
+    min-height: 100%;
+    min-width: 100%;
+    border-radius: 0;
+  }
+}
+md-divider {
+  display: block;
+  border-top-width: 1px;
+  border-top-style: solid;
+  margin: 0;
+}
+md-divider[md-inset] {
+  margin-left: 80px;
+}
+[dir='rtl'] md-divider[md-inset] {
+  margin-left: auto;
+  margin-right: 80px;
+}
+@media (max-width: 599px) {
+  .layout-row:not(.layout-xs-column) > md-divider,
+  .layout-xs-row > md-divider {
+    border-top-width: 0;
+    border-right-width: 1px;
+    border-right-style: solid;
+  }
+}
+@media (min-width: 600px) and (max-width: 959px) {
+  .layout-gt-xs-row:not(.layout-sm-column) > md-divider,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-sm-column) > md-divider,
+  .layout-sm-row:not(.layout-sm-column) > md-divider {
+    border-top-width: 0;
+    border-right-width: 1px;
+    border-right-style: solid;
+  }
+}
+@media (min-width: 960px) and (max-width: 1279px) {
+  .layout-gt-sm-row:not(.layout-md-column) > md-divider,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-md-column)
+    > md-divider,
+  .layout-md-row:not(.layout-md-column) > md-divider,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-md-column)
+    > md-divider {
+    border-top-width: 0;
+    border-right-width: 1px;
+    border-right-style: solid;
+  }
+}
+@media (min-width: 1280px) and (max-width: 1919px) {
+  .layout-gt-md-row:not(.layout-lg-column) > md-divider,
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-divider,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-divider,
+  .layout-lg-row:not(.layout-lg-column) > md-divider,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-divider {
+    border-top-width: 0;
+    border-right-width: 1px;
+    border-right-style: solid;
+  }
+}
+@media (min-width: 1920px) {
+  .layout-gt-lg-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-divider,
+  .layout-gt-md-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-divider,
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-divider,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-divider,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-divider,
+  .layout-xl-row:not(.layout-gt-lg-column):not(.layout-xl-column) > md-divider {
+    border-top-width: 0;
+    border-right-width: 1px;
+    border-right-style: solid;
+  }
+}
+md-fab-speed-dial {
+  position: relative;
+  display: flex;
+  align-items: center;
+  z-index: 20;
+}
+md-fab-speed-dial.md-fab-bottom-right {
+  top: auto;
+  right: 20px;
+  bottom: 20px;
+  left: auto;
+  position: absolute;
+}
+md-fab-speed-dial.md-fab-bottom-left {
+  top: auto;
+  right: auto;
+  bottom: 20px;
+  left: 20px;
+  position: absolute;
+}
+md-fab-speed-dial.md-fab-top-right {
+  top: 20px;
+  right: 20px;
+  bottom: auto;
+  left: auto;
+  position: absolute;
+}
+md-fab-speed-dial.md-fab-top-left {
+  top: 20px;
+  right: auto;
+  bottom: auto;
+  left: 20px;
+  position: absolute;
+}
+md-fab-speed-dial:not(.md-hover-full) {
+  pointer-events: none;
+}
+md-fab-speed-dial:not(.md-hover-full) .md-fab-action-item,
+md-fab-speed-dial:not(.md-hover-full) md-fab-trigger {
+  pointer-events: auto;
+}
+md-fab-speed-dial:not(.md-hover-full).md-is-open {
+  pointer-events: auto;
+}
+md-fab-speed-dial ._md-css-variables {
+  z-index: 20;
+}
+md-fab-speed-dial.md-is-open .md-fab-action-item {
+  align-items: center;
+}
+md-fab-speed-dial md-fab-actions {
+  display: flex;
+  height: auto;
+}
+md-fab-speed-dial md-fab-actions .md-fab-action-item {
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-fab-speed-dial.md-down {
+  flex-direction: column;
+}
+md-fab-speed-dial.md-down md-fab-trigger {
+  order: 1;
+}
+md-fab-speed-dial.md-down md-fab-actions {
+  flex-direction: column;
+  order: 2;
+}
+md-fab-speed-dial.md-up {
+  flex-direction: column;
+}
+md-fab-speed-dial.md-up md-fab-trigger {
+  order: 2;
+}
+md-fab-speed-dial.md-up md-fab-actions {
+  flex-direction: column-reverse;
+  order: 1;
+}
+md-fab-speed-dial.md-left {
+  flex-direction: row;
+}
+md-fab-speed-dial.md-left md-fab-trigger {
+  order: 2;
+}
+md-fab-speed-dial.md-left md-fab-actions {
+  flex-direction: row-reverse;
+  order: 1;
+}
+md-fab-speed-dial.md-left md-fab-actions .md-fab-action-item {
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-fab-speed-dial.md-right {
+  flex-direction: row;
+}
+md-fab-speed-dial.md-right md-fab-trigger {
+  order: 1;
+}
+md-fab-speed-dial.md-right md-fab-actions {
+  flex-direction: row;
+  order: 2;
+}
+md-fab-speed-dial.md-right md-fab-actions .md-fab-action-item {
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-fab-speed-dial.md-fling-remove .md-fab-action-item > *,
+md-fab-speed-dial.md-scale-remove .md-fab-action-item > * {
+  visibility: hidden;
+}
+md-fab-speed-dial.md-fling .md-fab-action-item {
+  opacity: 1;
+}
+md-fab-speed-dial.md-fling.md-animations-waiting .md-fab-action-item {
+  opacity: 0;
+  transition-duration: 0s;
+}
+md-fab-speed-dial.md-scale .md-fab-action-item {
+  transform: scale(0);
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.14286s;
+}
+md-fab-toolbar {
+  display: block;
+}
+md-fab-toolbar.md-fab-bottom-right {
+  top: auto;
+  right: 20px;
+  bottom: 20px;
+  left: auto;
+  position: absolute;
+}
+md-fab-toolbar.md-fab-bottom-left {
+  top: auto;
+  right: auto;
+  bottom: 20px;
+  left: 20px;
+  position: absolute;
+}
+md-fab-toolbar.md-fab-top-right {
+  top: 20px;
+  right: 20px;
+  bottom: auto;
+  left: auto;
+  position: absolute;
+}
+md-fab-toolbar.md-fab-top-left {
+  top: 20px;
+  right: auto;
+  bottom: auto;
+  left: 20px;
+  position: absolute;
+}
+md-fab-toolbar .md-fab-toolbar-wrapper {
+  display: block;
+  position: relative;
+  overflow: hidden;
+  height: 68px;
+}
+md-fab-toolbar md-fab-trigger {
+  position: absolute;
+  z-index: 20;
+}
+md-fab-toolbar md-fab-trigger button {
+  overflow: visible !important;
+}
+md-fab-toolbar md-fab-trigger .md-fab-toolbar-background {
+  display: block;
+  position: absolute;
+  z-index: 21;
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-fab-toolbar md-fab-trigger md-icon {
+  position: relative;
+  z-index: 22;
+  opacity: 1;
+  transition: all 0.2s ease-in;
+}
+md-fab-toolbar.md-left md-fab-trigger {
+  right: 0;
+}
+[dir='rtl'] md-fab-toolbar.md-left md-fab-trigger {
+  right: auto;
+  left: 0;
+}
+md-fab-toolbar.md-left .md-toolbar-tools {
+  flex-direction: row-reverse;
+}
+md-fab-toolbar.md-left .md-toolbar-tools > .md-button:first-child {
+  margin-right: 0.6rem;
+}
+[dir='rtl'] md-fab-toolbar.md-left .md-toolbar-tools > .md-button:first-child {
+  margin-right: auto;
+  margin-left: 0.6rem;
+}
+md-fab-toolbar.md-left .md-toolbar-tools > .md-button:first-child {
+  margin-left: -0.8rem;
+}
+[dir='rtl'] md-fab-toolbar.md-left .md-toolbar-tools > .md-button:first-child {
+  margin-left: auto;
+  margin-right: -0.8rem;
+}
+md-fab-toolbar.md-left .md-toolbar-tools > .md-button:last-child {
+  margin-right: 8px;
+}
+[dir='rtl'] md-fab-toolbar.md-left .md-toolbar-tools > .md-button:last-child {
+  margin-right: auto;
+  margin-left: 8px;
+}
+md-fab-toolbar.md-right md-fab-trigger {
+  left: 0;
+}
+[dir='rtl'] md-fab-toolbar.md-right md-fab-trigger {
+  left: auto;
+  right: 0;
+}
+md-fab-toolbar.md-right .md-toolbar-tools {
+  flex-direction: row;
+}
+md-fab-toolbar md-toolbar {
+  background-color: transparent !important;
+  pointer-events: none;
+  z-index: 23;
+}
+md-fab-toolbar md-toolbar .md-toolbar-tools {
+  padding: 0 20px;
+  margin-top: 3px;
+}
+md-fab-toolbar md-toolbar .md-fab-action-item {
+  opacity: 0;
+  transform: scale(0);
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.15s;
+}
+md-fab-toolbar.md-is-open md-fab-trigger > button {
+  box-shadow: none;
+}
+md-fab-toolbar.md-is-open md-fab-trigger > button md-icon {
+  opacity: 0;
+}
+md-fab-toolbar.md-is-open .md-fab-action-item {
+  opacity: 1;
+  transform: scale(1);
+}
+md-grid-list {
+  box-sizing: border-box;
+  display: block;
+  position: relative;
+}
+md-grid-list md-grid-tile,
+md-grid-list md-grid-tile-footer,
+md-grid-list md-grid-tile-header,
+md-grid-list md-grid-tile > figure {
+  box-sizing: border-box;
+}
+md-grid-list md-grid-tile {
+  display: block;
+  position: absolute;
+}
+md-grid-list md-grid-tile figure {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 0;
+  margin: 0;
+}
+md-grid-list md-grid-tile md-grid-tile-footer,
+md-grid-list md-grid-tile md-grid-tile-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  height: 48px;
+  color: #fff;
+  background: rgba(0, 0, 0, 0.18);
+  overflow: hidden;
+  position: absolute;
+  left: 0;
+  right: 0;
+}
+md-grid-list md-grid-tile md-grid-tile-footer h3,
+md-grid-list md-grid-tile md-grid-tile-footer h4,
+md-grid-list md-grid-tile md-grid-tile-header h3,
+md-grid-list md-grid-tile md-grid-tile-header h4 {
+  font-weight: 400;
+  margin: 0 0 0 16px;
+}
+md-grid-list md-grid-tile md-grid-tile-footer h3,
+md-grid-list md-grid-tile md-grid-tile-header h3 {
+  font-size: 14px;
+}
+md-grid-list md-grid-tile md-grid-tile-footer h4,
+md-grid-list md-grid-tile md-grid-tile-header h4 {
+  font-size: 12px;
+}
+md-grid-list md-grid-tile md-grid-tile-header {
+  top: 0;
+}
+md-grid-list md-grid-tile md-grid-tile-footer {
+  bottom: 0;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-grid-tile {
+    border: 1px solid #fff;
+  }
+  md-grid-tile-footer {
+    border-top: 1px solid #fff;
+  }
+}
+md-icon {
+  margin: auto;
+  background-repeat: no-repeat;
+  display: inline-block;
+  vertical-align: middle;
+  fill: currentColor;
+  height: 24px;
+  width: 24px;
+  min-height: 24px;
+  min-width: 24px;
+}
+md-icon svg {
+  pointer-events: none;
+  display: block;
+}
+md-icon[md-font-icon] {
+  line-height: 24px;
+  width: auto;
+}
+md-input-container {
+  display: inline-block;
+  position: relative;
+  padding: 2px;
+  margin: 18px 0;
+  vertical-align: middle;
+}
+md-input-container:after {
+  content: '';
+  display: table;
+  clear: both;
+}
+md-input-container.md-block {
+  display: block;
+}
+md-input-container .md-errors-spacer {
+  float: right;
+  min-height: 24px;
+  min-width: 1px;
+}
+[dir='rtl'] md-input-container .md-errors-spacer {
+  float: left;
+}
+md-input-container > md-icon {
+  position: absolute;
+  top: 8px;
+  left: 2px;
+  right: auto;
+}
+[dir='rtl'] md-input-container > md-icon {
+  left: auto;
+}
+[dir='rtl'] md-input-container > md-icon {
+  right: 2px;
+}
+md-input-container input[type='color'],
+md-input-container input[type='date'],
+md-input-container input[type='datetime-local'],
+md-input-container input[type='datetime'],
+md-input-container input[type='email'],
+md-input-container input[type='month'],
+md-input-container input[type='number'],
+md-input-container input[type='password'],
+md-input-container input[type='search'],
+md-input-container input[type='tel'],
+md-input-container input[type='text'],
+md-input-container input[type='time'],
+md-input-container input[type='url'],
+md-input-container input[type='week'],
+md-input-container textarea {
+  -moz-appearance: none;
+  -webkit-appearance: none;
+}
+md-input-container input[type='date'],
+md-input-container input[type='datetime-local'],
+md-input-container input[type='month'],
+md-input-container input[type='time'],
+md-input-container input[type='week'] {
+  min-height: 30px;
+}
+md-input-container textarea {
+  resize: none;
+  overflow: hidden;
+}
+md-input-container textarea.md-input {
+  min-height: 30px;
+  -ms-flex-preferred-size: auto;
+}
+md-input-container textarea[md-no-autogrow] {
+  height: auto;
+  overflow: auto;
+}
+md-input-container label:not(.md-container-ignore) {
+  position: absolute;
+  bottom: 100%;
+  left: 0;
+  right: auto;
+}
+[dir='rtl'] md-input-container label:not(.md-container-ignore) {
+  left: auto;
+}
+[dir='rtl'] md-input-container label:not(.md-container-ignore) {
+  right: 0;
+}
+md-input-container label:not(.md-container-ignore).md-required:after {
+  content: ' *';
+  font-size: 13px;
+  vertical-align: top;
+}
+md-input-container .md-placeholder,
+md-input-container label:not(.md-no-float):not(.md-container-ignore) {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 100%;
+  order: 1;
+  pointer-events: none;
+  -webkit-font-smoothing: antialiased;
+  padding-left: 2px;
+  padding-right: 0;
+  z-index: 1;
+  transform: translate3d(0, 28px, 0) scale(1);
+  transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  max-width: 100%;
+  transform-origin: left top;
+}
+[dir='rtl'] md-input-container .md-placeholder,
+[dir='rtl']
+  md-input-container
+  label:not(.md-no-float):not(.md-container-ignore) {
+  padding-left: 0;
+}
+[dir='rtl'] md-input-container .md-placeholder,
+[dir='rtl']
+  md-input-container
+  label:not(.md-no-float):not(.md-container-ignore) {
+  padding-right: 2px;
+}
+[dir='rtl'] md-input-container .md-placeholder,
+[dir='rtl']
+  md-input-container
+  label:not(.md-no-float):not(.md-container-ignore) {
+  transform-origin: right top;
+}
+md-input-container.md-input-has-value .md-placeholder,
+md-input-container.md-input-has-value
+  label:not(.md-no-float):not(.md-container-ignore) {
+  padding-left: 3px;
+  padding-right: 0;
+}
+[dir='rtl'] md-input-container.md-input-has-value .md-placeholder,
+[dir='rtl']
+  md-input-container.md-input-has-value
+  label:not(.md-no-float):not(.md-container-ignore) {
+  padding-left: 0;
+}
+[dir='rtl'] md-input-container.md-input-has-value .md-placeholder,
+[dir='rtl']
+  md-input-container.md-input-has-value
+  label:not(.md-no-float):not(.md-container-ignore) {
+  padding-right: 3px;
+}
+md-input-container .md-placeholder {
+  position: absolute;
+  top: 0;
+  opacity: 0;
+  transition-property: opacity, transform;
+  transform: translate3d(0, 30px, 0);
+}
+md-input-container.md-input-focused .md-placeholder {
+  opacity: 1;
+  transform: translate3d(0, 24px, 0);
+}
+md-input-container.md-input-has-value .md-placeholder {
+  transition: none;
+  opacity: 0;
+}
+md-input-container:not(.md-input-has-value):not(.md-input-has-placeholder)
+  input:not(:focus) {
+  color: transparent;
+}
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-ampm-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-day-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-hour-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-millisecond-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-minute-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-month-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-second-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-text,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-week-field,
+md-input-container:not(.md-input-has-value)
+  input:not(:focus)::-webkit-datetime-edit-year-field {
+  color: transparent;
+}
+md-input-container .md-input {
+  order: 2;
+  display: block;
+  margin-top: 0;
+  background: none;
+  padding: 2px 2px 1px 0;
+  border-width: 0 0 1px;
+  line-height: 26px;
+  height: 30px;
+  -ms-flex-preferred-size: 26px;
+  border-radius: 0;
+  border-style: solid;
+  transition: border-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  width: 100%;
+  box-sizing: border-box;
+  float: left;
+}
+[dir='rtl'] md-input-container .md-input {
+  padding-left: 2px;
+}
+[dir='rtl'] md-input-container .md-input {
+  padding-right: 0;
+}
+[dir='rtl'] md-input-container .md-input {
+  float: right;
+}
+md-input-container .md-input:focus {
+  outline: none;
+}
+md-input-container .md-input:invalid {
+  outline: none;
+  box-shadow: none;
+}
+md-input-container .md-input.md-no-flex {
+  flex: none !important;
+}
+md-input-container .md-char-counter {
+  text-align: right;
+  padding-right: 2px;
+  padding-left: 0;
+}
+[dir='rtl'] md-input-container .md-char-counter {
+  text-align: left;
+}
+[dir='rtl'] md-input-container .md-char-counter {
+  padding-right: 0;
+}
+[dir='rtl'] md-input-container .md-char-counter {
+  padding-left: 2px;
+}
+md-input-container .md-input-messages-animation {
+  position: relative;
+  order: 4;
+  overflow: hidden;
+  clear: left;
+}
+[dir='rtl'] md-input-container .md-input-messages-animation {
+  clear: right;
+}
+md-input-container .md-char-counter,
+md-input-container .md-input-message-animation {
+  font-size: 12px;
+  line-height: 14px;
+  overflow: hidden;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  opacity: 1;
+  margin-top: 0;
+  padding-top: 8px;
+}
+md-input-container .md-char-counter:not(.md-char-counter),
+md-input-container .md-input-message-animation:not(.md-char-counter) {
+  padding-right: 5px;
+  padding-left: 0;
+}
+[dir='rtl'] md-input-container .md-char-counter:not(.md-char-counter),
+[dir='rtl']
+  md-input-container
+  .md-input-message-animation:not(.md-char-counter) {
+  padding-right: 0;
+}
+[dir='rtl'] md-input-container .md-char-counter:not(.md-char-counter),
+[dir='rtl']
+  md-input-container
+  .md-input-message-animation:not(.md-char-counter) {
+  padding-left: 5px;
+}
+md-input-container:not(.md-input-invalid)
+  .md-auto-hide
+  .md-input-message-animation {
+  opacity: 0;
+  margin-top: -100px;
+}
+md-input-container .md-input-message-animation.ng-enter-prepare {
+  opacity: 0;
+  margin-top: -100px;
+}
+md-input-container .md-input-message-animation.ng-enter:not(.ng-enter-active) {
+  opacity: 0;
+  margin-top: -100px;
+}
+md-input-container.md-input-focused label:not(.md-no-float),
+md-input-container.md-input-has-placeholder label:not(.md-no-float),
+md-input-container.md-input-has-value label:not(.md-no-float) {
+  transform: translate3d(0, 6px, 0) scale(0.75);
+  transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1),
+    width 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-input-container.md-input-has-value label {
+  transition: none;
+}
+md-input-container.md-input-focused .md-input,
+md-input-container.md-input-resized .md-input,
+md-input-container .md-input.ng-invalid.ng-dirty {
+  padding-bottom: 0;
+  border-width: 0 0 2px;
+}
+[disabled] md-input-container .md-input,
+md-input-container .md-input[disabled] {
+  background-position: bottom -1px left 0;
+  background-size: 4px 1px;
+  background-repeat: repeat-x;
+}
+md-input-container.md-icon-float {
+  transition: margin-top 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-input-container.md-icon-float > label {
+  pointer-events: none;
+  position: absolute;
+}
+md-input-container.md-icon-float > md-icon {
+  top: 8px;
+  left: 2px;
+  right: auto;
+}
+[dir='rtl'] md-input-container.md-icon-float > md-icon {
+  left: auto;
+}
+[dir='rtl'] md-input-container.md-icon-float > md-icon {
+  right: 2px;
+}
+md-input-container.md-icon-left > label .md-placeholder,
+md-input-container.md-icon-left
+  > label:not(.md-no-float):not(.md-container-ignore),
+md-input-container.md-icon-right > label .md-placeholder,
+md-input-container.md-icon-right
+  > label:not(.md-no-float):not(.md-container-ignore) {
+  width: calc(100% - 36px);
+  padding: 0;
+}
+md-input-container.md-icon-left {
+  padding-left: 36px;
+  padding-right: 0;
+}
+[dir='rtl'] md-input-container.md-icon-left {
+  padding-left: 0;
+}
+[dir='rtl'] md-input-container.md-icon-left {
+  padding-right: 36px;
+}
+md-input-container.md-icon-left > label {
+  left: 36px;
+  right: auto;
+}
+[dir='rtl'] md-input-container.md-icon-left > label {
+  left: auto;
+}
+[dir='rtl'] md-input-container.md-icon-left > label {
+  right: 36px;
+}
+md-input-container.md-icon-right {
+  padding-left: 0;
+  padding-right: 36px;
+}
+[dir='rtl'] md-input-container.md-icon-right {
+  padding-left: 36px;
+}
+[dir='rtl'] md-input-container.md-icon-right {
+  padding-right: 0;
+}
+md-input-container.md-icon-right > md-icon:last-of-type {
+  margin: 0;
+  right: 2px;
+  left: auto;
+}
+[dir='rtl'] md-input-container.md-icon-right > md-icon:last-of-type {
+  right: auto;
+}
+[dir='rtl'] md-input-container.md-icon-right > md-icon:last-of-type {
+  left: 2px;
+}
+md-input-container.md-icon-left.md-icon-right {
+  padding-left: 36px;
+  padding-right: 36px;
+}
+md-input-container.md-icon-left.md-icon-right > label .md-placeholder,
+md-input-container.md-icon-left.md-icon-right
+  > label:not(.md-no-float):not(.md-container-ignore) {
+  width: calc(100% - 72px);
+}
+.md-resize-wrapper {
+  position: relative;
+}
+.md-resize-wrapper:after {
+  content: '';
+  display: table;
+  clear: both;
+}
+.md-resize-handle {
+  position: absolute;
+  bottom: -5px;
+  left: 0;
+  height: 10px;
+  background: transparent;
+  width: 100%;
+  cursor: ns-resize;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-input-container.md-default-theme > md-icon {
+    fill: #fff;
+  }
+}
+md-list {
+  display: block;
+  padding: 8px 0;
+}
+md-list .md-subheader {
+  font-size: 14px;
+  font-weight: 500;
+  letter-spacing: 0.01em;
+  line-height: 1.2em;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item,
+md-list.md-dense:not(.md-dense-disabled) md-list-item .md-list-item-inner {
+  min-height: 40px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner:before,
+md-list.md-dense:not(.md-dense-disabled) md-list-item:before {
+  content: '';
+  min-height: 40px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  md-icon:first-child,
+md-list.md-dense:not(.md-dense-disabled) md-list-item md-icon:first-child {
+  width: 20px;
+  height: 20px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  > md-icon:first-child:not(.md-avatar-icon),
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  > md-icon:first-child:not(.md-avatar-icon) {
+  margin-right: 36px;
+  margin-top: 4px;
+  margin-bottom: 4px;
+}
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  > md-icon:first-child:not(.md-avatar-icon),
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  > md-icon:first-child:not(.md-avatar-icon) {
+  margin-right: auto;
+  margin-left: 36px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item .md-avatar,
+md-list.md-dense:not(.md-dense-disabled) md-list-item .md-avatar-icon,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-avatar,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-avatar-icon {
+  margin-right: 20px;
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+[dir='rtl'] md-list.md-dense:not(.md-dense-disabled) md-list-item .md-avatar,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-avatar-icon,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-avatar,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-avatar-icon {
+  margin-right: auto;
+  margin-left: 20px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item .md-avatar,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-avatar {
+  flex: none;
+  width: 36px;
+  height: 36px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  .md-secondary.md-button,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-secondary-container
+  .md-secondary.md-button {
+  margin-top: 4px;
+  margin-bottom: 4px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  md-checkbox:not(.md-dense-disabled),
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item
+  .md-secondary-container
+  md-checkbox:not(.md-dense-disabled) {
+  min-height: 40px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text.md-offset,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text.md-offset,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text.md-offset,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text.md-offset {
+  margin-left: 56px;
+}
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text.md-offset,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text.md-offset,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text.md-offset,
+[dir='rtl']
+  md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text.md-offset {
+  margin-left: auto;
+  margin-right: 56px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text
+  h4,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text
+  p,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text
+  h4,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text
+  p,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text
+  h4,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text
+  p,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text
+  h4,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text
+  p {
+  line-height: 1.05;
+  font-size: 12px;
+  padding-bottom: 4px;
+}
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  .md-list-item-text
+  h3,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  .md-list-item-text
+  h3 {
+  font-size: 13px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-2-line,
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-2-line > .md-no-style {
+  min-height: 60px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-2-line:before,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style:before {
+  content: '';
+  min-height: 60px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-2-line .md-avatar-icon,
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-2-line > .md-avatar,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  .md-avatar-icon,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-2-line
+  > .md-no-style
+  > .md-avatar {
+  margin-top: 12px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-3-line,
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-3-line > .md-no-style {
+  min-height: 76px;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-3-line:before,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style:before {
+  content: '';
+  min-height: 76px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list.md-dense:not(.md-dense-disabled) md-list-item.md-3-line > .md-avatar,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  > .md-avatar,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > .md-no-style
+  > md-icon:first-child,
+md-list.md-dense:not(.md-dense-disabled)
+  md-list-item.md-3-line
+  > md-icon:first-child {
+  margin-top: 16px;
+}
+md-list.md-dense:not(.md-dense-disabled) .md-subheader-inner {
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+md-list-item {
+  position: relative;
+}
+md-list-item.md-proxy-focus.md-focused .md-no-style {
+  transition: background-color 0.15s linear;
+}
+md-list-item._md-button-wrap {
+  position: relative;
+}
+md-list-item._md-button-wrap > div.md-button:first-child {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+  padding: 0 16px;
+  margin: 0;
+  font-weight: 400;
+  text-align: left;
+  border: none;
+}
+[dir='rtl'] md-list-item._md-button-wrap > div.md-button:first-child {
+  text-align: right;
+}
+md-list-item._md-button-wrap
+  > div.md-button:first-child
+  > .md-button:first-child {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+md-list-item._md-button-wrap > div.md-button:first-child .md-list-item-inner {
+  width: 100%;
+}
+md-list-item._md-button-wrap
+  > div.md-button:first-child
+  .md-list-item-inner:before {
+  content: '';
+  min-height: inherit;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list-item.md-no-proxy,
+md-list-item .md-no-style {
+  position: relative;
+  padding: 0 16px;
+  flex: 1 1 auto;
+}
+md-list-item.md-no-proxy.md-button,
+md-list-item .md-no-style.md-button {
+  font-size: inherit;
+  height: inherit;
+  text-align: left;
+  text-transform: none;
+  width: 100%;
+  white-space: normal;
+  flex-direction: inherit;
+  align-items: inherit;
+  border-radius: 0;
+  margin: 0;
+}
+[dir='rtl'] md-list-item.md-no-proxy.md-button,
+[dir='rtl'] md-list-item .md-no-style.md-button {
+  text-align: right;
+}
+md-list-item.md-no-proxy.md-button > .md-ripple-container,
+md-list-item .md-no-style.md-button > .md-ripple-container {
+  border-radius: 0;
+}
+md-list-item.md-no-proxy:focus,
+md-list-item .md-no-style:focus {
+  outline: none;
+}
+md-list-item.md-clickable:hover {
+  cursor: pointer;
+}
+md-list-item md-divider {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+}
+[dir='rtl'] md-list-item md-divider {
+  left: auto;
+  right: 0;
+}
+md-list-item md-divider[md-inset] {
+  left: 72px;
+  width: calc(100% - 72px);
+  margin: 0 !important;
+}
+[dir='rtl'] md-list-item md-divider[md-inset] {
+  left: auto;
+  right: 72px;
+}
+md-list-item,
+md-list-item .md-list-item-inner {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  min-height: 48px;
+  height: auto;
+}
+md-list-item .md-list-item-inner:before,
+md-list-item:before {
+  content: '';
+  min-height: 48px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list-item
+  .md-list-item-inner
+  > div.md-primary
+  > md-icon:not(.md-avatar-icon),
+md-list-item
+  .md-list-item-inner
+  > div.md-secondary
+  > md-icon:not(.md-avatar-icon),
+md-list-item .md-list-item-inner > md-icon.md-secondary:not(.md-avatar-icon),
+md-list-item .md-list-item-inner > md-icon:first-child:not(.md-avatar-icon),
+md-list-item > div.md-primary > md-icon:not(.md-avatar-icon),
+md-list-item > div.md-secondary > md-icon:not(.md-avatar-icon),
+md-list-item > md-icon.md-secondary:not(.md-avatar-icon),
+md-list-item > md-icon:first-child:not(.md-avatar-icon) {
+  width: 24px;
+  margin-top: 16px;
+  margin-bottom: 12px;
+  box-sizing: content-box;
+}
+md-list-item .md-list-item-inner > div.md-primary > md-checkbox,
+md-list-item .md-list-item-inner > div.md-secondary > md-checkbox,
+md-list-item .md-list-item-inner > md-checkbox,
+md-list-item .md-list-item-inner md-checkbox.md-secondary,
+md-list-item > div.md-primary > md-checkbox,
+md-list-item > div.md-secondary > md-checkbox,
+md-list-item > md-checkbox,
+md-list-item md-checkbox.md-secondary {
+  align-self: center;
+}
+md-list-item .md-list-item-inner > div.md-primary > md-checkbox .md-label,
+md-list-item .md-list-item-inner > div.md-secondary > md-checkbox .md-label,
+md-list-item .md-list-item-inner > md-checkbox .md-label,
+md-list-item .md-list-item-inner md-checkbox.md-secondary .md-label,
+md-list-item > div.md-primary > md-checkbox .md-label,
+md-list-item > div.md-secondary > md-checkbox .md-label,
+md-list-item > md-checkbox .md-label,
+md-list-item md-checkbox.md-secondary .md-label {
+  display: none;
+}
+md-list-item .md-list-item-inner > md-icon:first-child:not(.md-avatar-icon),
+md-list-item > md-icon:first-child:not(.md-avatar-icon) {
+  margin-right: 32px;
+}
+[dir='rtl']
+  md-list-item
+  .md-list-item-inner
+  > md-icon:first-child:not(.md-avatar-icon),
+[dir='rtl'] md-list-item > md-icon:first-child:not(.md-avatar-icon) {
+  margin-right: auto;
+  margin-left: 32px;
+}
+md-list-item .md-avatar,
+md-list-item .md-avatar-icon,
+md-list-item .md-list-item-inner .md-avatar,
+md-list-item .md-list-item-inner .md-avatar-icon {
+  margin-top: 8px;
+  margin-bottom: 8px;
+  margin-right: 16px;
+  border-radius: 50%;
+  box-sizing: content-box;
+}
+[dir='rtl'] md-list-item .md-avatar,
+[dir='rtl'] md-list-item .md-avatar-icon,
+[dir='rtl'] md-list-item .md-list-item-inner .md-avatar,
+[dir='rtl'] md-list-item .md-list-item-inner .md-avatar-icon {
+  margin-right: auto;
+  margin-left: 16px;
+}
+md-list-item .md-avatar,
+md-list-item .md-list-item-inner .md-avatar {
+  flex: none;
+  width: 40px;
+  height: 40px;
+}
+md-list-item .md-avatar-icon,
+md-list-item .md-list-item-inner .md-avatar-icon {
+  padding: 8px;
+}
+md-list-item .md-avatar-icon svg,
+md-list-item .md-list-item-inner .md-avatar-icon svg {
+  width: 24px;
+  height: 24px;
+}
+md-list-item .md-list-item-inner > md-checkbox,
+md-list-item > md-checkbox {
+  width: 24px;
+  min-height: 40px;
+  margin-left: 0;
+  margin-right: 29px;
+}
+[dir='rtl'] md-list-item .md-list-item-inner > md-checkbox,
+[dir='rtl'] md-list-item > md-checkbox {
+  margin-left: 29px;
+}
+[dir='rtl'] md-list-item .md-list-item-inner > md-checkbox,
+[dir='rtl'] md-list-item > md-checkbox {
+  margin-right: 0;
+}
+md-list-item .md-list-item-inner .md-secondary-container,
+md-list-item .md-secondary-container {
+  display: flex;
+  align-items: center;
+  position: relative;
+  flex-shrink: 0;
+  margin: auto 0 auto auto;
+}
+[dir='rtl'] md-list-item .md-list-item-inner .md-secondary-container,
+[dir='rtl'] md-list-item .md-secondary-container {
+  margin-right: auto;
+}
+[dir='rtl'] md-list-item .md-list-item-inner .md-secondary-container,
+[dir='rtl'] md-list-item .md-secondary-container {
+  margin-left: 0;
+}
+md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  .md-button:last-of-type,
+md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  .md-icon-button:last-of-type,
+md-list-item .md-secondary-container .md-button:last-of-type,
+md-list-item .md-secondary-container .md-icon-button:last-of-type {
+  margin-right: 0;
+}
+[dir='rtl']
+  md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  .md-button:last-of-type,
+[dir='rtl']
+  md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  .md-icon-button:last-of-type,
+[dir='rtl'] md-list-item .md-secondary-container .md-button:last-of-type,
+[dir='rtl'] md-list-item .md-secondary-container .md-icon-button:last-of-type {
+  margin-right: auto;
+  margin-left: 0;
+}
+md-list-item .md-list-item-inner .md-secondary-container md-checkbox,
+md-list-item .md-secondary-container md-checkbox {
+  margin: 0 6px;
+  padding: 0 8px;
+  min-height: 40px;
+}
+md-list-item .md-list-item-inner .md-secondary-container md-checkbox:last-child,
+md-list-item .md-secondary-container md-checkbox:last-child {
+  width: 40px;
+  margin-right: 0;
+}
+[dir='rtl']
+  md-list-item
+  .md-list-item-inner
+  .md-secondary-container
+  md-checkbox:last-child,
+[dir='rtl'] md-list-item .md-secondary-container md-checkbox:last-child {
+  margin-right: auto;
+  margin-left: 0;
+}
+md-list-item .md-list-item-inner .md-secondary-container md-switch,
+md-list-item .md-secondary-container md-switch {
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-right: -6px;
+}
+[dir='rtl'] md-list-item .md-list-item-inner .md-secondary-container md-switch,
+[dir='rtl'] md-list-item .md-secondary-container md-switch {
+  margin-right: auto;
+  margin-left: -6px;
+}
+md-list-item .md-list-item-inner > .md-list-item-inner > p,
+md-list-item .md-list-item-inner > p,
+md-list-item > .md-list-item-inner > p,
+md-list-item > p {
+  flex: 1 1 auto;
+  margin: 0;
+}
+md-list-item.md-2-line,
+md-list-item.md-2-line > .md-no-style,
+md-list-item.md-3-line,
+md-list-item.md-3-line > .md-no-style {
+  align-items: flex-start;
+  justify-content: center;
+}
+md-list-item.md-2-line.md-long-text,
+md-list-item.md-2-line > .md-no-style.md-long-text,
+md-list-item.md-3-line.md-long-text,
+md-list-item.md-3-line > .md-no-style.md-long-text {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+md-list-item.md-2-line .md-list-item-text,
+md-list-item.md-2-line > .md-no-style .md-list-item-text,
+md-list-item.md-3-line .md-list-item-text,
+md-list-item.md-3-line > .md-no-style .md-list-item-text {
+  flex: 1 1 auto;
+  margin: auto;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+md-list-item.md-2-line .md-list-item-text.md-offset,
+md-list-item.md-2-line > .md-no-style .md-list-item-text.md-offset,
+md-list-item.md-3-line .md-list-item-text.md-offset,
+md-list-item.md-3-line > .md-no-style .md-list-item-text.md-offset {
+  margin-left: 56px;
+}
+[dir='rtl'] md-list-item.md-2-line .md-list-item-text.md-offset,
+[dir='rtl'] md-list-item.md-2-line > .md-no-style .md-list-item-text.md-offset,
+[dir='rtl'] md-list-item.md-3-line .md-list-item-text.md-offset,
+[dir='rtl'] md-list-item.md-3-line > .md-no-style .md-list-item-text.md-offset {
+  margin-left: auto;
+  margin-right: 56px;
+}
+md-list-item.md-2-line .md-list-item-text h3,
+md-list-item.md-2-line > .md-no-style .md-list-item-text h3,
+md-list-item.md-3-line .md-list-item-text h3,
+md-list-item.md-3-line > .md-no-style .md-list-item-text h3 {
+  font-size: 16px;
+  font-weight: 400;
+  letter-spacing: 0.01em;
+  margin: 0;
+  line-height: 1.2em;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+md-list-item.md-2-line .md-list-item-text h4,
+md-list-item.md-2-line > .md-no-style .md-list-item-text h4,
+md-list-item.md-3-line .md-list-item-text h4,
+md-list-item.md-3-line > .md-no-style .md-list-item-text h4 {
+  font-size: 14px;
+  letter-spacing: 0.01em;
+  margin: 3px 0 1px;
+  font-weight: 400;
+  line-height: 1.2em;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+md-list-item.md-2-line .md-list-item-text p,
+md-list-item.md-2-line > .md-no-style .md-list-item-text p,
+md-list-item.md-3-line .md-list-item-text p,
+md-list-item.md-3-line > .md-no-style .md-list-item-text p {
+  font-size: 14px;
+  font-weight: 500;
+  letter-spacing: 0.01em;
+  margin: 0;
+  line-height: 1.6em;
+}
+md-list-item.md-2-line,
+md-list-item.md-2-line > .md-no-style {
+  height: auto;
+  min-height: 72px;
+}
+md-list-item.md-2-line:before,
+md-list-item.md-2-line > .md-no-style:before {
+  content: '';
+  min-height: 72px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list-item.md-2-line .md-avatar-icon,
+md-list-item.md-2-line > .md-avatar,
+md-list-item.md-2-line > .md-no-style .md-avatar-icon,
+md-list-item.md-2-line > .md-no-style > .md-avatar {
+  margin-top: 12px;
+}
+md-list-item.md-2-line > .md-no-style > md-icon:first-child,
+md-list-item.md-2-line > md-icon:first-child {
+  align-self: flex-start;
+}
+md-list-item.md-2-line .md-list-item-text,
+md-list-item.md-2-line > .md-no-style .md-list-item-text {
+  flex: 1 1 auto;
+}
+md-list-item.md-3-line,
+md-list-item.md-3-line > .md-no-style {
+  height: auto;
+  min-height: 88px;
+}
+md-list-item.md-3-line:before,
+md-list-item.md-3-line > .md-no-style:before {
+  content: '';
+  min-height: 88px;
+  visibility: hidden;
+  display: inline-block;
+}
+md-list-item.md-3-line > .md-avatar,
+md-list-item.md-3-line > .md-no-style > .md-avatar,
+md-list-item.md-3-line > .md-no-style > md-icon:first-child,
+md-list-item.md-3-line > md-icon:first-child {
+  margin-top: 16px;
+}
+.md-open-menu-container {
+  position: fixed;
+  left: 0;
+  top: 0;
+  z-index: 100;
+  opacity: 0;
+  border-radius: 2px;
+  max-height: calc(100vh - 10px);
+  overflow: auto;
+}
+.md-open-menu-container md-menu-divider {
+  margin-top: 4px;
+  margin-bottom: 4px;
+  height: 1px;
+  min-height: 1px;
+  max-height: 1px;
+  width: 100%;
+}
+.md-open-menu-container md-menu-content > * {
+  opacity: 0;
+}
+.md-open-menu-container:not(.md-clickable) {
+  pointer-events: none;
+}
+.md-open-menu-container.md-active {
+  opacity: 1;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-duration: 0.2s;
+}
+.md-open-menu-container.md-active > md-menu-content > * {
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.2s;
+  transition-delay: 0.1s;
+}
+.md-open-menu-container.md-leave {
+  opacity: 0;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.25s;
+}
+md-menu-content {
+  display: flex;
+  flex-direction: column;
+  padding: 8px 0;
+  max-height: 304px;
+  overflow-y: auto;
+}
+md-menu-content.md-dense {
+  max-height: 208px;
+}
+md-menu-content.md-dense md-menu-item {
+  height: 32px;
+  min-height: 32px;
+}
+md-menu-item {
+  display: flex;
+  flex-direction: row;
+  min-height: 48px;
+  height: 48px;
+  align-content: center;
+  justify-content: flex-start;
+}
+md-menu-item > * {
+  width: 100%;
+  margin: auto 0;
+  padding-left: 16px;
+  padding-right: 16px;
+}
+md-menu-item > a.md-button {
+  padding-top: 5px;
+}
+md-menu-item > .md-button {
+  text-align: left;
+  display: inline-block;
+  border-radius: 0;
+  margin: auto 0;
+  font-size: 15px;
+  text-transform: none;
+  font-weight: 400;
+  height: 100%;
+  padding-left: 16px;
+  padding-right: 16px;
+  width: 100%;
+}
+md-menu-item > .md-button::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+[dir='rtl'] md-menu-item > .md-button {
+  text-align: right;
+}
+md-menu-item > .md-button md-icon {
+  margin: auto 16px auto 0;
+}
+[dir='rtl'] md-menu-item > .md-button md-icon {
+  margin: auto 0 auto 16px;
+}
+md-menu-item > .md-button p {
+  display: inline-block;
+  margin: auto;
+}
+md-menu-item > .md-button span {
+  margin-top: auto;
+  margin-bottom: auto;
+}
+md-menu-item > .md-button .md-ripple-container {
+  border-radius: inherit;
+}
+md-toolbar .md-menu {
+  height: auto;
+  margin: auto;
+  padding: 0;
+}
+@media (max-width: 959px) {
+  md-menu-content {
+    min-width: 112px;
+  }
+  md-menu-content[width='3'] {
+    min-width: 168px;
+  }
+  md-menu-content[width='4'] {
+    min-width: 224px;
+  }
+  md-menu-content[width='5'] {
+    min-width: 280px;
+  }
+  md-menu-content[width='6'] {
+    min-width: 336px;
+  }
+  md-menu-content[width='7'] {
+    min-width: 392px;
+  }
+}
+@media (min-width: 960px) {
+  md-menu-content {
+    min-width: 96px;
+  }
+  md-menu-content[width='3'] {
+    min-width: 192px;
+  }
+  md-menu-content[width='4'] {
+    min-width: 256px;
+  }
+  md-menu-content[width='5'] {
+    min-width: 320px;
+  }
+  md-menu-content[width='6'] {
+    min-width: 384px;
+  }
+  md-menu-content[width='7'] {
+    min-width: 448px;
+  }
+}
+md-toolbar.md-menu-toolbar h2.md-toolbar-tools {
+  line-height: 1rem;
+  height: auto;
+  padding: 28px 28px 12px;
+}
+md-toolbar.md-has-open-menu {
+  position: relative;
+  z-index: 100;
+}
+md-menu-bar {
+  padding: 0 20px;
+  display: block;
+  position: relative;
+  z-index: 2;
+}
+md-menu-bar .md-menu {
+  display: inline-block;
+  padding: 0;
+  position: relative;
+}
+md-menu-bar button {
+  font-size: 14px;
+  padding: 0 10px;
+  margin: 0;
+  border: 0;
+  background-color: transparent;
+  height: 40px;
+}
+md-menu-bar md-backdrop.md-menu-backdrop {
+  z-index: -2;
+}
+md-menu-content.md-menu-bar-menu.md-dense {
+  max-height: none;
+  padding: 16px 0;
+}
+md-menu-content.md-menu-bar-menu.md-dense md-menu-item.md-indent {
+  position: relative;
+}
+md-menu-content.md-menu-bar-menu.md-dense md-menu-item.md-indent > md-icon {
+  position: absolute;
+  padding: 0;
+  width: 24px;
+  top: 6px;
+  left: 24px;
+}
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  md-menu-item.md-indent
+  > md-icon {
+  left: auto;
+  right: 24px;
+}
+md-menu-content.md-menu-bar-menu.md-dense
+  md-menu-item.md-indent
+  .md-menu
+  > .md-button,
+md-menu-content.md-menu-bar-menu.md-dense md-menu-item.md-indent > .md-button {
+  padding: 0 32px 0 64px;
+}
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  md-menu-item.md-indent
+  .md-menu
+  > .md-button,
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  md-menu-item.md-indent
+  > .md-button {
+  padding: 0 64px 0 32px;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-button {
+  min-height: 0;
+  height: 32px;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-button span {
+  float: left;
+}
+[dir='rtl'] md-menu-content.md-menu-bar-menu.md-dense .md-button span {
+  float: right;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-button span.md-alt-text {
+  float: right;
+  margin: 0 8px;
+}
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  .md-button
+  span.md-alt-text {
+  float: left;
+}
+md-menu-content.md-menu-bar-menu.md-dense md-menu-divider {
+  margin: 8px 0;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-menu > .md-button,
+md-menu-content.md-menu-bar-menu.md-dense md-menu-item > .md-button {
+  text-align: left;
+}
+[dir='rtl'] md-menu-content.md-menu-bar-menu.md-dense .md-menu > .md-button,
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  md-menu-item
+  > .md-button {
+  text-align: right;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-menu {
+  padding: 0;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-menu > .md-button {
+  position: relative;
+  margin: 0;
+  width: 100%;
+  text-transform: none;
+  font-weight: 400;
+  border-radius: 0;
+  padding-left: 16px;
+}
+[dir='rtl'] md-menu-content.md-menu-bar-menu.md-dense .md-menu > .md-button {
+  padding-left: 0;
+  padding-right: 16px;
+}
+md-menu-content.md-menu-bar-menu.md-dense .md-menu > .md-button:after {
+  display: block;
+  content: '\25BC';
+  position: absolute;
+  top: 0;
+  speak: none;
+  transform: rotate(270deg) scaleY(0.45) scaleX(0.9);
+  right: 28px;
+}
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  .md-menu
+  > .md-button:after {
+  transform: rotate(90deg) scaleY(0.45) scaleX(0.9);
+}
+[dir='rtl']
+  md-menu-content.md-menu-bar-menu.md-dense
+  .md-menu
+  > .md-button:after {
+  right: auto;
+  left: 28px;
+}
+.md-nav-bar {
+  border-style: solid;
+  border-width: 0 0 1px;
+  height: 48px;
+  position: relative;
+}
+._md-nav-bar-list {
+  outline: none;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: row;
+}
+.md-nav-item:first-of-type {
+  margin-left: 8px;
+}
+.md-button._md-nav-button {
+  line-height: 24px;
+  margin: 0 4px;
+  padding: 12px 16px;
+  transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
+}
+.md-button._md-nav-button:focus {
+  outline: none;
+}
+md-nav-ink-bar {
+  background-color: #000;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 2px;
+  transform-origin: left top;
+  will-change: transform;
+  transition: transform 0.125s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-nav-ink-bar.ng-animate {
+  transition: none;
+}
+md-nav-extra-content {
+  min-height: 48px;
+  padding-right: 12px;
+}
+@-webkit-keyframes indeterminate-rotate {
+  0% {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(1turn);
+  }
+}
+@keyframes indeterminate-rotate {
+  0% {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(1turn);
+  }
+}
+md-progress-circular {
+  position: relative;
+  display: block;
+  transform: scale(1, 1);
+}
+[dir='rtl'] md-progress-circular {
+  transform: scale(-1, 1);
+}
+md-progress-circular._md-progress-circular-disabled {
+  visibility: hidden;
+}
+md-progress-circular.md-mode-indeterminate svg {
+  -webkit-animation: indeterminate-rotate 1568.63ms linear infinite;
+  animation: indeterminate-rotate 1568.63ms linear infinite;
+}
+md-progress-circular svg {
+  position: absolute;
+  overflow: visible;
+  top: 0;
+  left: 0;
+}
+md-progress-linear {
+  display: block;
+  position: relative;
+  width: 100%;
+  height: 5px;
+  padding-top: 0 !important;
+  margin-bottom: 0 !important;
+  transform: scale(1, 1);
+}
+[dir='rtl'] md-progress-linear {
+  transform: scale(-1, 1);
+}
+md-progress-linear._md-progress-linear-disabled {
+  visibility: hidden;
+}
+md-progress-linear .md-container {
+  display: block;
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+  height: 5px;
+  transform: translate(0, 0) scale(1, 1);
+}
+md-progress-linear .md-container .md-bar {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  height: 5px;
+}
+md-progress-linear .md-container .md-dashed:before {
+  content: '';
+  display: none;
+  position: absolute;
+  margin-top: 0;
+  height: 5px;
+  width: 100%;
+  background-color: transparent;
+  background-size: 10px 10px !important;
+  background-position: 0 -23px;
+}
+md-progress-linear .md-container .md-bar1,
+md-progress-linear .md-container .md-bar2 {
+  transition: transform 0.2s linear;
+}
+md-progress-linear .md-container.md-mode-query .md-bar1 {
+  display: none;
+}
+md-progress-linear .md-container.md-mode-query .md-bar2 {
+  transition: all 0.2s linear;
+  -webkit-animation: query 0.8s cubic-bezier(0.39, 0.575, 0.565, 1) infinite;
+  animation: query 0.8s cubic-bezier(0.39, 0.575, 0.565, 1) infinite;
+}
+md-progress-linear .md-container.md-mode-determinate .md-bar1 {
+  display: none;
+}
+md-progress-linear .md-container.md-mode-indeterminate .md-bar1 {
+  -webkit-animation: md-progress-linear-indeterminate-scale-1 4s infinite,
+    md-progress-linear-indeterminate-1 4s infinite;
+  animation: md-progress-linear-indeterminate-scale-1 4s infinite,
+    md-progress-linear-indeterminate-1 4s infinite;
+}
+md-progress-linear .md-container.md-mode-indeterminate .md-bar2 {
+  -webkit-animation: md-progress-linear-indeterminate-scale-2 4s infinite,
+    md-progress-linear-indeterminate-2 4s infinite;
+  animation: md-progress-linear-indeterminate-scale-2 4s infinite,
+    md-progress-linear-indeterminate-2 4s infinite;
+}
+md-progress-linear
+  .md-container.ng-hide
+  ._md-progress-linear-disabled
+  md-progress-linear
+  .md-container {
+  -webkit-animation: none;
+  animation: none;
+}
+md-progress-linear
+  .md-container.ng-hide
+  ._md-progress-linear-disabled
+  md-progress-linear
+  .md-container
+  .md-bar1,
+md-progress-linear
+  .md-container.ng-hide
+  ._md-progress-linear-disabled
+  md-progress-linear
+  .md-container
+  .md-bar2 {
+  -webkit-animation-name: none;
+  animation-name: none;
+}
+md-progress-linear .md-container.md-mode-buffer {
+  background-color: transparent !important;
+  transition: all 0.2s linear;
+}
+md-progress-linear .md-container.md-mode-buffer .md-dashed:before {
+  display: block;
+  -webkit-animation: buffer 3s linear infinite;
+  animation: buffer 3s linear infinite;
+}
+@-webkit-keyframes query {
+  0% {
+    opacity: 1;
+    transform: translateX(35%) scale(0.3, 1);
+  }
+  to {
+    opacity: 0;
+    transform: translateX(-50%) scale(0, 1);
+  }
+}
+@keyframes query {
+  0% {
+    opacity: 1;
+    transform: translateX(35%) scale(0.3, 1);
+  }
+  to {
+    opacity: 0;
+    transform: translateX(-50%) scale(0, 1);
+  }
+}
+@-webkit-keyframes buffer {
+  0% {
+    opacity: 1;
+    background-position: 0 -23px;
+  }
+  50% {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+    background-position: -200px -23px;
+  }
+}
+@keyframes buffer {
+  0% {
+    opacity: 1;
+    background-position: 0 -23px;
+  }
+  50% {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+    background-position: -200px -23px;
+  }
+}
+@-webkit-keyframes md-progress-linear-indeterminate-scale-1 {
+  0% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: linear;
+    animation-timing-function: linear;
+  }
+  36.6% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.33473,
+      0.12482,
+      0.78584,
+      1
+    );
+    animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+  }
+  69.15% {
+    transform: scaleX(0.83);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.22573,
+      0,
+      0.23365,
+      1.37098
+    );
+    animation-timing-function: cubic-bezier(0.22573, 0, 0.23365, 1.37098);
+  }
+  to {
+    transform: scaleX(0.1);
+  }
+}
+@keyframes md-progress-linear-indeterminate-scale-1 {
+  0% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: linear;
+    animation-timing-function: linear;
+  }
+  36.6% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.33473,
+      0.12482,
+      0.78584,
+      1
+    );
+    animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+  }
+  69.15% {
+    transform: scaleX(0.83);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.22573,
+      0,
+      0.23365,
+      1.37098
+    );
+    animation-timing-function: cubic-bezier(0.22573, 0, 0.23365, 1.37098);
+  }
+  to {
+    transform: scaleX(0.1);
+  }
+}
+@-webkit-keyframes md-progress-linear-indeterminate-1 {
+  0% {
+    left: -105.16667%;
+    -webkit-animation-timing-function: linear;
+    animation-timing-function: linear;
+  }
+  20% {
+    left: -105.16667%;
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+  }
+  69.15% {
+    left: 21.5%;
+    -webkit-animation-timing-function: cubic-bezier(
+      0.30244,
+      0.38135,
+      0.55,
+      0.95635
+    );
+    animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+  }
+  to {
+    left: 95.44444%;
+  }
+}
+@keyframes md-progress-linear-indeterminate-1 {
+  0% {
+    left: -105.16667%;
+    -webkit-animation-timing-function: linear;
+    animation-timing-function: linear;
+  }
+  20% {
+    left: -105.16667%;
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+  }
+  69.15% {
+    left: 21.5%;
+    -webkit-animation-timing-function: cubic-bezier(
+      0.30244,
+      0.38135,
+      0.55,
+      0.95635
+    );
+    animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+  }
+  to {
+    left: 95.44444%;
+  }
+}
+@-webkit-keyframes md-progress-linear-indeterminate-scale-2 {
+  0% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.20503,
+      0.05705,
+      0.57661,
+      0.45397
+    );
+    animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+  }
+  19.15% {
+    transform: scaleX(0.57);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.15231,
+      0.19643,
+      0.64837,
+      1.00432
+    );
+    animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+  }
+  44.15% {
+    transform: scaleX(0.91);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.25776,
+      -0.00316,
+      0.21176,
+      1.38179
+    );
+    animation-timing-function: cubic-bezier(
+      0.25776,
+      -0.00316,
+      0.21176,
+      1.38179
+    );
+  }
+  to {
+    transform: scaleX(0.1);
+  }
+}
+@keyframes md-progress-linear-indeterminate-scale-2 {
+  0% {
+    transform: scaleX(0.1);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.20503,
+      0.05705,
+      0.57661,
+      0.45397
+    );
+    animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+  }
+  19.15% {
+    transform: scaleX(0.57);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.15231,
+      0.19643,
+      0.64837,
+      1.00432
+    );
+    animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+  }
+  44.15% {
+    transform: scaleX(0.91);
+    -webkit-animation-timing-function: cubic-bezier(
+      0.25776,
+      -0.00316,
+      0.21176,
+      1.38179
+    );
+    animation-timing-function: cubic-bezier(
+      0.25776,
+      -0.00316,
+      0.21176,
+      1.38179
+    );
+  }
+  to {
+    transform: scaleX(0.1);
+  }
+}
+@-webkit-keyframes md-progress-linear-indeterminate-2 {
+  0% {
+    left: -54.88889%;
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40968);
+    animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40968);
+  }
+  25% {
+    left: -17.25%;
+    -webkit-animation-timing-function: cubic-bezier(
+      0.31033,
+      0.28406,
+      0.8,
+      0.73372
+    );
+    animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73372);
+  }
+  48.35% {
+    left: 29.5%;
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62703, 0.6, 0.90203);
+    animation-timing-function: cubic-bezier(0.4, 0.62703, 0.6, 0.90203);
+  }
+  to {
+    left: 117.38889%;
+  }
+}
+@keyframes md-progress-linear-indeterminate-2 {
+  0% {
+    left: -54.88889%;
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40968);
+    animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40968);
+  }
+  25% {
+    left: -17.25%;
+    -webkit-animation-timing-function: cubic-bezier(
+      0.31033,
+      0.28406,
+      0.8,
+      0.73372
+    );
+    animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73372);
+  }
+  48.35% {
+    left: 29.5%;
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62703, 0.6, 0.90203);
+    animation-timing-function: cubic-bezier(0.4, 0.62703, 0.6, 0.90203);
+  }
+  to {
+    left: 117.38889%;
+  }
+}
+md-radio-button {
+  box-sizing: border-box;
+  display: block;
+  margin-bottom: 16px;
+  white-space: nowrap;
+  cursor: pointer;
+  position: relative;
+}
+md-radio-button[disabled] {
+  cursor: default;
+}
+md-radio-button[disabled] .md-container {
+  cursor: default;
+}
+md-radio-button .md-container {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  box-sizing: border-box;
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  left: 0;
+  right: auto;
+}
+[dir='rtl'] md-radio-button .md-container {
+  left: auto;
+}
+[dir='rtl'] md-radio-button .md-container {
+  right: 0;
+}
+md-radio-button .md-container .md-ripple-container {
+  position: absolute;
+  display: block;
+  width: auto;
+  height: auto;
+  left: -15px;
+  top: -15px;
+  right: -15px;
+  bottom: -15px;
+}
+md-radio-button .md-container:before {
+  box-sizing: border-box;
+  background-color: transparent;
+  border-radius: 50%;
+  content: '';
+  position: absolute;
+  display: block;
+  height: auto;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transition: all 0.5s;
+  width: auto;
+}
+md-radio-button.md-align-top-left > div.md-container {
+  top: 12px;
+}
+md-radio-button .md-off {
+  border-style: solid;
+  border-width: 2px;
+  transition: border-color 0.28s ease;
+}
+md-radio-button .md-off,
+md-radio-button .md-on {
+  box-sizing: border-box;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+}
+md-radio-button .md-on {
+  transition: transform 0.28s ease;
+  transform: scale(0);
+}
+md-radio-button.md-checked .md-on {
+  transform: scale(0.5);
+}
+md-radio-button .md-label {
+  box-sizing: border-box;
+  position: relative;
+  display: inline-block;
+  margin-left: 30px;
+  margin-right: 0;
+  vertical-align: middle;
+  white-space: normal;
+  pointer-events: none;
+  width: auto;
+}
+[dir='rtl'] md-radio-button .md-label {
+  margin-left: 0;
+}
+[dir='rtl'] md-radio-button .md-label {
+  margin-right: 30px;
+}
+md-radio-group:focus {
+  outline: none;
+}
+md-radio-group.md-focused.ng-not-empty .md-checked .md-container:before {
+  left: -8px;
+  top: -8px;
+  right: -8px;
+  bottom: -8px;
+}
+md-radio-group.md-focused.ng-empty
+  > md-radio-button:first-child
+  .md-container:before {
+  left: -8px;
+  top: -8px;
+  right: -8px;
+  bottom: -8px;
+}
+md-radio-group[disabled] md-radio-button {
+  cursor: default;
+}
+md-radio-group[disabled] md-radio-button .md-container {
+  cursor: default;
+}
+@media (max-width: 599px) {
+  .layout-row:not(.layout-xs-column) > md-radio-button,
+  .layout-xs-row > md-radio-button {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 600px) and (max-width: 959px) {
+  .layout-gt-xs-row:not(.layout-sm-column) > md-radio-button,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-sm-column)
+    > md-radio-button,
+  .layout-sm-row:not(.layout-sm-column) > md-radio-button {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 960px) and (max-width: 1279px) {
+  .layout-gt-sm-row:not(.layout-md-column) > md-radio-button,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-md-column)
+    > md-radio-button,
+  .layout-md-row:not(.layout-md-column) > md-radio-button,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-md-column)
+    > md-radio-button {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 1280px) and (max-width: 1919px) {
+  .layout-gt-md-row:not(.layout-lg-column) > md-radio-button,
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-radio-button,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-radio-button,
+  .layout-lg-row:not(.layout-lg-column) > md-radio-button,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-lg-column)
+    > md-radio-button {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 1920px) {
+  .layout-gt-lg-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button,
+  .layout-gt-md-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button,
+  .layout-gt-sm-row:not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button,
+  .layout-gt-xs-row:not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button,
+  .layout-row:not(.layout-gt-xs-column):not(.layout-gt-sm-column):not(.layout-gt-md-column):not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button,
+  .layout-xl-row:not(.layout-gt-lg-column):not(.layout-xl-column)
+    > md-radio-button {
+    margin-bottom: 0;
+  }
+}
+.md-inline-form md-radio-group {
+  margin: 18px 0 19px;
+}
+.md-inline-form md-radio-group md-radio-button {
+  display: inline-block;
+  height: 30px;
+  padding: 2px 10px 2px 6px;
+  box-sizing: border-box;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.md-inline-form md-radio-group md-radio-button .md-label {
+  top: 4px;
+}
+.md-inline-form md-radio-group md-radio-button .md-container {
+  margin-top: 2px;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-radio-button.md-default-theme .md-on {
+    background-color: #fff;
+  }
+}
+md-input-container:not([md-no-float]) .md-select-placeholder span:first-child {
+  transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transform-origin: left top;
+}
+[dir='rtl']
+  md-input-container:not([md-no-float])
+  .md-select-placeholder
+  span:first-child {
+  transform-origin: right top;
+}
+md-input-container.md-input-focused:not([md-no-float])
+  md-select:not([placeholder])
+  .md-select-placeholder
+  span:first-child {
+  transform: translate(-2px, -22px) scale(0.75);
+}
+.md-select-menu-container {
+  position: fixed;
+  left: 0;
+  top: 0;
+  z-index: 90;
+  opacity: 0;
+  display: none;
+  transform: translateY(-1px);
+}
+.md-select-menu-container:not(.md-clickable) {
+  pointer-events: none;
+}
+.md-select-menu-container md-progress-circular {
+  display: table;
+  margin: 24px auto !important;
+}
+.md-select-menu-container.md-active {
+  display: block;
+  opacity: 1;
+}
+.md-select-menu-container.md-active md-select-menu {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-duration: 0.15s;
+}
+.md-select-menu-container.md-active md-select-menu > * {
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.15s;
+  transition-delay: 0.1s;
+}
+.md-select-menu-container.md-leave {
+  opacity: 0;
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.25s;
+}
+.md-inline-form md-select {
+  margin-top: 20px;
+}
+.md-inline-form md-input-container > md-select,
+md-input-container > md-select {
+  margin-top: 0;
+}
+md-input-container > md-select {
+  order: 2;
+}
+md-input-container:not(.md-input-has-value)
+  md-select.ng-required:not(.md-no-asterisk)
+  .md-select-value
+  span:first-child:after,
+md-input-container:not(.md-input-has-value)
+  md-select[required]:not(.md-no-asterisk)
+  .md-select-value
+  span:first-child:after {
+  content: ' *';
+  font-size: 13px;
+  vertical-align: top;
+}
+md-input-container.md-input-invalid md-select .md-select-value {
+  border-bottom-style: solid;
+  padding-bottom: 1px;
+}
+md-select {
+  display: flex;
+}
+md-select.ng-required.ng-empty.ng-invalid:not(.md-no-asterisk)
+  .md-select-value
+  span:first-child:after,
+md-select[required].ng-empty.ng-invalid:not(.md-no-asterisk)
+  .md-select-value
+  span:first-child:after {
+  content: ' *';
+  font-size: 13px;
+  vertical-align: top;
+}
+md-select[disabled] .md-select-value {
+  background-position: bottom -1px left 0;
+  background-size: 4px 1px;
+  background-repeat: repeat-x;
+  padding-bottom: 2px;
+  padding-top: 1px;
+  transform: translateY(1px);
+}
+md-select:focus {
+  outline: none;
+}
+md-select[disabled]:hover {
+  cursor: default;
+}
+md-select:not([disabled]):hover {
+  cursor: pointer;
+}
+md-select:not([disabled]):focus .md-select-value {
+  border-bottom-style: solid;
+  border-bottom-width: 2px;
+  padding-bottom: 0;
+}
+md-input-container md-select:not([disabled]):focus .md-select-value {
+  border-bottom-width: 2px;
+}
+md-input-container md-select[disabled] .md-select-value {
+  background-position: bottom -1px left 0;
+}
+md-input-container md-select .md-select-value {
+  min-height: 26px;
+  border-bottom-width: 1px;
+  padding-bottom: 1px;
+}
+md-input-container md-select .md-select-value.md-select-placeholder {
+  padding-left: 0;
+  padding-right: 2px;
+}
+[dir='rtl']
+  md-input-container
+  md-select
+  .md-select-value.md-select-placeholder {
+  padding-left: 2px;
+}
+[dir='rtl']
+  md-input-container
+  md-select
+  .md-select-value.md-select-placeholder {
+  padding-right: 0;
+}
+.md-select-value {
+  display: flex;
+  align-items: center;
+  padding: 2px 2px 1px 0;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  background-color: transparent;
+  position: relative;
+  box-sizing: content-box;
+  min-width: 88px;
+  min-height: 26px;
+  margin-bottom: auto;
+  -ms-flex-item-align: start;
+  flex-grow: 1;
+}
+[dir='rtl'] .md-select-value {
+  padding-left: 2px;
+}
+[dir='rtl'] .md-select-value {
+  padding-right: 0;
+}
+.md-select-value > span:not(.md-select-icon) {
+  max-width: 100%;
+  flex: 1 1 auto;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.md-select-value > span:not(.md-select-icon) .md-text {
+  display: inline;
+}
+.md-select-value .md-select-icon {
+  display: block;
+  align-items: flex-end;
+  text-align: right;
+  width: 24px;
+  transform: translateY(-2px);
+  font-size: 1.2rem;
+}
+[dir='rtl'] .md-select-value .md-select-icon {
+  align-items: flex-start;
+}
+[dir='rtl'] .md-select-value .md-select-icon {
+  text-align: left;
+}
+.md-select-value .md-select-icon:after {
+  display: block;
+  content: '\25BC';
+  position: relative;
+  top: 2px;
+  right: -4px;
+  left: auto;
+  speak: none;
+  font-size: 13px;
+  transform: scaleY(0.5);
+}
+[dir='rtl'] .md-select-value .md-select-icon:after {
+  right: auto;
+}
+[dir='rtl'] .md-select-value .md-select-icon:after {
+  left: -4px;
+}
+.md-select-value.md-select-placeholder {
+  display: flex;
+  order: 1;
+  pointer-events: none;
+  -webkit-font-smoothing: antialiased;
+  z-index: 1;
+}
+md-select-menu {
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
+    0 2px 1px -1px rgba(0, 0, 0, 0.12);
+  max-height: 256px;
+  min-height: 48px;
+  overflow-y: hidden;
+  transform-origin: left top;
+  transform: scale(1);
+}
+md-select-menu.md-reverse {
+  flex-direction: column-reverse;
+}
+md-select-menu:not(.md-overflow) md-content {
+  padding-top: 8px;
+  padding-bottom: 8px;
+}
+[dir='rtl'] md-select-menu {
+  transform-origin: right top;
+}
+md-select-menu md-content {
+  min-width: 136px;
+  min-height: 48px;
+  max-height: 256px;
+  overflow-y: auto;
+}
+md-select-menu > * {
+  opacity: 0;
+}
+md-option {
+  cursor: pointer;
+  position: relative;
+  display: flex;
+  align-items: center;
+  width: auto;
+  transition: background 0.15s linear;
+  padding: 0 16px;
+  height: 48px;
+}
+md-option[disabled] {
+  cursor: default;
+}
+md-option:focus {
+  outline: none;
+}
+md-option .md-text {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  width: auto;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+md-optgroup {
+  display: block;
+}
+md-optgroup label {
+  display: block;
+  font-size: 14px;
+  text-transform: uppercase;
+  padding: 16px;
+  font-weight: 500;
+}
+md-optgroup md-option {
+  padding-left: 32px;
+  padding-right: 32px;
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-select-backdrop {
+    background-color: transparent;
+  }
+  md-select-menu {
+    border: 1px solid #fff;
+  }
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled {
+  padding-left: 40px;
+  padding-right: 16px;
+}
+[dir='rtl'] md-select-menu[multiple] md-option.md-checkbox-enabled {
+  padding-left: 16px;
+}
+[dir='rtl'] md-select-menu[multiple] md-option.md-checkbox-enabled {
+  padding-right: 40px;
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled .md-container {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  box-sizing: border-box;
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  left: 0;
+  right: auto;
+}
+[dir='rtl']
+  md-select-menu[multiple]
+  md-option.md-checkbox-enabled
+  .md-container {
+  left: auto;
+}
+[dir='rtl']
+  md-select-menu[multiple]
+  md-option.md-checkbox-enabled
+  .md-container {
+  right: 0;
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled .md-container:before {
+  box-sizing: border-box;
+  background-color: transparent;
+  border-radius: 50%;
+  content: '';
+  position: absolute;
+  display: block;
+  height: auto;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transition: all 0.5s;
+  width: auto;
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled .md-container:after {
+  box-sizing: border-box;
+  content: '';
+  position: absolute;
+  top: -10px;
+  right: -10px;
+  bottom: -10px;
+  left: -10px;
+}
+md-select-menu[multiple]
+  md-option.md-checkbox-enabled
+  .md-container
+  .md-ripple-container {
+  position: absolute;
+  display: block;
+  width: auto;
+  height: auto;
+  left: -15px;
+  top: -15px;
+  right: -15px;
+  bottom: -15px;
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled .md-icon {
+  box-sizing: border-box;
+  transition: 0.24s;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 18px;
+  height: 18px;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 2px;
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled[selected] .md-icon {
+  border-color: transparent;
+}
+md-select-menu[multiple]
+  md-option.md-checkbox-enabled[selected]
+  .md-icon:after {
+  box-sizing: border-box;
+  transform: rotate(45deg);
+  position: absolute;
+  left: 4px;
+  top: 0;
+  display: table;
+  width: 6px;
+  height: 12px;
+  border-width: 2px;
+  border-style: solid;
+  border-top: 0;
+  border-left: 0;
+  content: '';
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled[disabled] {
+  cursor: default;
+}
+md-select-menu[multiple]
+  md-option.md-checkbox-enabled.md-indeterminate
+  .md-icon:after {
+  box-sizing: border-box;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  display: table;
+  width: 10.8px;
+  height: 2px;
+  border-width: 2px;
+  border-style: solid;
+  border-top: 0;
+  border-left: 0;
+  content: '';
+}
+md-select-menu[multiple] md-option.md-checkbox-enabled .md-container {
+  margin-left: 10.66667px;
+  margin-right: auto;
+}
+[dir='rtl']
+  md-select-menu[multiple]
+  md-option.md-checkbox-enabled
+  .md-container {
+  margin-left: auto;
+}
+[dir='rtl']
+  md-select-menu[multiple]
+  md-option.md-checkbox-enabled
+  .md-container {
+  margin-right: 10.66667px;
+}
+md-sidenav {
+  box-sizing: border-box;
+  position: absolute;
+  flex-direction: column;
+  z-index: 60;
+  width: 320px;
+  max-width: 320px;
+  bottom: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+md-sidenav ul {
+  list-style: none;
+}
+md-sidenav.md-closed {
+  display: none;
+}
+md-sidenav.md-closed-add,
+md-sidenav.md-closed-remove {
+  display: flex;
+  transition: all 0.2s ease-in;
+}
+md-sidenav.md-closed-add.md-closed-add-active,
+md-sidenav.md-closed-remove.md-closed-remove-active {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-sidenav.md-closed.md-locked-open-add,
+md-sidenav.md-locked-open,
+md-sidenav.md-locked-open-add,
+md-sidenav.md-locked-open-remove,
+md-sidenav.md-locked-open-remove.md-closed,
+md-sidenav.md-locked-open.md-closed,
+md-sidenav.md-locked-open.md-closed.md-sidenav-left,
+md-sidenav.md-locked-open.md-closed.md-sidenav-right {
+  position: static;
+  display: flex;
+  transform: translate3d(0, 0, 0);
+}
+md-sidenav.md-closed.md-locked-open-add:not(.md-locked-open-add-active) {
+  transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2),
+    min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  width: 0 !important;
+  min-width: 0 !important;
+}
+md-sidenav.md-closed.md-locked-open-add-active,
+md-sidenav.md-locked-open-remove-active {
+  transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2),
+    min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-sidenav.md-locked-open-remove-active {
+  width: 0 !important;
+  min-width: 0 !important;
+}
+.md-sidenav-backdrop.md-locked-open {
+  display: none;
+}
+.md-sidenav-left,
+md-sidenav {
+  left: 0;
+  top: 0;
+  transform: translate3d(0, 0, 0);
+}
+.md-sidenav-left.md-closed,
+md-sidenav.md-closed {
+  transform: translate3d(-100%, 0, 0);
+}
+.md-sidenav-right {
+  left: 100%;
+  top: 0;
+  transform: translate(-100%, 0);
+}
+.md-sidenav-right.md-closed {
+  transform: translate(0, 0);
+}
+@media (min-width: 600px) {
+  md-sidenav {
+    max-width: 400px;
+  }
+}
+@media (max-width: 456px) {
+  md-sidenav {
+    width: calc(100% - 56px);
+    min-width: calc(100% - 56px);
+    max-width: calc(100% - 56px);
+  }
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-sidenav-left,
+  md-sidenav {
+    border-right: 1px solid #fff;
+  }
+  .md-sidenav-right {
+    border-left: 1px solid #fff;
+  }
+}
+@-webkit-keyframes sliderFocusThumb {
+  0% {
+    transform: scale(0.7);
+  }
+  30% {
+    transform: scale(1);
+  }
+  to {
+    transform: scale(0.7);
+  }
+}
+@keyframes sliderFocusThumb {
+  0% {
+    transform: scale(0.7);
+  }
+  30% {
+    transform: scale(1);
+  }
+  to {
+    transform: scale(0.7);
+  }
+}
+@-webkit-keyframes sliderDiscreteFocusThumb {
+  0% {
+    transform: scale(0.7);
+  }
+  50% {
+    transform: scale(0.8);
+  }
+  to {
+    transform: scale(0);
+  }
+}
+@keyframes sliderDiscreteFocusThumb {
+  0% {
+    transform: scale(0.7);
+  }
+  50% {
+    transform: scale(0.8);
+  }
+  to {
+    transform: scale(0);
+  }
+}
+@-webkit-keyframes sliderDiscreteFocusRing {
+  0% {
+    transform: scale(0.7);
+    opacity: 0;
+  }
+  50% {
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    transform: scale(0);
+  }
+}
+@keyframes sliderDiscreteFocusRing {
+  0% {
+    transform: scale(0.7);
+    opacity: 0;
+  }
+  50% {
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    transform: scale(0);
+  }
+}
+md-slider {
+  height: 48px;
+  min-width: 128px;
+  position: relative;
+  margin-left: 4px;
+  margin-right: 4px;
+  padding: 0;
+  display: block;
+  flex-direction: row;
+}
+md-slider *,
+md-slider :after {
+  box-sizing: border-box;
+}
+md-slider .md-slider-wrapper {
+  outline: none;
+  width: 100%;
+  height: 100%;
+}
+md-slider .md-slider-content {
+  position: relative;
+}
+md-slider .md-track-container {
+  width: 100%;
+  position: absolute;
+  top: 23px;
+  height: 2px;
+}
+md-slider .md-track {
+  position: absolute;
+  left: 0;
+  right: 0;
+  height: 100%;
+}
+md-slider .md-track-fill {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-property: width, height;
+}
+md-slider .md-track-ticks {
+  position: absolute;
+  left: 0;
+  right: 0;
+  height: 100%;
+}
+md-slider .md-track-ticks canvas {
+  width: 100%;
+  height: 100%;
+}
+md-slider .md-thumb-container {
+  position: absolute;
+  left: 0;
+  top: 50%;
+  transform: translate3d(-50%, -50%, 0);
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-property: left, right, bottom;
+}
+[dir='rtl'] md-slider .md-thumb-container {
+  left: auto;
+  right: 0;
+}
+md-slider .md-thumb {
+  z-index: 1;
+  position: absolute;
+  left: -10px;
+  top: 14px;
+  width: 20px;
+  height: 20px;
+  border-radius: 20px;
+  transform: scale(0.7);
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+[dir='rtl'] md-slider .md-thumb {
+  left: auto;
+  right: -10px;
+}
+md-slider .md-thumb:after {
+  content: '';
+  position: absolute;
+  width: 20px;
+  height: 20px;
+  border-radius: 20px;
+  border-width: 3px;
+  border-style: solid;
+  transition: inherit;
+}
+md-slider .md-sign {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: absolute;
+  left: -14px;
+  top: -17px;
+  width: 28px;
+  height: 28px;
+  border-radius: 28px;
+  transform: scale(0.4) translate3d(0, 67.5px, 0);
+  transition: all 0.3s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-slider .md-sign:after {
+  position: absolute;
+  content: '';
+  left: 0;
+  border-radius: 16px;
+  top: 19px;
+  border-left: 14px solid transparent;
+  border-right: 14px solid transparent;
+  border-top-width: 16px;
+  border-top-style: solid;
+  opacity: 0;
+  transform: translate3d(0, -8px, 0);
+  transition: all 0.2s cubic-bezier(0.35, 0, 0.25, 1);
+}
+[dir='rtl'] md-slider .md-sign:after {
+  left: auto;
+  right: 0;
+}
+md-slider .md-sign .md-thumb-text {
+  z-index: 1;
+  font-size: 12px;
+  font-weight: 700;
+}
+md-slider .md-focus-ring {
+  position: absolute;
+  left: -17px;
+  top: 7px;
+  width: 34px;
+  height: 34px;
+  border-radius: 34px;
+  transform: scale(0.7);
+  opacity: 0;
+  transition: all 0.35s cubic-bezier(0.35, 0, 0.25, 1);
+}
+[dir='rtl'] md-slider .md-focus-ring {
+  left: auto;
+  right: -17px;
+}
+md-slider .md-disabled-thumb {
+  position: absolute;
+  left: -14px;
+  top: 10px;
+  width: 28px;
+  height: 28px;
+  border-radius: 28px;
+  transform: scale(0.5);
+  border-width: 4px;
+  border-style: solid;
+  display: none;
+}
+[dir='rtl'] md-slider .md-disabled-thumb {
+  left: auto;
+  right: -14px;
+}
+md-slider.md-min .md-sign {
+  opacity: 0;
+}
+md-slider:focus {
+  outline: none;
+}
+md-slider.md-dragging .md-thumb-container,
+md-slider.md-dragging .md-track-fill {
+  transition: none;
+}
+md-slider:not([md-discrete]) .md-sign,
+md-slider:not([md-discrete]) .md-track-ticks {
+  display: none;
+}
+md-slider:not([md-discrete]):not([disabled])
+  .md-slider-wrapper
+  .md-thumb:hover {
+  transform: scale(0.8);
+}
+md-slider:not([md-discrete]):not([disabled])
+  .md-slider-wrapper.md-focused
+  .md-focus-ring {
+  transform: scale(1);
+  opacity: 1;
+}
+md-slider:not([md-discrete]):not([disabled])
+  .md-slider-wrapper.md-focused
+  .md-thumb {
+  -webkit-animation: sliderFocusThumb 0.7s cubic-bezier(0.35, 0, 0.25, 1);
+  animation: sliderFocusThumb 0.7s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-slider:not([md-discrete]):not([disabled]).md-active
+  .md-slider-wrapper
+  .md-thumb {
+  transform: scale(1);
+}
+md-slider[md-discrete]:not([disabled])
+  .md-slider-wrapper.md-focused
+  .md-focus-ring {
+  transform: scale(0);
+  -webkit-animation: sliderDiscreteFocusRing 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+  animation: sliderDiscreteFocusRing 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-slider[md-discrete]:not([disabled]) .md-slider-wrapper.md-focused .md-thumb {
+  -webkit-animation: sliderDiscreteFocusThumb 0.5s
+    cubic-bezier(0.35, 0, 0.25, 1);
+  animation: sliderDiscreteFocusThumb 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-slider[md-discrete]:not([disabled]).md-active .md-thumb,
+md-slider[md-discrete]:not([disabled]) .md-slider-wrapper.md-focused .md-thumb {
+  transform: scale(0);
+}
+md-slider[md-discrete]:not([disabled]).md-active .md-sign,
+md-slider[md-discrete]:not([disabled]).md-active .md-sign:after,
+md-slider[md-discrete]:not([disabled]) .md-slider-wrapper.md-focused .md-sign,
+md-slider[md-discrete]:not([disabled])
+  .md-slider-wrapper.md-focused
+  .md-sign:after {
+  opacity: 1;
+  transform: translate3d(0, 0, 0) scale(1);
+}
+md-slider[md-discrete][disabled][readonly] .md-thumb {
+  transform: scale(0);
+}
+md-slider[md-discrete][disabled][readonly] .md-sign,
+md-slider[md-discrete][disabled][readonly] .md-sign:after {
+  opacity: 1;
+  transform: translate3d(0, 0, 0) scale(1);
+}
+md-slider[disabled] .md-track-fill {
+  display: none;
+}
+md-slider[disabled] .md-track-ticks {
+  opacity: 0;
+}
+md-slider[disabled]:not([readonly]) .md-sign {
+  opacity: 0;
+}
+md-slider[disabled] .md-thumb {
+  transform: scale(0.5);
+}
+md-slider[disabled] .md-disabled-thumb {
+  display: block;
+}
+md-slider[md-vertical] {
+  flex-direction: column;
+  min-height: 128px;
+  min-width: 0;
+}
+md-slider[md-vertical] .md-slider-wrapper {
+  flex: 1;
+  padding-top: 12px;
+  padding-bottom: 12px;
+  width: 48px;
+  align-self: center;
+  display: flex;
+  justify-content: center;
+}
+md-slider[md-vertical] .md-track-container {
+  height: 100%;
+  width: 2px;
+  top: 0;
+  left: calc(50% - 1px);
+}
+md-slider[md-vertical] .md-thumb-container {
+  top: auto;
+  margin-bottom: 23px;
+  left: calc(50% - 1px);
+  bottom: 0;
+}
+md-slider[md-vertical] .md-thumb-container .md-thumb:after {
+  left: 1px;
+}
+md-slider[md-vertical] .md-thumb-container .md-focus-ring {
+  left: -16px;
+}
+md-slider[md-vertical] .md-track-fill {
+  bottom: 0;
+}
+md-slider[md-vertical][md-discrete] .md-sign {
+  left: -40px;
+  top: 9.5px;
+  transform: scale(0.4) translate3d(67.5px, 0, 0);
+}
+md-slider[md-vertical][md-discrete] .md-sign:after {
+  top: 9.5px;
+  left: 19px;
+  border-top: 14px solid transparent;
+  border-right: 0;
+  border-bottom: 14px solid transparent;
+  border-left-width: 16px;
+  border-left-style: solid;
+  opacity: 0;
+  transform: translate3d(0, -8px, 0);
+  transition: all 0.2s ease-in-out;
+}
+md-slider[md-vertical][md-discrete] .md-sign .md-thumb-text {
+  z-index: 1;
+  font-size: 12px;
+  font-weight: 700;
+}
+md-slider[md-vertical][md-discrete].md-active .md-sign:after,
+md-slider[md-vertical][md-discrete] .md-focused .md-sign:after,
+md-slider[md-vertical][md-discrete][disabled][readonly] .md-sign:after {
+  top: 0;
+}
+md-slider[md-vertical][disabled][readonly] .md-thumb {
+  transform: scale(0);
+}
+md-slider[md-vertical][disabled][readonly] .md-sign,
+md-slider[md-vertical][disabled][readonly] .md-sign:after {
+  opacity: 1;
+  transform: translate3d(0, 0, 0) scale(1);
+}
+md-slider[md-invert]:not([md-vertical]) .md-track-fill {
+  left: auto;
+  right: 0;
+}
+[dir='rtl'] md-slider[md-invert]:not([md-vertical]) .md-track-fill {
+  left: 0;
+}
+[dir='rtl'] md-slider[md-invert]:not([md-vertical]) .md-track-fill {
+  right: auto;
+}
+md-slider[md-invert][md-vertical] .md-track-fill {
+  bottom: auto;
+  top: 0;
+}
+md-slider-container {
+  display: flex;
+  align-items: center;
+  flex-direction: row;
+}
+md-slider-container > :first-child:not(md-slider),
+md-slider-container > :last-child:not(md-slider) {
+  min-width: 25px;
+  max-width: 42px;
+  height: 25px;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-property: color, max-width;
+}
+md-slider-container > :first-child:not(md-slider) {
+  margin-right: 16px;
+}
+[dir='rtl'] md-slider-container > :first-child:not(md-slider) {
+  margin-right: auto;
+  margin-left: 16px;
+}
+md-slider-container > :last-child:not(md-slider) {
+  margin-left: 16px;
+}
+[dir='rtl'] md-slider-container > :last-child:not(md-slider) {
+  margin-left: auto;
+  margin-right: 16px;
+}
+md-slider-container[md-vertical] {
+  flex-direction: column;
+}
+md-slider-container[md-vertical] > :first-child:not(md-slider),
+md-slider-container[md-vertical] > :last-child:not(md-slider) {
+  margin-right: 0;
+  margin-left: 0;
+  text-align: center;
+}
+md-slider-container md-input-container input[type='number'] {
+  text-align: center;
+  padding-left: 15px;
+  height: 50px;
+  margin-top: -25px;
+}
+[dir='rtl'] md-slider-container md-input-container input[type='number'] {
+  padding-left: 0;
+  padding-right: 15px;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-slider.md-default-theme .md-track {
+    border-bottom: 1px solid #fff;
+  }
+}
+.md-sticky-clone {
+  z-index: 2;
+  top: 0;
+  left: 0;
+  right: 0;
+  position: absolute !important;
+  transform: translate3d(-9999px, -9999px, 0);
+}
+.md-sticky-clone[sticky-state='active'] {
+  transform: translate3d(0, 0, 0);
+}
+.md-sticky-clone[sticky-state='active']:not(.md-sticky-no-effect)
+  .md-subheader-inner {
+  -webkit-animation: subheaderStickyHoverIn 0.3s ease-out both;
+  animation: subheaderStickyHoverIn 0.3s ease-out both;
+}
+@-webkit-keyframes subheaderStickyHoverIn {
+  0% {
+    box-shadow: 0 0 0 0 transparent;
+  }
+  to {
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.16);
+  }
+}
+@keyframes subheaderStickyHoverIn {
+  0% {
+    box-shadow: 0 0 0 0 transparent;
+  }
+  to {
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.16);
+  }
+}
+@-webkit-keyframes subheaderStickyHoverOut {
+  0% {
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.16);
+  }
+  to {
+    box-shadow: 0 0 0 0 transparent;
+  }
+}
+@keyframes subheaderStickyHoverOut {
+  0% {
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.16);
+  }
+  to {
+    box-shadow: 0 0 0 0 transparent;
+  }
+}
+.md-subheader-wrapper:not(.md-sticky-no-effect) {
+  transition: margin 0.2s ease-out;
+}
+.md-subheader-wrapper:not(.md-sticky-no-effect) .md-subheader {
+  margin: 0;
+}
+.md-subheader-wrapper:not(.md-sticky-no-effect).md-sticky-clone {
+  z-index: 2;
+}
+.md-subheader-wrapper:not(.md-sticky-no-effect)[sticky-state='active'] {
+  margin-top: -2px;
+}
+.md-subheader-wrapper:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state='active']
+  .md-subheader-inner:after {
+  -webkit-animation: subheaderStickyHoverOut 0.3s ease-out both;
+  animation: subheaderStickyHoverOut 0.3s ease-out both;
+}
+.md-subheader {
+  display: block;
+  font-size: 14px;
+  font-weight: 500;
+  line-height: 1em;
+  margin: 0;
+  position: relative;
+}
+.md-subheader .md-subheader-inner {
+  display: block;
+  padding: 16px;
+}
+.md-subheader .md-subheader-content {
+  display: block;
+  z-index: 1;
+  position: relative;
+}
+[md-swipe-left],
+[md-swipe-right] {
+  touch-action: pan-y;
+}
+[md-swipe-down],
+[md-swipe-up] {
+  touch-action: pan-x;
+}
+.md-inline-form md-switch {
+  margin-top: 18px;
+  margin-bottom: 19px;
+}
+md-switch {
+  margin: 16px 0;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  height: 30px;
+  line-height: 28px;
+  align-items: center;
+  display: flex;
+  margin-left: inherit;
+  margin-right: 16px;
+}
+[dir='rtl'] md-switch {
+  margin-left: 16px;
+}
+[dir='rtl'] md-switch {
+  margin-right: inherit;
+}
+md-switch:last-of-type {
+  margin-left: inherit;
+  margin-right: 0;
+}
+[dir='rtl'] md-switch:last-of-type {
+  margin-left: 0;
+}
+[dir='rtl'] md-switch:last-of-type {
+  margin-right: inherit;
+}
+md-switch[disabled] {
+  cursor: default;
+}
+md-switch[disabled] .md-container {
+  cursor: default;
+}
+md-switch .md-container {
+  cursor: -webkit-grab;
+  cursor: grab;
+  width: 36px;
+  height: 24px;
+  position: relative;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  margin-right: 8px;
+  float: left;
+}
+[dir='rtl'] md-switch .md-container {
+  margin-right: 0;
+  margin-left: 8px;
+}
+md-switch.md-inverted .md-container {
+  margin-right: 0;
+  margin-left: 8px;
+}
+[dir='rtl'] md-switch.md-inverted .md-container {
+  margin-right: 8px;
+}
+[dir='rtl'] md-switch.md-inverted .md-container {
+  margin-left: 0;
+}
+md-switch:not([disabled]) .md-dragging,
+md-switch:not([disabled]).md-dragging .md-container {
+  cursor: -webkit-grabbing;
+  cursor: grabbing;
+}
+md-switch.md-focused .md-thumb:before {
+  left: -8px;
+  top: -8px;
+  right: -8px;
+  bottom: -8px;
+}
+md-switch .md-label {
+  border-color: transparent;
+  border-width: 0;
+  float: left;
+}
+md-switch .md-bar {
+  left: 1px;
+  width: 34px;
+  top: 5px;
+  height: 14px;
+  border-radius: 8px;
+  position: absolute;
+}
+md-switch .md-thumb-container {
+  top: 2px;
+  left: 0;
+  width: 16px;
+  position: absolute;
+  transform: translate3d(0, 0, 0);
+  z-index: 1;
+}
+md-switch.md-checked .md-thumb-container {
+  transform: translate3d(100%, 0, 0);
+}
+md-switch .md-thumb {
+  position: absolute;
+  margin: 0;
+  left: 0;
+  top: 0;
+  outline: none;
+  height: 20px;
+  width: 20px;
+  border-radius: 50%;
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
+    0 2px 1px -1px rgba(0, 0, 0, 0.12);
+}
+md-switch .md-thumb:before {
+  background-color: transparent;
+  border-radius: 50%;
+  content: '';
+  position: absolute;
+  display: block;
+  height: auto;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transition: all 0.5s;
+  width: auto;
+}
+md-switch .md-thumb .md-ripple-container {
+  position: absolute;
+  display: block;
+  width: auto;
+  height: auto;
+  left: -20px;
+  top: -20px;
+  right: -20px;
+  bottom: -20px;
+}
+md-switch:not(.md-dragging) .md-bar,
+md-switch:not(.md-dragging) .md-thumb,
+md-switch:not(.md-dragging) .md-thumb-container {
+  transition: all 0.08s linear;
+  transition-property: transform, background-color;
+}
+md-switch:not(.md-dragging) .md-bar,
+md-switch:not(.md-dragging) .md-thumb {
+  transition-delay: 0.05s;
+}
+@media screen and (-ms-high-contrast: active) {
+  md-switch.md-default-theme .md-bar {
+    background-color: #666;
+  }
+  md-switch.md-default-theme.md-checked .md-bar {
+    background-color: #9e9e9e;
+  }
+  md-switch.md-default-theme .md-thumb {
+    background-color: #fff;
+  }
+}
+@-webkit-keyframes md-tab-content-hide {
+  0% {
+    opacity: 1;
+  }
+  50% {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@keyframes md-tab-content-hide {
+  0% {
+    opacity: 1;
+  }
+  50% {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+md-tab-data {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: -1;
+  opacity: 0;
+}
+md-tabs {
+  display: block;
+  margin: 0;
+  border-radius: 2px;
+  overflow: hidden;
+  position: relative;
+  flex-shrink: 0;
+}
+md-tabs:not(.md-no-tab-content):not(.md-dynamic-height) {
+  min-height: 248px;
+}
+md-tabs[md-align-tabs='bottom'] {
+  padding-bottom: 48px;
+}
+md-tabs[md-align-tabs='bottom'] > md-tabs-wrapper {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  height: 48px;
+  z-index: 2;
+}
+md-tabs[md-align-tabs='bottom'] > md-tabs-content-wrapper {
+  top: 0;
+  bottom: 48px;
+}
+md-tabs.md-dynamic-height md-tabs-content-wrapper {
+  min-height: 0;
+  position: relative;
+  top: auto;
+  left: auto;
+  right: auto;
+  bottom: auto;
+  overflow: visible;
+}
+md-tabs.md-dynamic-height md-tab-content.md-active {
+  position: relative;
+}
+md-tabs[md-border-bottom] md-tabs-wrapper {
+  border-width: 0 0 1px;
+  border-style: solid;
+}
+md-tabs[md-border-bottom]:not(.md-dynamic-height) md-tabs-content-wrapper {
+  top: 49px;
+}
+md-tabs-wrapper {
+  display: block;
+  position: relative;
+  transform: translate(0, 0);
+}
+md-tabs-wrapper md-next-button,
+md-tabs-wrapper md-prev-button {
+  height: 100%;
+  width: 32px;
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  line-height: 1em;
+  z-index: 2;
+  cursor: pointer;
+  font-size: 16px;
+  background: transparent no-repeat 50%;
+  transition: all 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-tabs-wrapper md-next-button:focus,
+md-tabs-wrapper md-prev-button:focus {
+  outline: none;
+}
+md-tabs-wrapper md-next-button.md-disabled,
+md-tabs-wrapper md-prev-button.md-disabled {
+  opacity: 0.25;
+  cursor: default;
+}
+md-tabs-wrapper md-next-button.ng-leave,
+md-tabs-wrapper md-prev-button.ng-leave {
+  transition: none;
+}
+md-tabs-wrapper md-next-button md-icon,
+md-tabs-wrapper md-prev-button md-icon {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
+[dir='rtl'] md-tabs-wrapper md-next-button,
+[dir='rtl'] md-tabs-wrapper md-prev-button {
+  transform: rotateY(180deg) translateY(-50%);
+}
+md-tabs-wrapper md-prev-button {
+  left: 0;
+  background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE3LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPiA8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPiA8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8ZyBpZD0iSGVhZGVyIj4gPGc+IDxyZWN0IHg9Ii02MTgiIHk9Ii0xMjA4IiBmaWxsPSJub25lIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSIzNjAwIi8+IDwvZz4gPC9nPiA8ZyBpZD0iTGFiZWwiPiA8L2c+IDxnIGlkPSJJY29uIj4gPGc+IDxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyIAkJIiBzdHlsZT0iZmlsbDp3aGl0ZTsiLz4gPHJlY3QgZmlsbD0ibm9uZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+IDwvZz4gPC9nPiA8ZyBpZD0iR3JpZCIgZGlzcGxheT0ibm9uZSI+IDxnIGRpc3BsYXk9ImlubGluZSI+IDwvZz4gPC9nPiA8L3N2Zz4NCg==');
+}
+[dir='rtl'] md-tabs-wrapper md-prev-button {
+  left: auto;
+  right: 0;
+}
+md-tabs-wrapper md-next-button {
+  right: 0;
+  background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE3LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPiA8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPiA8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8ZyBpZD0iSGVhZGVyIj4gPGc+IDxyZWN0IHg9Ii02MTgiIHk9Ii0xMzM2IiBmaWxsPSJub25lIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSIzNjAwIi8+IDwvZz4gPC9nPiA8ZyBpZD0iTGFiZWwiPiA8L2c+IDxnIGlkPSJJY29uIj4gPGc+IDxwb2x5Z29uIHBvaW50cz0iMTAsNiA4LjYsNy40IDEzLjIsMTIgOC42LDE2LjYgMTAsMTggMTYsMTIgCQkiIHN0eWxlPSJmaWxsOndoaXRlOyIvPiA8cmVjdCBmaWxsPSJub25lIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiLz4gPC9nPiA8L2c+IDxnIGlkPSJHcmlkIiBkaXNwbGF5PSJub25lIj4gPGcgZGlzcGxheT0iaW5saW5lIj4gPC9nPiA8L2c+IDwvc3ZnPg0K');
+}
+[dir='rtl'] md-tabs-wrapper md-next-button {
+  right: auto;
+  left: 0;
+}
+md-tabs-wrapper md-next-button md-icon {
+  transform: translate(-50%, -50%) rotate(180deg);
+}
+md-tabs-wrapper.md-stretch-tabs md-pagination-wrapper {
+  width: 100%;
+  flex-direction: row;
+}
+md-tabs-wrapper.md-stretch-tabs md-pagination-wrapper md-tab-item {
+  flex-grow: 1;
+}
+md-tabs-canvas {
+  position: relative;
+  overflow: hidden;
+  display: block;
+  height: 48px;
+}
+md-tabs-canvas:after {
+  content: '';
+  display: table;
+  clear: both;
+}
+md-tabs-canvas .md-dummy-wrapper {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+[dir='rtl'] md-tabs-canvas .md-dummy-wrapper {
+  left: auto;
+  right: 0;
+}
+md-tabs-canvas.md-paginated {
+  margin: 0 32px;
+}
+md-tabs-canvas.md-center-tabs {
+  display: flex;
+  flex-direction: column;
+  text-align: center;
+}
+md-tabs-canvas.md-center-tabs .md-tab {
+  float: none;
+  display: inline-block;
+}
+md-pagination-wrapper {
+  height: 48px;
+  display: flex;
+  transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+  position: absolute;
+  left: 0;
+  transform: translate(0, 0);
+}
+md-pagination-wrapper:after {
+  content: '';
+  display: table;
+  clear: both;
+}
+[dir='rtl'] md-pagination-wrapper {
+  left: auto;
+  right: 0;
+}
+md-pagination-wrapper.md-center-tabs {
+  position: relative;
+  justify-content: center;
+}
+md-pagination-wrapper md-tab-item {
+  min-width: 72px;
+}
+@media (min-width: 600px) {
+  md-pagination-wrapper md-tab-item {
+    min-width: 160px;
+  }
+}
+md-tabs-content-wrapper {
+  display: block;
+  top: 48px;
+  overflow: hidden;
+}
+md-tab-content,
+md-tabs-content-wrapper {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+md-tab-content {
+  display: flex;
+  top: 0;
+  transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);
+  overflow: auto;
+  transform: translate(0, 0);
+}
+md-tab-content.md-no-scroll {
+  bottom: auto;
+  overflow: hidden;
+}
+md-tab-content.md-no-transition,
+md-tab-content.ng-leave {
+  transition: none;
+}
+md-tab-content.md-left:not(.md-active) {
+  transform: translateX(-100%);
+  -webkit-animation: md-tab-content-hide 1s;
+  animation: md-tab-content-hide 1s;
+  visibility: hidden;
+}
+[dir='rtl'] md-tab-content.md-left:not(.md-active) {
+  transform: translateX(100%);
+}
+md-tab-content.md-left:not(.md-active) * {
+  transition: visibility 0s linear;
+  transition-delay: 0.5s;
+  visibility: hidden;
+}
+md-tab-content.md-right:not(.md-active) {
+  transform: translateX(100%);
+  -webkit-animation: md-tab-content-hide 1s;
+  animation: md-tab-content-hide 1s;
+  visibility: hidden;
+}
+[dir='rtl'] md-tab-content.md-right:not(.md-active) {
+  transform: translateX(-100%);
+}
+md-tab-content.md-right:not(.md-active) * {
+  transition: visibility 0s linear;
+  transition-delay: 0.5s;
+  visibility: hidden;
+}
+md-tab-content > div {
+  flex: 1 0 100%;
+  min-width: 0;
+}
+md-tab-content > div.ng-leave {
+  -webkit-animation: md-tab-content-hide 1s;
+  animation: md-tab-content-hide 1s;
+}
+md-ink-bar {
+  position: absolute;
+  left: auto;
+  right: auto;
+  bottom: 0;
+  height: 2px;
+}
+md-ink-bar.md-left {
+  transition: left 0.125s cubic-bezier(0.35, 0, 0.25, 1),
+    right 0.25s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-ink-bar.md-right {
+  transition: left 0.25s cubic-bezier(0.35, 0, 0.25, 1),
+    right 0.125s cubic-bezier(0.35, 0, 0.25, 1);
+}
+md-tab {
+  position: absolute;
+  z-index: -1;
+  left: -9999px;
+}
+.md-tab {
+  font-size: 14px;
+  text-align: center;
+  line-height: 24px;
+  padding: 12px;
+  transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
+  cursor: pointer;
+  white-space: nowrap;
+  position: relative;
+  text-transform: uppercase;
+  float: left;
+  font-weight: 500;
+  box-sizing: border-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+[dir='rtl'] .md-tab {
+  float: right;
+}
+.md-tab.md-focused,
+.md-tab:focus {
+  box-shadow: none;
+  outline: none;
+}
+.md-tab.md-active {
+  cursor: default;
+}
+.md-tab.md-disabled {
+  pointer-events: none;
+  touch-action: pan-y;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-user-drag: none;
+  opacity: 0.5;
+  cursor: default;
+}
+.md-tab.ng-leave {
+  transition: none;
+}
+md-toolbar + md-dialog-content md-tabs,
+md-toolbar + md-tabs {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.md-toast-text {
+  padding: 0 8px;
+}
+md-toast {
+  position: absolute;
+  z-index: 105;
+  box-sizing: border-box;
+  cursor: default;
+  padding: 8px;
+  opacity: 1;
+}
+md-toast,
+md-toast .md-toast-content {
+  overflow: hidden;
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-toast .md-toast-content {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  max-height: 168px;
+  max-width: 100%;
+  min-height: 48px;
+  padding: 0 16px;
+  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+  border-radius: 2px;
+  font-size: 14px;
+  transform: translate3d(0, 0, 0) rotateZ(0deg);
+  justify-content: flex-start;
+}
+md-toast .md-toast-content:before {
+  content: '';
+  min-height: 48px;
+  visibility: hidden;
+  display: inline-block;
+}
+[dir='rtl'] md-toast .md-toast-content {
+  justify-content: flex-end;
+}
+md-toast .md-toast-content span {
+  flex: 1 1 0%;
+  box-sizing: border-box;
+  min-width: 0;
+}
+md-toast.md-capsule,
+md-toast.md-capsule .md-toast-content {
+  border-radius: 24px;
+}
+md-toast.ng-leave-active .md-toast-content {
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+}
+md-toast.md-swipedown .md-toast-content,
+md-toast.md-swipeleft .md-toast-content,
+md-toast.md-swiperight .md-toast-content,
+md-toast.md-swipeup .md-toast-content {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+md-toast.ng-enter {
+  opacity: 0;
+}
+md-toast.ng-enter .md-toast-content {
+  transform: translate3d(0, 100%, 0);
+}
+md-toast.ng-enter.md-top .md-toast-content {
+  transform: translate3d(0, -100%, 0);
+}
+md-toast.ng-enter.ng-enter-active {
+  opacity: 1;
+}
+md-toast.ng-enter.ng-enter-active .md-toast-content {
+  transform: translate3d(0, 0, 0);
+}
+md-toast.ng-leave.ng-leave-active .md-toast-content {
+  opacity: 0;
+  transform: translate3d(0, 100%, 0);
+}
+md-toast.ng-leave.ng-leave-active.md-swipeup .md-toast-content {
+  transform: translate3d(0, -50%, 0);
+}
+md-toast.ng-leave.ng-leave-active.md-swipedown .md-toast-content {
+  transform: translate3d(0, 50%, 0);
+}
+md-toast.ng-leave.ng-leave-active.md-top .md-toast-content {
+  transform: translate3d(0, -100%, 0);
+}
+md-toast .md-action {
+  line-height: 19px;
+  margin-left: 24px;
+  margin-right: 0;
+  cursor: pointer;
+  text-transform: uppercase;
+  float: right;
+}
+md-toast .md-button {
+  min-width: 0;
+  margin-right: 0;
+  margin-left: 8px;
+}
+[dir='rtl'] md-toast .md-button {
+  margin-right: 8px;
+}
+[dir='rtl'] md-toast .md-button {
+  margin-left: 0;
+}
+@media (max-width: 959px) {
+  md-toast {
+    left: 0;
+    right: 0;
+    width: 100%;
+    max-width: 100%;
+    min-width: 0;
+    border-radius: 0;
+    bottom: 0;
+    padding: 0;
+  }
+  md-toast.ng-leave.ng-leave-active.md-swipeup .md-toast-content {
+    transform: translate3d(0, -50%, 0);
+  }
+  md-toast.ng-leave.ng-leave-active.md-swipedown .md-toast-content {
+    transform: translate3d(0, 50%, 0);
+  }
+}
+@media (min-width: 960px) {
+  md-toast {
+    min-width: 304px;
+  }
+  md-toast.md-bottom {
+    bottom: 0;
+  }
+  md-toast.md-left {
+    left: 0;
+  }
+  md-toast.md-right {
+    right: 0;
+  }
+  md-toast.md-top {
+    top: 0;
+  }
+  md-toast._md-start {
+    left: 0;
+  }
+  [dir='rtl'] md-toast._md-start {
+    left: auto;
+    right: 0;
+  }
+  md-toast._md-end {
+    right: 0;
+  }
+  [dir='rtl'] md-toast._md-end {
+    right: auto;
+    left: 0;
+  }
+  md-toast.ng-leave.ng-leave-active.md-swipeleft .md-toast-content {
+    transform: translate3d(-50%, 0, 0);
+  }
+  md-toast.ng-leave.ng-leave-active.md-swiperight .md-toast-content {
+    transform: translate3d(50%, 0, 0);
+  }
+}
+@media (min-width: 1920px) {
+  md-toast .md-toast-content {
+    max-width: 568px;
+  }
+}
+@media screen and (-ms-high-contrast: active) {
+  md-toast {
+    border: 1px solid #fff;
+  }
+}
+.md-toast-animating {
+  overflow: hidden !important;
+}
+md-toolbar {
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  position: relative;
+  z-index: 2;
+  font-size: 20px;
+  min-height: 64px;
+  width: 100%;
+}
+md-toolbar._md-toolbar-transitions {
+  transition-duration: 0.5s;
+  transition-timing-function: cubic-bezier(0.35, 0, 0.25, 1);
+  transition-property: background-color, fill, color;
+}
+md-toolbar.md-whiteframe-z1-add,
+md-toolbar.md-whiteframe-z1-remove {
+  transition: box-shadow 0.5s linear;
+}
+md-toolbar md-toolbar-filler {
+  width: 72px;
+}
+md-toolbar *,
+md-toolbar :after,
+md-toolbar :before {
+  box-sizing: border-box;
+}
+md-toolbar.ng-animate {
+  transition: none;
+}
+md-toolbar.md-tall {
+  height: 128px;
+  min-height: 128px;
+  max-height: 128px;
+}
+md-toolbar.md-medium-tall {
+  height: 88px;
+  min-height: 88px;
+  max-height: 88px;
+}
+md-toolbar.md-medium-tall .md-toolbar-tools {
+  height: 48px;
+  min-height: 48px;
+  max-height: 48px;
+}
+md-toolbar > .md-indent {
+  margin-left: 64px;
+}
+[dir='rtl'] md-toolbar > .md-indent {
+  margin-left: auto;
+  margin-right: 64px;
+}
+md-toolbar ~ md-content > md-list {
+  padding: 0;
+}
+md-toolbar ~ md-content > md-list md-list-item:last-child md-divider {
+  display: none;
+}
+.md-toolbar-tools {
+  font-size: 20px;
+  letter-spacing: 0.005em;
+  box-sizing: border-box;
+  font-weight: 400;
+  display: flex;
+  align-items: center;
+  flex-direction: row;
+  width: 100%;
+  height: 64px;
+  max-height: 64px;
+  padding: 0 16px;
+  margin: 0;
+}
+.md-toolbar-tools h1,
+.md-toolbar-tools h2,
+.md-toolbar-tools h3 {
+  font-size: inherit;
+  font-weight: inherit;
+  margin: inherit;
+}
+.md-toolbar-tools a {
+  color: inherit;
+  text-decoration: none;
+}
+.md-toolbar-tools .fill-height {
+  display: flex;
+  align-items: center;
+}
+.md-toolbar-tools md-checkbox {
+  margin: inherit;
+}
+.md-toolbar-tools .md-button {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.md-toolbar-tools .md-button,
+.md-toolbar-tools .md-button.md-icon-button md-icon {
+  transition-duration: 0.5s;
+  transition-timing-function: cubic-bezier(0.35, 0, 0.25, 1);
+  transition-property: background-color, fill, color;
+}
+.md-toolbar-tools .md-button.md-icon-button md-icon.ng-animate,
+.md-toolbar-tools .md-button.ng-animate {
+  transition: none;
+}
+.md-toolbar-tools > .md-button:first-child {
+  margin-left: -8px;
+}
+[dir='rtl'] .md-toolbar-tools > .md-button:first-child {
+  margin-left: auto;
+  margin-right: -8px;
+}
+.md-toolbar-tools > .md-button:last-child {
+  margin-right: -8px;
+}
+[dir='rtl'] .md-toolbar-tools > .md-button:last-child {
+  margin-right: auto;
+  margin-left: -8px;
+}
+.md-toolbar-tools > md-menu:last-child {
+  margin-right: -8px;
+}
+[dir='rtl'] .md-toolbar-tools > md-menu:last-child {
+  margin-right: auto;
+  margin-left: -8px;
+}
+.md-toolbar-tools > md-menu:last-child > .md-button {
+  margin-right: 0;
+}
+[dir='rtl'] .md-toolbar-tools > md-menu:last-child > .md-button {
+  margin-right: auto;
+  margin-left: 0;
+}
+@media screen and (-ms-high-contrast: active) {
+  .md-toolbar-tools {
+    border-bottom: 1px solid #fff;
+  }
+}
+@media (min-width: 0) and (max-width: 959px) and (orientation: portrait) {
+  md-toolbar {
+    min-height: 56px;
+  }
+  .md-toolbar-tools {
+    height: 56px;
+    max-height: 56px;
+  }
+}
+@media (min-width: 0) and (max-width: 959px) and (orientation: landscape) {
+  md-toolbar {
+    min-height: 48px;
+  }
+  .md-toolbar-tools {
+    height: 48px;
+    max-height: 48px;
+  }
+}
+.md-tooltip {
+  display: inline-block;
+  pointer-events: none;
+  border-radius: 4px;
+  overflow: hidden;
+  opacity: 0;
+  font-weight: 500;
+  font-size: 14px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  height: 32px;
+  line-height: 32px;
+  padding-right: 16px;
+  padding-left: 16px;
+}
+.md-tooltip.md-origin-top {
+  transform-origin: center bottom;
+  margin-top: -24px;
+}
+.md-tooltip.md-origin-right {
+  transform-origin: left center;
+  margin-left: 24px;
+}
+.md-tooltip.md-origin-bottom {
+  transform-origin: center top;
+  margin-top: 24px;
+}
+.md-tooltip.md-origin-left {
+  transform-origin: right center;
+  margin-left: -24px;
+}
+@media (min-width: 960px) {
+  .md-tooltip {
+    font-size: 10px;
+    height: 22px;
+    line-height: 22px;
+    padding-right: 8px;
+    padding-left: 8px;
+  }
+  .md-tooltip.md-origin-top {
+    margin-top: -14px;
+  }
+  .md-tooltip.md-origin-right {
+    margin-left: 14px;
+  }
+  .md-tooltip.md-origin-bottom {
+    margin-top: 14px;
+  }
+  .md-tooltip.md-origin-left {
+    margin-left: -14px;
+  }
+}
+.md-tooltip.md-show-add {
+  transform: scale(0);
+}
+.md-tooltip.md-show {
+  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  transition-duration: 0.15s;
+  transform: scale(1);
+  opacity: 0.9;
+}
+.md-tooltip.md-hide {
+  transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
+  transition-duration: 0.15s;
+  transform: scale(0);
+  opacity: 0;
+}
+.md-truncate {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.md-truncate.md-clip {
+  text-overflow: clip;
+}
+.md-truncate.flex {
+  width: 0;
+}
+.md-virtual-repeat-container {
+  box-sizing: border-box;
+  display: block;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  position: relative;
+}
+.md-virtual-repeat-container .md-virtual-repeat-scroller {
+  bottom: 0;
+  box-sizing: border-box;
+  left: 0;
+  margin: 0;
+  overflow-x: hidden;
+  padding: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  -webkit-overflow-scrolling: touch;
+}
+.md-virtual-repeat-container .md-virtual-repeat-sizer {
+  box-sizing: border-box;
+  height: 1px;
+  display: block;
+  margin: 0;
+  padding: 0;
+  width: 1px;
+}
+.md-virtual-repeat-container .md-virtual-repeat-offsetter {
+  box-sizing: border-box;
+  left: 0;
+  margin: 0;
+  padding: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+.md-virtual-repeat-container.md-orient-horizontal .md-virtual-repeat-scroller {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+.md-virtual-repeat-container.md-orient-horizontal .md-virtual-repeat-offsetter {
+  bottom: 16px;
+  right: auto;
+  white-space: nowrap;
+}
+[dir='rtl']
+  .md-virtual-repeat-container.md-orient-horizontal
+  .md-virtual-repeat-offsetter {
+  right: auto;
+  left: auto;
+}
+.md-whiteframe-1dp,
+.md-whiteframe-z1 {
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
+    0 2px 1px -1px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-2dp {
+  box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),
+    0 3px 1px -2px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-3dp {
+  box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.14),
+    0 3px 3px -2px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-4dp,
+.md-whiteframe-z2 {
+  box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14),
+    0 1px 10px 0 rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-5dp {
+  box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 5px 8px 0 rgba(0, 0, 0, 0.14),
+    0 1px 14px 0 rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-6dp {
+  box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2),
+    0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-7dp,
+.md-whiteframe-z3 {
+  box-shadow: 0 4px 5px -2px rgba(0, 0, 0, 0.2),
+    0 7px 10px 1px rgba(0, 0, 0, 0.14), 0 2px 16px 1px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-8dp {
+  box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
+    0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-9dp {
+  box-shadow: 0 5px 6px -3px rgba(0, 0, 0, 0.2),
+    0 9px 12px 1px rgba(0, 0, 0, 0.14), 0 3px 16px 2px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-10dp,
+.md-whiteframe-z4 {
+  box-shadow: 0 6px 6px -3px rgba(0, 0, 0, 0.2),
+    0 10px 14px 1px rgba(0, 0, 0, 0.14), 0 4px 18px 3px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-11dp {
+  box-shadow: 0 6px 7px -4px rgba(0, 0, 0, 0.2),
+    0 11px 15px 1px rgba(0, 0, 0, 0.14), 0 4px 20px 3px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-12dp {
+  box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2),
+    0 12px 17px 2px rgba(0, 0, 0, 0.14), 0 5px 22px 4px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-13dp,
+.md-whiteframe-z5 {
+  box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2),
+    0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-14dp {
+  box-shadow: 0 7px 9px -4px rgba(0, 0, 0, 0.2),
+    0 14px 21px 2px rgba(0, 0, 0, 0.14), 0 5px 26px 4px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-15dp {
+  box-shadow: 0 8px 9px -5px rgba(0, 0, 0, 0.2),
+    0 15px 22px 2px rgba(0, 0, 0, 0.14), 0 6px 28px 5px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-16dp {
+  box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0.2),
+    0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-17dp {
+  box-shadow: 0 8px 11px -5px rgba(0, 0, 0, 0.2),
+    0 17px 26px 2px rgba(0, 0, 0, 0.14), 0 6px 32px 5px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-18dp {
+  box-shadow: 0 9px 11px -5px rgba(0, 0, 0, 0.2),
+    0 18px 28px 2px rgba(0, 0, 0, 0.14), 0 7px 34px 6px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-19dp {
+  box-shadow: 0 9px 12px -6px rgba(0, 0, 0, 0.2),
+    0 19px 29px 2px rgba(0, 0, 0, 0.14), 0 7px 36px 6px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-20dp {
+  box-shadow: 0 10px 13px -6px rgba(0, 0, 0, 0.2),
+    0 20px 31px 3px rgba(0, 0, 0, 0.14), 0 8px 38px 7px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-21dp {
+  box-shadow: 0 10px 13px -6px rgba(0, 0, 0, 0.2),
+    0 21px 33px 3px rgba(0, 0, 0, 0.14), 0 8px 40px 7px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-22dp {
+  box-shadow: 0 10px 14px -6px rgba(0, 0, 0, 0.2),
+    0 22px 35px 3px rgba(0, 0, 0, 0.14), 0 8px 42px 7px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-23dp {
+  box-shadow: 0 11px 14px -7px rgba(0, 0, 0, 0.2),
+    0 23px 36px 3px rgba(0, 0, 0, 0.14), 0 9px 44px 8px rgba(0, 0, 0, 0.12);
+}
+.md-whiteframe-24dp {
+  box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2),
+    0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12);
+}
+@media screen and (-ms-high-contrast: active) {
+  md-whiteframe {
+    border: 1px solid #fff;
+  }
+}
+@media print {
+  [md-whiteframe],
+  md-whiteframe {
+    background-color: #fff;
+  }
+}
+.ng-cloak,
+.x-ng-cloak,
+[data-ng-cloak],
+[ng-cloak],
+[ng\:cloak],
+[x-ng-cloak] {
+  display: none !important;
+}
+@-moz-document url-prefix() {
+  .layout-fill {
+    margin: 0;
+    width: 100%;
+    min-height: 100%;
+    height: 100%;
+  }
+}
+.flex-order {
+  order: 0;
+}
+.flex-order--20 {
+  order: -20;
+}
+.flex-order--19 {
+  order: -19;
+}
+.flex-order--18 {
+  order: -18;
+}
+.flex-order--17 {
+  order: -17;
+}
+.flex-order--16 {
+  order: -16;
+}
+.flex-order--15 {
+  order: -15;
+}
+.flex-order--14 {
+  order: -14;
+}
+.flex-order--13 {
+  order: -13;
+}
+.flex-order--12 {
+  order: -12;
+}
+.flex-order--11 {
+  order: -11;
+}
+.flex-order--10 {
+  order: -10;
+}
+.flex-order--9 {
+  order: -9;
+}
+.flex-order--8 {
+  order: -8;
+}
+.flex-order--7 {
+  order: -7;
+}
+.flex-order--6 {
+  order: -6;
+}
+.flex-order--5 {
+  order: -5;
+}
+.flex-order--4 {
+  order: -4;
+}
+.flex-order--3 {
+  order: -3;
+}
+.flex-order--2 {
+  order: -2;
+}
+.flex-order--1 {
+  order: -1;
+}
+.flex-order-0 {
+  order: 0;
+}
+.flex-order-1 {
+  order: 1;
+}
+.flex-order-2 {
+  order: 2;
+}
+.flex-order-3 {
+  order: 3;
+}
+.flex-order-4 {
+  order: 4;
+}
+.flex-order-5 {
+  order: 5;
+}
+.flex-order-6 {
+  order: 6;
+}
+.flex-order-7 {
+  order: 7;
+}
+.flex-order-8 {
+  order: 8;
+}
+.flex-order-9 {
+  order: 9;
+}
+.flex-order-10 {
+  order: 10;
+}
+.flex-order-11 {
+  order: 11;
+}
+.flex-order-12 {
+  order: 12;
+}
+.flex-order-13 {
+  order: 13;
+}
+.flex-order-14 {
+  order: 14;
+}
+.flex-order-15 {
+  order: 15;
+}
+.flex-order-16 {
+  order: 16;
+}
+.flex-order-17 {
+  order: 17;
+}
+.flex-order-18 {
+  order: 18;
+}
+.flex-order-19 {
+  order: 19;
+}
+.flex-order-20 {
+  order: 20;
+}
+.flex-offset-0,
+.layout-margin .flex-offset-0,
+.layout-margin .offset-0,
+.offset-0 {
+  margin-left: 0;
+}
+[dir='rtl'] .flex-offset-0,
+[dir='rtl'] .layout-margin .flex-offset-0,
+[dir='rtl'] .layout-margin .offset-0,
+[dir='rtl'] .offset-0 {
+  margin-left: auto;
+  margin-right: 0;
+}
+.flex-offset-5,
+.layout-margin .flex-offset-5,
+.layout-margin .offset-5,
+.offset-5 {
+  margin-left: 5%;
+}
+[dir='rtl'] .flex-offset-5,
+[dir='rtl'] .layout-margin .flex-offset-5,
+[dir='rtl'] .layout-margin .offset-5,
+[dir='rtl'] .offset-5 {
+  margin-left: auto;
+  margin-right: 5%;
+}
+.flex-offset-10,
+.layout-margin .flex-offset-10,
+.layout-margin .offset-10,
+.offset-10 {
+  margin-left: 10%;
+}
+[dir='rtl'] .flex-offset-10,
+[dir='rtl'] .layout-margin .flex-offset-10,
+[dir='rtl'] .layout-margin .offset-10,
+[dir='rtl'] .offset-10 {
+  margin-left: auto;
+  margin-right: 10%;
+}
+.flex-offset-15,
+.layout-margin .flex-offset-15,
+.layout-margin .offset-15,
+.offset-15 {
+  margin-left: 15%;
+}
+[dir='rtl'] .flex-offset-15,
+[dir='rtl'] .layout-margin .flex-offset-15,
+[dir='rtl'] .layout-margin .offset-15,
+[dir='rtl'] .offset-15 {
+  margin-left: auto;
+  margin-right: 15%;
+}
+.flex-offset-20,
+.layout-margin .flex-offset-20,
+.layout-margin .offset-20,
+.offset-20 {
+  margin-left: 20%;
+}
+[dir='rtl'] .flex-offset-20,
+[dir='rtl'] .layout-margin .flex-offset-20,
+[dir='rtl'] .layout-margin .offset-20,
+[dir='rtl'] .offset-20 {
+  margin-left: auto;
+  margin-right: 20%;
+}
+.flex-offset-25,
+.layout-margin .flex-offset-25,
+.layout-margin .offset-25,
+.offset-25 {
+  margin-left: 25%;
+}
+[dir='rtl'] .flex-offset-25,
+[dir='rtl'] .layout-margin .flex-offset-25,
+[dir='rtl'] .layout-margin .offset-25,
+[dir='rtl'] .offset-25 {
+  margin-left: auto;
+  margin-right: 25%;
+}
+.flex-offset-30,
+.layout-margin .flex-offset-30,
+.layout-margin .offset-30,
+.offset-30 {
+  margin-left: 30%;
+}
+[dir='rtl'] .flex-offset-30,
+[dir='rtl'] .layout-margin .flex-offset-30,
+[dir='rtl'] .layout-margin .offset-30,
+[dir='rtl'] .offset-30 {
+  margin-left: auto;
+  margin-right: 30%;
+}
+.flex-offset-35,
+.layout-margin .flex-offset-35,
+.layout-margin .offset-35,
+.offset-35 {
+  margin-left: 35%;
+}
+[dir='rtl'] .flex-offset-35,
+[dir='rtl'] .layout-margin .flex-offset-35,
+[dir='rtl'] .layout-margin .offset-35,
+[dir='rtl'] .offset-35 {
+  margin-left: auto;
+  margin-right: 35%;
+}
+.flex-offset-40,
+.layout-margin .flex-offset-40,
+.layout-margin .offset-40,
+.offset-40 {
+  margin-left: 40%;
+}
+[dir='rtl'] .flex-offset-40,
+[dir='rtl'] .layout-margin .flex-offset-40,
+[dir='rtl'] .layout-margin .offset-40,
+[dir='rtl'] .offset-40 {
+  margin-left: auto;
+  margin-right: 40%;
+}
+.flex-offset-45,
+.layout-margin .flex-offset-45,
+.layout-margin .offset-45,
+.offset-45 {
+  margin-left: 45%;
+}
+[dir='rtl'] .flex-offset-45,
+[dir='rtl'] .layout-margin .flex-offset-45,
+[dir='rtl'] .layout-margin .offset-45,
+[dir='rtl'] .offset-45 {
+  margin-left: auto;
+  margin-right: 45%;
+}
+.flex-offset-50,
+.layout-margin .flex-offset-50,
+.layout-margin .offset-50,
+.offset-50 {
+  margin-left: 50%;
+}
+[dir='rtl'] .flex-offset-50,
+[dir='rtl'] .layout-margin .flex-offset-50,
+[dir='rtl'] .layout-margin .offset-50,
+[dir='rtl'] .offset-50 {
+  margin-left: auto;
+  margin-right: 50%;
+}
+.flex-offset-55,
+.layout-margin .flex-offset-55,
+.layout-margin .offset-55,
+.offset-55 {
+  margin-left: 55%;
+}
+[dir='rtl'] .flex-offset-55,
+[dir='rtl'] .layout-margin .flex-offset-55,
+[dir='rtl'] .layout-margin .offset-55,
+[dir='rtl'] .offset-55 {
+  margin-left: auto;
+  margin-right: 55%;
+}
+.flex-offset-60,
+.layout-margin .flex-offset-60,
+.layout-margin .offset-60,
+.offset-60 {
+  margin-left: 60%;
+}
+[dir='rtl'] .flex-offset-60,
+[dir='rtl'] .layout-margin .flex-offset-60,
+[dir='rtl'] .layout-margin .offset-60,
+[dir='rtl'] .offset-60 {
+  margin-left: auto;
+  margin-right: 60%;
+}
+.flex-offset-65,
+.layout-margin .flex-offset-65,
+.layout-margin .offset-65,
+.offset-65 {
+  margin-left: 65%;
+}
+[dir='rtl'] .flex-offset-65,
+[dir='rtl'] .layout-margin .flex-offset-65,
+[dir='rtl'] .layout-margin .offset-65,
+[dir='rtl'] .offset-65 {
+  margin-left: auto;
+  margin-right: 65%;
+}
+.flex-offset-70,
+.layout-margin .flex-offset-70,
+.layout-margin .offset-70,
+.offset-70 {
+  margin-left: 70%;
+}
+[dir='rtl'] .flex-offset-70,
+[dir='rtl'] .layout-margin .flex-offset-70,
+[dir='rtl'] .layout-margin .offset-70,
+[dir='rtl'] .offset-70 {
+  margin-left: auto;
+  margin-right: 70%;
+}
+.flex-offset-75,
+.layout-margin .flex-offset-75,
+.layout-margin .offset-75,
+.offset-75 {
+  margin-left: 75%;
+}
+[dir='rtl'] .flex-offset-75,
+[dir='rtl'] .layout-margin .flex-offset-75,
+[dir='rtl'] .layout-margin .offset-75,
+[dir='rtl'] .offset-75 {
+  margin-left: auto;
+  margin-right: 75%;
+}
+.flex-offset-80,
+.layout-margin .flex-offset-80,
+.layout-margin .offset-80,
+.offset-80 {
+  margin-left: 80%;
+}
+[dir='rtl'] .flex-offset-80,
+[dir='rtl'] .layout-margin .flex-offset-80,
+[dir='rtl'] .layout-margin .offset-80,
+[dir='rtl'] .offset-80 {
+  margin-left: auto;
+  margin-right: 80%;
+}
+.flex-offset-85,
+.layout-margin .flex-offset-85,
+.layout-margin .offset-85,
+.offset-85 {
+  margin-left: 85%;
+}
+[dir='rtl'] .flex-offset-85,
+[dir='rtl'] .layout-margin .flex-offset-85,
+[dir='rtl'] .layout-margin .offset-85,
+[dir='rtl'] .offset-85 {
+  margin-left: auto;
+  margin-right: 85%;
+}
+.flex-offset-90,
+.layout-margin .flex-offset-90,
+.layout-margin .offset-90,
+.offset-90 {
+  margin-left: 90%;
+}
+[dir='rtl'] .flex-offset-90,
+[dir='rtl'] .layout-margin .flex-offset-90,
+[dir='rtl'] .layout-margin .offset-90,
+[dir='rtl'] .offset-90 {
+  margin-left: auto;
+  margin-right: 90%;
+}
+.flex-offset-95,
+.layout-margin .flex-offset-95,
+.layout-margin .offset-95,
+.offset-95 {
+  margin-left: 95%;
+}
+[dir='rtl'] .flex-offset-95,
+[dir='rtl'] .layout-margin .flex-offset-95,
+[dir='rtl'] .layout-margin .offset-95,
+[dir='rtl'] .offset-95 {
+  margin-left: auto;
+  margin-right: 95%;
+}
+.flex-offset-33,
+.layout-margin .flex-offset-33,
+.layout-margin .offset-33,
+.offset-33 {
+  margin-left: 33.33333%;
+}
+.flex-offset-66,
+.layout-margin .flex-offset-66,
+.layout-margin .offset-66,
+.offset-66 {
+  margin-left: 66.66667%;
+}
+[dir='rtl'] .flex-offset-66,
+[dir='rtl'] .layout-margin .flex-offset-66,
+[dir='rtl'] .layout-margin .offset-66,
+[dir='rtl'] .offset-66 {
+  margin-left: auto;
+  margin-right: 66.66667%;
+}
+.layout-align,
+.layout-align-start-stretch {
+  justify-content: flex-start;
+  align-content: stretch;
+  align-items: stretch;
+}
+.layout-align-start,
+.layout-align-start-center,
+.layout-align-start-end,
+.layout-align-start-start,
+.layout-align-start-stretch {
+  justify-content: flex-start;
+}
+.layout-align-center,
+.layout-align-center-center,
+.layout-align-center-end,
+.layout-align-center-start,
+.layout-align-center-stretch {
+  justify-content: center;
+}
+.layout-align-end,
+.layout-align-end-center,
+.layout-align-end-end,
+.layout-align-end-start,
+.layout-align-end-stretch {
+  justify-content: flex-end;
+}
+.layout-align-space-around,
+.layout-align-space-around-center,
+.layout-align-space-around-end,
+.layout-align-space-around-start,
+.layout-align-space-around-stretch {
+  justify-content: space-around;
+}
+.layout-align-space-between,
+.layout-align-space-between-center,
+.layout-align-space-between-end,
+.layout-align-space-between-start,
+.layout-align-space-between-stretch {
+  justify-content: space-between;
+}
+.layout-align-center-start,
+.layout-align-end-start,
+.layout-align-space-around-start,
+.layout-align-space-between-start,
+.layout-align-start-start {
+  align-items: flex-start;
+  align-content: flex-start;
+}
+.layout-align-center-center,
+.layout-align-end-center,
+.layout-align-space-around-center,
+.layout-align-space-between-center,
+.layout-align-start-center {
+  align-items: center;
+  align-content: center;
+  max-width: 100%;
+}
+.layout-align-center-center > *,
+.layout-align-end-center > *,
+.layout-align-space-around-center > *,
+.layout-align-space-between-center > *,
+.layout-align-start-center > * {
+  max-width: 100%;
+  box-sizing: border-box;
+}
+.layout-align-center-end,
+.layout-align-end-end,
+.layout-align-space-around-end,
+.layout-align-space-between-end,
+.layout-align-start-end {
+  align-items: flex-end;
+  align-content: flex-end;
+}
+.layout-align-center-stretch,
+.layout-align-end-stretch,
+.layout-align-space-around-stretch,
+.layout-align-space-between-stretch,
+.layout-align-start-stretch {
+  align-items: stretch;
+  align-content: stretch;
+}
+.flex {
+  flex: 1;
+}
+.flex,
+.flex-grow {
+  box-sizing: border-box;
+}
+.flex-grow {
+  flex: 1 1 100%;
+}
+.flex-initial {
+  flex: 0 1 auto;
+  box-sizing: border-box;
+}
+.flex-auto {
+  flex: 1 1 auto;
+  box-sizing: border-box;
+}
+.flex-none {
+  flex: 0 0 auto;
+  box-sizing: border-box;
+}
+.flex-noshrink {
+  flex: 1 0 auto;
+  box-sizing: border-box;
+}
+.flex-nogrow {
+  flex: 0 1 auto;
+}
+.flex-0,
+.flex-nogrow {
+  box-sizing: border-box;
+}
+.flex-0 {
+  flex: 1 1 100%;
+  max-width: 0;
+  max-height: 100%;
+}
+.layout-row > .flex-0 {
+  flex: 1 1 100%;
+  max-width: 0;
+  max-height: 100%;
+  box-sizing: border-box;
+  min-width: 0;
+}
+.layout-column > .flex-0 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 0%;
+  box-sizing: border-box;
+}
+.flex-5 {
+  flex: 1 1 100%;
+  max-width: 5%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-5 {
+  flex: 1 1 100%;
+  max-width: 5%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-5 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 5%;
+  box-sizing: border-box;
+}
+.flex-10 {
+  flex: 1 1 100%;
+  max-width: 10%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-10 {
+  flex: 1 1 100%;
+  max-width: 10%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-10 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 10%;
+  box-sizing: border-box;
+}
+.flex-15 {
+  flex: 1 1 100%;
+  max-width: 15%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-15 {
+  flex: 1 1 100%;
+  max-width: 15%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-15 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 15%;
+  box-sizing: border-box;
+}
+.flex-20 {
+  flex: 1 1 100%;
+  max-width: 20%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-20 {
+  flex: 1 1 100%;
+  max-width: 20%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-20 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 20%;
+  box-sizing: border-box;
+}
+.flex-25 {
+  flex: 1 1 100%;
+  max-width: 25%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-25 {
+  flex: 1 1 100%;
+  max-width: 25%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-25 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 25%;
+  box-sizing: border-box;
+}
+.flex-30 {
+  flex: 1 1 100%;
+  max-width: 30%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-30 {
+  flex: 1 1 100%;
+  max-width: 30%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-30 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 30%;
+  box-sizing: border-box;
+}
+.flex-35 {
+  flex: 1 1 100%;
+  max-width: 35%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-35 {
+  flex: 1 1 100%;
+  max-width: 35%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-35 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 35%;
+  box-sizing: border-box;
+}
+.flex-40 {
+  flex: 1 1 100%;
+  max-width: 40%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-40 {
+  flex: 1 1 100%;
+  max-width: 40%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-40 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 40%;
+  box-sizing: border-box;
+}
+.flex-45 {
+  flex: 1 1 100%;
+  max-width: 45%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-45 {
+  flex: 1 1 100%;
+  max-width: 45%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-45 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 45%;
+  box-sizing: border-box;
+}
+.flex-50 {
+  flex: 1 1 100%;
+  max-width: 50%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-50 {
+  flex: 1 1 100%;
+  max-width: 50%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-50 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 50%;
+  box-sizing: border-box;
+}
+.flex-55 {
+  flex: 1 1 100%;
+  max-width: 55%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-55 {
+  flex: 1 1 100%;
+  max-width: 55%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-55 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 55%;
+  box-sizing: border-box;
+}
+.flex-60 {
+  flex: 1 1 100%;
+  max-width: 60%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-60 {
+  flex: 1 1 100%;
+  max-width: 60%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-60 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 60%;
+  box-sizing: border-box;
+}
+.flex-65 {
+  flex: 1 1 100%;
+  max-width: 65%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-65 {
+  flex: 1 1 100%;
+  max-width: 65%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-65 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 65%;
+  box-sizing: border-box;
+}
+.flex-70 {
+  flex: 1 1 100%;
+  max-width: 70%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-70 {
+  flex: 1 1 100%;
+  max-width: 70%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-70 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 70%;
+  box-sizing: border-box;
+}
+.flex-75 {
+  flex: 1 1 100%;
+  max-width: 75%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-75 {
+  flex: 1 1 100%;
+  max-width: 75%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-75 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 75%;
+  box-sizing: border-box;
+}
+.flex-80 {
+  flex: 1 1 100%;
+  max-width: 80%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-80 {
+  flex: 1 1 100%;
+  max-width: 80%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-80 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 80%;
+  box-sizing: border-box;
+}
+.flex-85 {
+  flex: 1 1 100%;
+  max-width: 85%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-85 {
+  flex: 1 1 100%;
+  max-width: 85%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-85 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 85%;
+  box-sizing: border-box;
+}
+.flex-90 {
+  flex: 1 1 100%;
+  max-width: 90%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-90 {
+  flex: 1 1 100%;
+  max-width: 90%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-90 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 90%;
+  box-sizing: border-box;
+}
+.flex-95 {
+  flex: 1 1 100%;
+  max-width: 95%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-95 {
+  flex: 1 1 100%;
+  max-width: 95%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-95 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 95%;
+  box-sizing: border-box;
+}
+.flex-100 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-100 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-100 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.flex-33 {
+  max-width: 33.33%;
+}
+.flex-33,
+.flex-66 {
+  flex: 1 1 100%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.flex-66 {
+  max-width: 66.66%;
+}
+.layout-row > .flex-33 {
+  flex: 1 1 33.33%;
+}
+.layout-row > .flex-66 {
+  flex: 1 1 66.66%;
+}
+.layout-column > .flex-33 {
+  flex: 1 1 33.33%;
+}
+.layout-column > .flex-66 {
+  flex: 1 1 66.66%;
+}
+.layout-row > .flex-33 {
+  flex: 1 1 100%;
+  max-width: 33.33%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex-66 {
+  flex: 1 1 100%;
+  max-width: 66.66%;
+  max-height: 100%;
+  box-sizing: border-box;
+}
+.layout-row > .flex {
+  min-width: 0;
+}
+.layout-column > .flex-33 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 33.33%;
+  box-sizing: border-box;
+}
+.layout-column > .flex-66 {
+  flex: 1 1 100%;
+  max-width: 100%;
+  max-height: 66.66%;
+  box-sizing: border-box;
+}
+.layout-column > .flex {
+  min-height: 0;
+}
+.layout,
+.layout-column,
+.layout-row {
+  box-sizing: border-box;
+  display: flex;
+}
+.layout-column {
+  flex-direction: column;
+}
+.layout-row {
+  flex-direction: row;
+}
+.layout-padding-sm > *,
+.layout-padding > .flex-sm {
+  padding: 4px;
+}
+.layout-padding,
+.layout-padding-gt-sm,
+.layout-padding-gt-sm > *,
+.layout-padding-md,
+.layout-padding-md > *,
+.layout-padding > *,
+.layout-padding > .flex,
+.layout-padding > .flex-gt-sm,
+.layout-padding > .flex-md {
+  padding: 8px;
+}
+.layout-padding-gt-lg > *,
+.layout-padding-gt-md > *,
+.layout-padding-lg > *,
+.layout-padding > .flex-gt-lg,
+.layout-padding > .flex-gt-md,
+.layout-padding > .flex-lg {
+  padding: 16px;
+}
+.layout-margin-sm > *,
+.layout-margin > .flex-sm {
+  margin: 4px;
+}
+.layout-margin,
+.layout-margin-gt-sm,
+.layout-margin-gt-sm > *,
+.layout-margin-md,
+.layout-margin-md > *,
+.layout-margin > *,
+.layout-margin > .flex,
+.layout-margin > .flex-gt-sm,
+.layout-margin > .flex-md {
+  margin: 8px;
+}
+.layout-margin-gt-lg > *,
+.layout-margin-gt-md > *,
+.layout-margin-lg > *,
+.layout-margin > .flex-gt-lg,
+.layout-margin > .flex-gt-md,
+.layout-margin > .flex-lg {
+  margin: 16px;
+}
+.layout-wrap {
+  flex-wrap: wrap;
+}
+.layout-nowrap {
+  flex-wrap: nowrap;
+}
+.layout-fill {
+  margin: 0;
+  width: 100%;
+  min-height: 100%;
+  height: 100%;
+}
+@media (max-width: 599px) {
+  .hide-xs:not(.show-xs):not(.show),
+  .hide:not(.show-xs):not(.show) {
+    display: none;
+  }
+  .flex-order-xs--20 {
+    order: -20;
+  }
+  .flex-order-xs--19 {
+    order: -19;
+  }
+  .flex-order-xs--18 {
+    order: -18;
+  }
+  .flex-order-xs--17 {
+    order: -17;
+  }
+  .flex-order-xs--16 {
+    order: -16;
+  }
+  .flex-order-xs--15 {
+    order: -15;
+  }
+  .flex-order-xs--14 {
+    order: -14;
+  }
+  .flex-order-xs--13 {
+    order: -13;
+  }
+  .flex-order-xs--12 {
+    order: -12;
+  }
+  .flex-order-xs--11 {
+    order: -11;
+  }
+  .flex-order-xs--10 {
+    order: -10;
+  }
+  .flex-order-xs--9 {
+    order: -9;
+  }
+  .flex-order-xs--8 {
+    order: -8;
+  }
+  .flex-order-xs--7 {
+    order: -7;
+  }
+  .flex-order-xs--6 {
+    order: -6;
+  }
+  .flex-order-xs--5 {
+    order: -5;
+  }
+  .flex-order-xs--4 {
+    order: -4;
+  }
+  .flex-order-xs--3 {
+    order: -3;
+  }
+  .flex-order-xs--2 {
+    order: -2;
+  }
+  .flex-order-xs--1 {
+    order: -1;
+  }
+  .flex-order-xs-0 {
+    order: 0;
+  }
+  .flex-order-xs-1 {
+    order: 1;
+  }
+  .flex-order-xs-2 {
+    order: 2;
+  }
+  .flex-order-xs-3 {
+    order: 3;
+  }
+  .flex-order-xs-4 {
+    order: 4;
+  }
+  .flex-order-xs-5 {
+    order: 5;
+  }
+  .flex-order-xs-6 {
+    order: 6;
+  }
+  .flex-order-xs-7 {
+    order: 7;
+  }
+  .flex-order-xs-8 {
+    order: 8;
+  }
+  .flex-order-xs-9 {
+    order: 9;
+  }
+  .flex-order-xs-10 {
+    order: 10;
+  }
+  .flex-order-xs-11 {
+    order: 11;
+  }
+  .flex-order-xs-12 {
+    order: 12;
+  }
+  .flex-order-xs-13 {
+    order: 13;
+  }
+  .flex-order-xs-14 {
+    order: 14;
+  }
+  .flex-order-xs-15 {
+    order: 15;
+  }
+  .flex-order-xs-16 {
+    order: 16;
+  }
+  .flex-order-xs-17 {
+    order: 17;
+  }
+  .flex-order-xs-18 {
+    order: 18;
+  }
+  .flex-order-xs-19 {
+    order: 19;
+  }
+  .flex-order-xs-20 {
+    order: 20;
+  }
+  .flex-offset-xs-0,
+  .layout-margin .flex-offset-xs-0,
+  .layout-margin .offset-xs-0,
+  .offset-xs-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-xs-0,
+  [dir='rtl'] .layout-margin .flex-offset-xs-0,
+  [dir='rtl'] .layout-margin .offset-xs-0,
+  [dir='rtl'] .offset-xs-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-xs-5,
+  .layout-margin .flex-offset-xs-5,
+  .layout-margin .offset-xs-5,
+  .offset-xs-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-xs-5,
+  [dir='rtl'] .layout-margin .flex-offset-xs-5,
+  [dir='rtl'] .layout-margin .offset-xs-5,
+  [dir='rtl'] .offset-xs-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-xs-10,
+  .layout-margin .flex-offset-xs-10,
+  .layout-margin .offset-xs-10,
+  .offset-xs-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-xs-10,
+  [dir='rtl'] .layout-margin .flex-offset-xs-10,
+  [dir='rtl'] .layout-margin .offset-xs-10,
+  [dir='rtl'] .offset-xs-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-xs-15,
+  .layout-margin .flex-offset-xs-15,
+  .layout-margin .offset-xs-15,
+  .offset-xs-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-xs-15,
+  [dir='rtl'] .layout-margin .flex-offset-xs-15,
+  [dir='rtl'] .layout-margin .offset-xs-15,
+  [dir='rtl'] .offset-xs-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-xs-20,
+  .layout-margin .flex-offset-xs-20,
+  .layout-margin .offset-xs-20,
+  .offset-xs-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-xs-20,
+  [dir='rtl'] .layout-margin .flex-offset-xs-20,
+  [dir='rtl'] .layout-margin .offset-xs-20,
+  [dir='rtl'] .offset-xs-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-xs-25,
+  .layout-margin .flex-offset-xs-25,
+  .layout-margin .offset-xs-25,
+  .offset-xs-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-xs-25,
+  [dir='rtl'] .layout-margin .flex-offset-xs-25,
+  [dir='rtl'] .layout-margin .offset-xs-25,
+  [dir='rtl'] .offset-xs-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-xs-30,
+  .layout-margin .flex-offset-xs-30,
+  .layout-margin .offset-xs-30,
+  .offset-xs-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-xs-30,
+  [dir='rtl'] .layout-margin .flex-offset-xs-30,
+  [dir='rtl'] .layout-margin .offset-xs-30,
+  [dir='rtl'] .offset-xs-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-xs-35,
+  .layout-margin .flex-offset-xs-35,
+  .layout-margin .offset-xs-35,
+  .offset-xs-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-xs-35,
+  [dir='rtl'] .layout-margin .flex-offset-xs-35,
+  [dir='rtl'] .layout-margin .offset-xs-35,
+  [dir='rtl'] .offset-xs-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-xs-40,
+  .layout-margin .flex-offset-xs-40,
+  .layout-margin .offset-xs-40,
+  .offset-xs-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-xs-40,
+  [dir='rtl'] .layout-margin .flex-offset-xs-40,
+  [dir='rtl'] .layout-margin .offset-xs-40,
+  [dir='rtl'] .offset-xs-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-xs-45,
+  .layout-margin .flex-offset-xs-45,
+  .layout-margin .offset-xs-45,
+  .offset-xs-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-xs-45,
+  [dir='rtl'] .layout-margin .flex-offset-xs-45,
+  [dir='rtl'] .layout-margin .offset-xs-45,
+  [dir='rtl'] .offset-xs-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-xs-50,
+  .layout-margin .flex-offset-xs-50,
+  .layout-margin .offset-xs-50,
+  .offset-xs-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-xs-50,
+  [dir='rtl'] .layout-margin .flex-offset-xs-50,
+  [dir='rtl'] .layout-margin .offset-xs-50,
+  [dir='rtl'] .offset-xs-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-xs-55,
+  .layout-margin .flex-offset-xs-55,
+  .layout-margin .offset-xs-55,
+  .offset-xs-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-xs-55,
+  [dir='rtl'] .layout-margin .flex-offset-xs-55,
+  [dir='rtl'] .layout-margin .offset-xs-55,
+  [dir='rtl'] .offset-xs-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-xs-60,
+  .layout-margin .flex-offset-xs-60,
+  .layout-margin .offset-xs-60,
+  .offset-xs-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-xs-60,
+  [dir='rtl'] .layout-margin .flex-offset-xs-60,
+  [dir='rtl'] .layout-margin .offset-xs-60,
+  [dir='rtl'] .offset-xs-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-xs-65,
+  .layout-margin .flex-offset-xs-65,
+  .layout-margin .offset-xs-65,
+  .offset-xs-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-xs-65,
+  [dir='rtl'] .layout-margin .flex-offset-xs-65,
+  [dir='rtl'] .layout-margin .offset-xs-65,
+  [dir='rtl'] .offset-xs-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-xs-70,
+  .layout-margin .flex-offset-xs-70,
+  .layout-margin .offset-xs-70,
+  .offset-xs-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-xs-70,
+  [dir='rtl'] .layout-margin .flex-offset-xs-70,
+  [dir='rtl'] .layout-margin .offset-xs-70,
+  [dir='rtl'] .offset-xs-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-xs-75,
+  .layout-margin .flex-offset-xs-75,
+  .layout-margin .offset-xs-75,
+  .offset-xs-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-xs-75,
+  [dir='rtl'] .layout-margin .flex-offset-xs-75,
+  [dir='rtl'] .layout-margin .offset-xs-75,
+  [dir='rtl'] .offset-xs-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-xs-80,
+  .layout-margin .flex-offset-xs-80,
+  .layout-margin .offset-xs-80,
+  .offset-xs-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-xs-80,
+  [dir='rtl'] .layout-margin .flex-offset-xs-80,
+  [dir='rtl'] .layout-margin .offset-xs-80,
+  [dir='rtl'] .offset-xs-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-xs-85,
+  .layout-margin .flex-offset-xs-85,
+  .layout-margin .offset-xs-85,
+  .offset-xs-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-xs-85,
+  [dir='rtl'] .layout-margin .flex-offset-xs-85,
+  [dir='rtl'] .layout-margin .offset-xs-85,
+  [dir='rtl'] .offset-xs-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-xs-90,
+  .layout-margin .flex-offset-xs-90,
+  .layout-margin .offset-xs-90,
+  .offset-xs-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-xs-90,
+  [dir='rtl'] .layout-margin .flex-offset-xs-90,
+  [dir='rtl'] .layout-margin .offset-xs-90,
+  [dir='rtl'] .offset-xs-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-xs-95,
+  .layout-margin .flex-offset-xs-95,
+  .layout-margin .offset-xs-95,
+  .offset-xs-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-xs-95,
+  [dir='rtl'] .layout-margin .flex-offset-xs-95,
+  [dir='rtl'] .layout-margin .offset-xs-95,
+  [dir='rtl'] .offset-xs-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-xs-33,
+  .layout-margin .flex-offset-xs-33,
+  .layout-margin .offset-xs-33,
+  .offset-xs-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-xs-66,
+  .layout-margin .flex-offset-xs-66,
+  .layout-margin .offset-xs-66,
+  .offset-xs-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-xs-66,
+  [dir='rtl'] .layout-margin .flex-offset-xs-66,
+  [dir='rtl'] .layout-margin .offset-xs-66,
+  [dir='rtl'] .offset-xs-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-xs,
+  .layout-align-xs-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-xs-start,
+  .layout-align-xs-start-center,
+  .layout-align-xs-start-end,
+  .layout-align-xs-start-start,
+  .layout-align-xs-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-xs-center,
+  .layout-align-xs-center-center,
+  .layout-align-xs-center-end,
+  .layout-align-xs-center-start,
+  .layout-align-xs-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-xs-end,
+  .layout-align-xs-end-center,
+  .layout-align-xs-end-end,
+  .layout-align-xs-end-start,
+  .layout-align-xs-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-xs-space-around,
+  .layout-align-xs-space-around-center,
+  .layout-align-xs-space-around-end,
+  .layout-align-xs-space-around-start,
+  .layout-align-xs-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-xs-space-between,
+  .layout-align-xs-space-between-center,
+  .layout-align-xs-space-between-end,
+  .layout-align-xs-space-between-start,
+  .layout-align-xs-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-xs-center-start,
+  .layout-align-xs-end-start,
+  .layout-align-xs-space-around-start,
+  .layout-align-xs-space-between-start,
+  .layout-align-xs-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-xs-center-center,
+  .layout-align-xs-end-center,
+  .layout-align-xs-space-around-center,
+  .layout-align-xs-space-between-center,
+  .layout-align-xs-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-xs-center-center > *,
+  .layout-align-xs-end-center > *,
+  .layout-align-xs-space-around-center > *,
+  .layout-align-xs-space-between-center > *,
+  .layout-align-xs-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-xs-center-end,
+  .layout-align-xs-end-end,
+  .layout-align-xs-space-around-end,
+  .layout-align-xs-space-between-end,
+  .layout-align-xs-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-xs-center-stretch,
+  .layout-align-xs-end-stretch,
+  .layout-align-xs-space-around-stretch,
+  .layout-align-xs-space-between-stretch,
+  .layout-align-xs-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-xs {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-xs-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-xs-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xs-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xs-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-xs-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-xs-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-xs-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-xs-column > .flex-xs-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xs-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xs-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex-xs-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xs-row > .flex {
+    min-width: 0;
+  }
+  .layout-xs-column > .flex-xs-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex-xs-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-xs-column > .flex {
+    min-height: 0;
+  }
+  .layout-xs,
+  .layout-xs-column,
+  .layout-xs-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-xs-column {
+    flex-direction: column;
+  }
+  .layout-xs-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 600px) {
+  .flex-order-gt-xs--20 {
+    order: -20;
+  }
+  .flex-order-gt-xs--19 {
+    order: -19;
+  }
+  .flex-order-gt-xs--18 {
+    order: -18;
+  }
+  .flex-order-gt-xs--17 {
+    order: -17;
+  }
+  .flex-order-gt-xs--16 {
+    order: -16;
+  }
+  .flex-order-gt-xs--15 {
+    order: -15;
+  }
+  .flex-order-gt-xs--14 {
+    order: -14;
+  }
+  .flex-order-gt-xs--13 {
+    order: -13;
+  }
+  .flex-order-gt-xs--12 {
+    order: -12;
+  }
+  .flex-order-gt-xs--11 {
+    order: -11;
+  }
+  .flex-order-gt-xs--10 {
+    order: -10;
+  }
+  .flex-order-gt-xs--9 {
+    order: -9;
+  }
+  .flex-order-gt-xs--8 {
+    order: -8;
+  }
+  .flex-order-gt-xs--7 {
+    order: -7;
+  }
+  .flex-order-gt-xs--6 {
+    order: -6;
+  }
+  .flex-order-gt-xs--5 {
+    order: -5;
+  }
+  .flex-order-gt-xs--4 {
+    order: -4;
+  }
+  .flex-order-gt-xs--3 {
+    order: -3;
+  }
+  .flex-order-gt-xs--2 {
+    order: -2;
+  }
+  .flex-order-gt-xs--1 {
+    order: -1;
+  }
+  .flex-order-gt-xs-0 {
+    order: 0;
+  }
+  .flex-order-gt-xs-1 {
+    order: 1;
+  }
+  .flex-order-gt-xs-2 {
+    order: 2;
+  }
+  .flex-order-gt-xs-3 {
+    order: 3;
+  }
+  .flex-order-gt-xs-4 {
+    order: 4;
+  }
+  .flex-order-gt-xs-5 {
+    order: 5;
+  }
+  .flex-order-gt-xs-6 {
+    order: 6;
+  }
+  .flex-order-gt-xs-7 {
+    order: 7;
+  }
+  .flex-order-gt-xs-8 {
+    order: 8;
+  }
+  .flex-order-gt-xs-9 {
+    order: 9;
+  }
+  .flex-order-gt-xs-10 {
+    order: 10;
+  }
+  .flex-order-gt-xs-11 {
+    order: 11;
+  }
+  .flex-order-gt-xs-12 {
+    order: 12;
+  }
+  .flex-order-gt-xs-13 {
+    order: 13;
+  }
+  .flex-order-gt-xs-14 {
+    order: 14;
+  }
+  .flex-order-gt-xs-15 {
+    order: 15;
+  }
+  .flex-order-gt-xs-16 {
+    order: 16;
+  }
+  .flex-order-gt-xs-17 {
+    order: 17;
+  }
+  .flex-order-gt-xs-18 {
+    order: 18;
+  }
+  .flex-order-gt-xs-19 {
+    order: 19;
+  }
+  .flex-order-gt-xs-20 {
+    order: 20;
+  }
+  .flex-offset-gt-xs-0,
+  .layout-margin .flex-offset-gt-xs-0,
+  .layout-margin .offset-gt-xs-0,
+  .offset-gt-xs-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-0,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-0,
+  [dir='rtl'] .layout-margin .offset-gt-xs-0,
+  [dir='rtl'] .offset-gt-xs-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-gt-xs-5,
+  .layout-margin .flex-offset-gt-xs-5,
+  .layout-margin .offset-gt-xs-5,
+  .offset-gt-xs-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-5,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-5,
+  [dir='rtl'] .layout-margin .offset-gt-xs-5,
+  [dir='rtl'] .offset-gt-xs-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-gt-xs-10,
+  .layout-margin .flex-offset-gt-xs-10,
+  .layout-margin .offset-gt-xs-10,
+  .offset-gt-xs-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-10,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-10,
+  [dir='rtl'] .layout-margin .offset-gt-xs-10,
+  [dir='rtl'] .offset-gt-xs-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-gt-xs-15,
+  .layout-margin .flex-offset-gt-xs-15,
+  .layout-margin .offset-gt-xs-15,
+  .offset-gt-xs-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-15,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-15,
+  [dir='rtl'] .layout-margin .offset-gt-xs-15,
+  [dir='rtl'] .offset-gt-xs-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-gt-xs-20,
+  .layout-margin .flex-offset-gt-xs-20,
+  .layout-margin .offset-gt-xs-20,
+  .offset-gt-xs-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-20,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-20,
+  [dir='rtl'] .layout-margin .offset-gt-xs-20,
+  [dir='rtl'] .offset-gt-xs-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-gt-xs-25,
+  .layout-margin .flex-offset-gt-xs-25,
+  .layout-margin .offset-gt-xs-25,
+  .offset-gt-xs-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-25,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-25,
+  [dir='rtl'] .layout-margin .offset-gt-xs-25,
+  [dir='rtl'] .offset-gt-xs-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-gt-xs-30,
+  .layout-margin .flex-offset-gt-xs-30,
+  .layout-margin .offset-gt-xs-30,
+  .offset-gt-xs-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-30,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-30,
+  [dir='rtl'] .layout-margin .offset-gt-xs-30,
+  [dir='rtl'] .offset-gt-xs-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-gt-xs-35,
+  .layout-margin .flex-offset-gt-xs-35,
+  .layout-margin .offset-gt-xs-35,
+  .offset-gt-xs-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-35,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-35,
+  [dir='rtl'] .layout-margin .offset-gt-xs-35,
+  [dir='rtl'] .offset-gt-xs-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-gt-xs-40,
+  .layout-margin .flex-offset-gt-xs-40,
+  .layout-margin .offset-gt-xs-40,
+  .offset-gt-xs-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-40,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-40,
+  [dir='rtl'] .layout-margin .offset-gt-xs-40,
+  [dir='rtl'] .offset-gt-xs-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-gt-xs-45,
+  .layout-margin .flex-offset-gt-xs-45,
+  .layout-margin .offset-gt-xs-45,
+  .offset-gt-xs-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-45,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-45,
+  [dir='rtl'] .layout-margin .offset-gt-xs-45,
+  [dir='rtl'] .offset-gt-xs-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-gt-xs-50,
+  .layout-margin .flex-offset-gt-xs-50,
+  .layout-margin .offset-gt-xs-50,
+  .offset-gt-xs-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-50,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-50,
+  [dir='rtl'] .layout-margin .offset-gt-xs-50,
+  [dir='rtl'] .offset-gt-xs-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-gt-xs-55,
+  .layout-margin .flex-offset-gt-xs-55,
+  .layout-margin .offset-gt-xs-55,
+  .offset-gt-xs-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-55,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-55,
+  [dir='rtl'] .layout-margin .offset-gt-xs-55,
+  [dir='rtl'] .offset-gt-xs-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-gt-xs-60,
+  .layout-margin .flex-offset-gt-xs-60,
+  .layout-margin .offset-gt-xs-60,
+  .offset-gt-xs-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-60,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-60,
+  [dir='rtl'] .layout-margin .offset-gt-xs-60,
+  [dir='rtl'] .offset-gt-xs-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-gt-xs-65,
+  .layout-margin .flex-offset-gt-xs-65,
+  .layout-margin .offset-gt-xs-65,
+  .offset-gt-xs-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-65,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-65,
+  [dir='rtl'] .layout-margin .offset-gt-xs-65,
+  [dir='rtl'] .offset-gt-xs-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-gt-xs-70,
+  .layout-margin .flex-offset-gt-xs-70,
+  .layout-margin .offset-gt-xs-70,
+  .offset-gt-xs-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-70,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-70,
+  [dir='rtl'] .layout-margin .offset-gt-xs-70,
+  [dir='rtl'] .offset-gt-xs-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-gt-xs-75,
+  .layout-margin .flex-offset-gt-xs-75,
+  .layout-margin .offset-gt-xs-75,
+  .offset-gt-xs-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-75,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-75,
+  [dir='rtl'] .layout-margin .offset-gt-xs-75,
+  [dir='rtl'] .offset-gt-xs-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-gt-xs-80,
+  .layout-margin .flex-offset-gt-xs-80,
+  .layout-margin .offset-gt-xs-80,
+  .offset-gt-xs-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-80,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-80,
+  [dir='rtl'] .layout-margin .offset-gt-xs-80,
+  [dir='rtl'] .offset-gt-xs-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-gt-xs-85,
+  .layout-margin .flex-offset-gt-xs-85,
+  .layout-margin .offset-gt-xs-85,
+  .offset-gt-xs-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-85,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-85,
+  [dir='rtl'] .layout-margin .offset-gt-xs-85,
+  [dir='rtl'] .offset-gt-xs-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-gt-xs-90,
+  .layout-margin .flex-offset-gt-xs-90,
+  .layout-margin .offset-gt-xs-90,
+  .offset-gt-xs-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-90,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-90,
+  [dir='rtl'] .layout-margin .offset-gt-xs-90,
+  [dir='rtl'] .offset-gt-xs-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-gt-xs-95,
+  .layout-margin .flex-offset-gt-xs-95,
+  .layout-margin .offset-gt-xs-95,
+  .offset-gt-xs-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-95,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-95,
+  [dir='rtl'] .layout-margin .offset-gt-xs-95,
+  [dir='rtl'] .offset-gt-xs-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-gt-xs-33,
+  .layout-margin .flex-offset-gt-xs-33,
+  .layout-margin .offset-gt-xs-33,
+  .offset-gt-xs-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-gt-xs-66,
+  .layout-margin .flex-offset-gt-xs-66,
+  .layout-margin .offset-gt-xs-66,
+  .offset-gt-xs-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-gt-xs-66,
+  [dir='rtl'] .layout-margin .flex-offset-gt-xs-66,
+  [dir='rtl'] .layout-margin .offset-gt-xs-66,
+  [dir='rtl'] .offset-gt-xs-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-gt-xs,
+  .layout-align-gt-xs-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-gt-xs-start,
+  .layout-align-gt-xs-start-center,
+  .layout-align-gt-xs-start-end,
+  .layout-align-gt-xs-start-start,
+  .layout-align-gt-xs-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-gt-xs-center,
+  .layout-align-gt-xs-center-center,
+  .layout-align-gt-xs-center-end,
+  .layout-align-gt-xs-center-start,
+  .layout-align-gt-xs-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-gt-xs-end,
+  .layout-align-gt-xs-end-center,
+  .layout-align-gt-xs-end-end,
+  .layout-align-gt-xs-end-start,
+  .layout-align-gt-xs-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-gt-xs-space-around,
+  .layout-align-gt-xs-space-around-center,
+  .layout-align-gt-xs-space-around-end,
+  .layout-align-gt-xs-space-around-start,
+  .layout-align-gt-xs-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-gt-xs-space-between,
+  .layout-align-gt-xs-space-between-center,
+  .layout-align-gt-xs-space-between-end,
+  .layout-align-gt-xs-space-between-start,
+  .layout-align-gt-xs-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-gt-xs-center-start,
+  .layout-align-gt-xs-end-start,
+  .layout-align-gt-xs-space-around-start,
+  .layout-align-gt-xs-space-between-start,
+  .layout-align-gt-xs-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-gt-xs-center-center,
+  .layout-align-gt-xs-end-center,
+  .layout-align-gt-xs-space-around-center,
+  .layout-align-gt-xs-space-between-center,
+  .layout-align-gt-xs-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-gt-xs-center-center > *,
+  .layout-align-gt-xs-end-center > *,
+  .layout-align-gt-xs-space-around-center > *,
+  .layout-align-gt-xs-space-between-center > *,
+  .layout-align-gt-xs-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-gt-xs-center-end,
+  .layout-align-gt-xs-end-end,
+  .layout-align-gt-xs-space-around-end,
+  .layout-align-gt-xs-space-between-end,
+  .layout-align-gt-xs-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-gt-xs-center-stretch,
+  .layout-align-gt-xs-end-stretch,
+  .layout-align-gt-xs-space-around-stretch,
+  .layout-align-gt-xs-space-between-stretch,
+  .layout-align-gt-xs-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-gt-xs {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-gt-xs-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-gt-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-gt-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-xs-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-xs-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex-gt-xs-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-row > .flex {
+    min-width: 0;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex-gt-xs-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-xs-column > .flex {
+    min-height: 0;
+  }
+  .layout-gt-xs,
+  .layout-gt-xs-column,
+  .layout-gt-xs-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-gt-xs-column {
+    flex-direction: column;
+  }
+  .layout-gt-xs-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 600px) and (max-width: 959px) {
+  .hide-gt-xs:not(.show-gt-xs):not(.show-sm):not(.show),
+  .hide:not(.show-gt-xs):not(.show-sm):not(.show) {
+    display: none;
+  }
+  .hide-sm:not(.show-gt-xs):not(.show-sm):not(.show) {
+    display: none;
+  }
+  .flex-order-sm--20 {
+    order: -20;
+  }
+  .flex-order-sm--19 {
+    order: -19;
+  }
+  .flex-order-sm--18 {
+    order: -18;
+  }
+  .flex-order-sm--17 {
+    order: -17;
+  }
+  .flex-order-sm--16 {
+    order: -16;
+  }
+  .flex-order-sm--15 {
+    order: -15;
+  }
+  .flex-order-sm--14 {
+    order: -14;
+  }
+  .flex-order-sm--13 {
+    order: -13;
+  }
+  .flex-order-sm--12 {
+    order: -12;
+  }
+  .flex-order-sm--11 {
+    order: -11;
+  }
+  .flex-order-sm--10 {
+    order: -10;
+  }
+  .flex-order-sm--9 {
+    order: -9;
+  }
+  .flex-order-sm--8 {
+    order: -8;
+  }
+  .flex-order-sm--7 {
+    order: -7;
+  }
+  .flex-order-sm--6 {
+    order: -6;
+  }
+  .flex-order-sm--5 {
+    order: -5;
+  }
+  .flex-order-sm--4 {
+    order: -4;
+  }
+  .flex-order-sm--3 {
+    order: -3;
+  }
+  .flex-order-sm--2 {
+    order: -2;
+  }
+  .flex-order-sm--1 {
+    order: -1;
+  }
+  .flex-order-sm-0 {
+    order: 0;
+  }
+  .flex-order-sm-1 {
+    order: 1;
+  }
+  .flex-order-sm-2 {
+    order: 2;
+  }
+  .flex-order-sm-3 {
+    order: 3;
+  }
+  .flex-order-sm-4 {
+    order: 4;
+  }
+  .flex-order-sm-5 {
+    order: 5;
+  }
+  .flex-order-sm-6 {
+    order: 6;
+  }
+  .flex-order-sm-7 {
+    order: 7;
+  }
+  .flex-order-sm-8 {
+    order: 8;
+  }
+  .flex-order-sm-9 {
+    order: 9;
+  }
+  .flex-order-sm-10 {
+    order: 10;
+  }
+  .flex-order-sm-11 {
+    order: 11;
+  }
+  .flex-order-sm-12 {
+    order: 12;
+  }
+  .flex-order-sm-13 {
+    order: 13;
+  }
+  .flex-order-sm-14 {
+    order: 14;
+  }
+  .flex-order-sm-15 {
+    order: 15;
+  }
+  .flex-order-sm-16 {
+    order: 16;
+  }
+  .flex-order-sm-17 {
+    order: 17;
+  }
+  .flex-order-sm-18 {
+    order: 18;
+  }
+  .flex-order-sm-19 {
+    order: 19;
+  }
+  .flex-order-sm-20 {
+    order: 20;
+  }
+  .flex-offset-sm-0,
+  .layout-margin .flex-offset-sm-0,
+  .layout-margin .offset-sm-0,
+  .offset-sm-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-sm-0,
+  [dir='rtl'] .layout-margin .flex-offset-sm-0,
+  [dir='rtl'] .layout-margin .offset-sm-0,
+  [dir='rtl'] .offset-sm-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-sm-5,
+  .layout-margin .flex-offset-sm-5,
+  .layout-margin .offset-sm-5,
+  .offset-sm-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-sm-5,
+  [dir='rtl'] .layout-margin .flex-offset-sm-5,
+  [dir='rtl'] .layout-margin .offset-sm-5,
+  [dir='rtl'] .offset-sm-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-sm-10,
+  .layout-margin .flex-offset-sm-10,
+  .layout-margin .offset-sm-10,
+  .offset-sm-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-sm-10,
+  [dir='rtl'] .layout-margin .flex-offset-sm-10,
+  [dir='rtl'] .layout-margin .offset-sm-10,
+  [dir='rtl'] .offset-sm-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-sm-15,
+  .layout-margin .flex-offset-sm-15,
+  .layout-margin .offset-sm-15,
+  .offset-sm-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-sm-15,
+  [dir='rtl'] .layout-margin .flex-offset-sm-15,
+  [dir='rtl'] .layout-margin .offset-sm-15,
+  [dir='rtl'] .offset-sm-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-sm-20,
+  .layout-margin .flex-offset-sm-20,
+  .layout-margin .offset-sm-20,
+  .offset-sm-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-sm-20,
+  [dir='rtl'] .layout-margin .flex-offset-sm-20,
+  [dir='rtl'] .layout-margin .offset-sm-20,
+  [dir='rtl'] .offset-sm-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-sm-25,
+  .layout-margin .flex-offset-sm-25,
+  .layout-margin .offset-sm-25,
+  .offset-sm-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-sm-25,
+  [dir='rtl'] .layout-margin .flex-offset-sm-25,
+  [dir='rtl'] .layout-margin .offset-sm-25,
+  [dir='rtl'] .offset-sm-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-sm-30,
+  .layout-margin .flex-offset-sm-30,
+  .layout-margin .offset-sm-30,
+  .offset-sm-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-sm-30,
+  [dir='rtl'] .layout-margin .flex-offset-sm-30,
+  [dir='rtl'] .layout-margin .offset-sm-30,
+  [dir='rtl'] .offset-sm-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-sm-35,
+  .layout-margin .flex-offset-sm-35,
+  .layout-margin .offset-sm-35,
+  .offset-sm-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-sm-35,
+  [dir='rtl'] .layout-margin .flex-offset-sm-35,
+  [dir='rtl'] .layout-margin .offset-sm-35,
+  [dir='rtl'] .offset-sm-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-sm-40,
+  .layout-margin .flex-offset-sm-40,
+  .layout-margin .offset-sm-40,
+  .offset-sm-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-sm-40,
+  [dir='rtl'] .layout-margin .flex-offset-sm-40,
+  [dir='rtl'] .layout-margin .offset-sm-40,
+  [dir='rtl'] .offset-sm-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-sm-45,
+  .layout-margin .flex-offset-sm-45,
+  .layout-margin .offset-sm-45,
+  .offset-sm-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-sm-45,
+  [dir='rtl'] .layout-margin .flex-offset-sm-45,
+  [dir='rtl'] .layout-margin .offset-sm-45,
+  [dir='rtl'] .offset-sm-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-sm-50,
+  .layout-margin .flex-offset-sm-50,
+  .layout-margin .offset-sm-50,
+  .offset-sm-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-sm-50,
+  [dir='rtl'] .layout-margin .flex-offset-sm-50,
+  [dir='rtl'] .layout-margin .offset-sm-50,
+  [dir='rtl'] .offset-sm-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-sm-55,
+  .layout-margin .flex-offset-sm-55,
+  .layout-margin .offset-sm-55,
+  .offset-sm-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-sm-55,
+  [dir='rtl'] .layout-margin .flex-offset-sm-55,
+  [dir='rtl'] .layout-margin .offset-sm-55,
+  [dir='rtl'] .offset-sm-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-sm-60,
+  .layout-margin .flex-offset-sm-60,
+  .layout-margin .offset-sm-60,
+  .offset-sm-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-sm-60,
+  [dir='rtl'] .layout-margin .flex-offset-sm-60,
+  [dir='rtl'] .layout-margin .offset-sm-60,
+  [dir='rtl'] .offset-sm-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-sm-65,
+  .layout-margin .flex-offset-sm-65,
+  .layout-margin .offset-sm-65,
+  .offset-sm-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-sm-65,
+  [dir='rtl'] .layout-margin .flex-offset-sm-65,
+  [dir='rtl'] .layout-margin .offset-sm-65,
+  [dir='rtl'] .offset-sm-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-sm-70,
+  .layout-margin .flex-offset-sm-70,
+  .layout-margin .offset-sm-70,
+  .offset-sm-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-sm-70,
+  [dir='rtl'] .layout-margin .flex-offset-sm-70,
+  [dir='rtl'] .layout-margin .offset-sm-70,
+  [dir='rtl'] .offset-sm-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-sm-75,
+  .layout-margin .flex-offset-sm-75,
+  .layout-margin .offset-sm-75,
+  .offset-sm-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-sm-75,
+  [dir='rtl'] .layout-margin .flex-offset-sm-75,
+  [dir='rtl'] .layout-margin .offset-sm-75,
+  [dir='rtl'] .offset-sm-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-sm-80,
+  .layout-margin .flex-offset-sm-80,
+  .layout-margin .offset-sm-80,
+  .offset-sm-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-sm-80,
+  [dir='rtl'] .layout-margin .flex-offset-sm-80,
+  [dir='rtl'] .layout-margin .offset-sm-80,
+  [dir='rtl'] .offset-sm-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-sm-85,
+  .layout-margin .flex-offset-sm-85,
+  .layout-margin .offset-sm-85,
+  .offset-sm-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-sm-85,
+  [dir='rtl'] .layout-margin .flex-offset-sm-85,
+  [dir='rtl'] .layout-margin .offset-sm-85,
+  [dir='rtl'] .offset-sm-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-sm-90,
+  .layout-margin .flex-offset-sm-90,
+  .layout-margin .offset-sm-90,
+  .offset-sm-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-sm-90,
+  [dir='rtl'] .layout-margin .flex-offset-sm-90,
+  [dir='rtl'] .layout-margin .offset-sm-90,
+  [dir='rtl'] .offset-sm-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-sm-95,
+  .layout-margin .flex-offset-sm-95,
+  .layout-margin .offset-sm-95,
+  .offset-sm-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-sm-95,
+  [dir='rtl'] .layout-margin .flex-offset-sm-95,
+  [dir='rtl'] .layout-margin .offset-sm-95,
+  [dir='rtl'] .offset-sm-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-sm-33,
+  .layout-margin .flex-offset-sm-33,
+  .layout-margin .offset-sm-33,
+  .offset-sm-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-sm-66,
+  .layout-margin .flex-offset-sm-66,
+  .layout-margin .offset-sm-66,
+  .offset-sm-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-sm-66,
+  [dir='rtl'] .layout-margin .flex-offset-sm-66,
+  [dir='rtl'] .layout-margin .offset-sm-66,
+  [dir='rtl'] .offset-sm-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-sm,
+  .layout-align-sm-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-sm-start,
+  .layout-align-sm-start-center,
+  .layout-align-sm-start-end,
+  .layout-align-sm-start-start,
+  .layout-align-sm-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-sm-center,
+  .layout-align-sm-center-center,
+  .layout-align-sm-center-end,
+  .layout-align-sm-center-start,
+  .layout-align-sm-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-sm-end,
+  .layout-align-sm-end-center,
+  .layout-align-sm-end-end,
+  .layout-align-sm-end-start,
+  .layout-align-sm-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-sm-space-around,
+  .layout-align-sm-space-around-center,
+  .layout-align-sm-space-around-end,
+  .layout-align-sm-space-around-start,
+  .layout-align-sm-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-sm-space-between,
+  .layout-align-sm-space-between-center,
+  .layout-align-sm-space-between-end,
+  .layout-align-sm-space-between-start,
+  .layout-align-sm-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-sm-center-start,
+  .layout-align-sm-end-start,
+  .layout-align-sm-space-around-start,
+  .layout-align-sm-space-between-start,
+  .layout-align-sm-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-sm-center-center,
+  .layout-align-sm-end-center,
+  .layout-align-sm-space-around-center,
+  .layout-align-sm-space-between-center,
+  .layout-align-sm-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-sm-center-center > *,
+  .layout-align-sm-end-center > *,
+  .layout-align-sm-space-around-center > *,
+  .layout-align-sm-space-between-center > *,
+  .layout-align-sm-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-sm-center-end,
+  .layout-align-sm-end-end,
+  .layout-align-sm-space-around-end,
+  .layout-align-sm-space-between-end,
+  .layout-align-sm-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-sm-center-stretch,
+  .layout-align-sm-end-stretch,
+  .layout-align-sm-space-around-stretch,
+  .layout-align-sm-space-between-stretch,
+  .layout-align-sm-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-sm {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-sm-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-sm-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-sm-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-sm-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-sm-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-sm-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-sm-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-sm-column > .flex-sm-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-sm-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-sm-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex-sm-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-sm-row > .flex {
+    min-width: 0;
+  }
+  .layout-sm-column > .flex-sm-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex-sm-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-sm-column > .flex {
+    min-height: 0;
+  }
+  .layout-sm,
+  .layout-sm-column,
+  .layout-sm-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-sm-column {
+    flex-direction: column;
+  }
+  .layout-sm-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 960px) {
+  .flex-order-gt-sm--20 {
+    order: -20;
+  }
+  .flex-order-gt-sm--19 {
+    order: -19;
+  }
+  .flex-order-gt-sm--18 {
+    order: -18;
+  }
+  .flex-order-gt-sm--17 {
+    order: -17;
+  }
+  .flex-order-gt-sm--16 {
+    order: -16;
+  }
+  .flex-order-gt-sm--15 {
+    order: -15;
+  }
+  .flex-order-gt-sm--14 {
+    order: -14;
+  }
+  .flex-order-gt-sm--13 {
+    order: -13;
+  }
+  .flex-order-gt-sm--12 {
+    order: -12;
+  }
+  .flex-order-gt-sm--11 {
+    order: -11;
+  }
+  .flex-order-gt-sm--10 {
+    order: -10;
+  }
+  .flex-order-gt-sm--9 {
+    order: -9;
+  }
+  .flex-order-gt-sm--8 {
+    order: -8;
+  }
+  .flex-order-gt-sm--7 {
+    order: -7;
+  }
+  .flex-order-gt-sm--6 {
+    order: -6;
+  }
+  .flex-order-gt-sm--5 {
+    order: -5;
+  }
+  .flex-order-gt-sm--4 {
+    order: -4;
+  }
+  .flex-order-gt-sm--3 {
+    order: -3;
+  }
+  .flex-order-gt-sm--2 {
+    order: -2;
+  }
+  .flex-order-gt-sm--1 {
+    order: -1;
+  }
+  .flex-order-gt-sm-0 {
+    order: 0;
+  }
+  .flex-order-gt-sm-1 {
+    order: 1;
+  }
+  .flex-order-gt-sm-2 {
+    order: 2;
+  }
+  .flex-order-gt-sm-3 {
+    order: 3;
+  }
+  .flex-order-gt-sm-4 {
+    order: 4;
+  }
+  .flex-order-gt-sm-5 {
+    order: 5;
+  }
+  .flex-order-gt-sm-6 {
+    order: 6;
+  }
+  .flex-order-gt-sm-7 {
+    order: 7;
+  }
+  .flex-order-gt-sm-8 {
+    order: 8;
+  }
+  .flex-order-gt-sm-9 {
+    order: 9;
+  }
+  .flex-order-gt-sm-10 {
+    order: 10;
+  }
+  .flex-order-gt-sm-11 {
+    order: 11;
+  }
+  .flex-order-gt-sm-12 {
+    order: 12;
+  }
+  .flex-order-gt-sm-13 {
+    order: 13;
+  }
+  .flex-order-gt-sm-14 {
+    order: 14;
+  }
+  .flex-order-gt-sm-15 {
+    order: 15;
+  }
+  .flex-order-gt-sm-16 {
+    order: 16;
+  }
+  .flex-order-gt-sm-17 {
+    order: 17;
+  }
+  .flex-order-gt-sm-18 {
+    order: 18;
+  }
+  .flex-order-gt-sm-19 {
+    order: 19;
+  }
+  .flex-order-gt-sm-20 {
+    order: 20;
+  }
+  .flex-offset-gt-sm-0,
+  .layout-margin .flex-offset-gt-sm-0,
+  .layout-margin .offset-gt-sm-0,
+  .offset-gt-sm-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-0,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-0,
+  [dir='rtl'] .layout-margin .offset-gt-sm-0,
+  [dir='rtl'] .offset-gt-sm-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-gt-sm-5,
+  .layout-margin .flex-offset-gt-sm-5,
+  .layout-margin .offset-gt-sm-5,
+  .offset-gt-sm-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-5,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-5,
+  [dir='rtl'] .layout-margin .offset-gt-sm-5,
+  [dir='rtl'] .offset-gt-sm-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-gt-sm-10,
+  .layout-margin .flex-offset-gt-sm-10,
+  .layout-margin .offset-gt-sm-10,
+  .offset-gt-sm-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-10,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-10,
+  [dir='rtl'] .layout-margin .offset-gt-sm-10,
+  [dir='rtl'] .offset-gt-sm-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-gt-sm-15,
+  .layout-margin .flex-offset-gt-sm-15,
+  .layout-margin .offset-gt-sm-15,
+  .offset-gt-sm-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-15,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-15,
+  [dir='rtl'] .layout-margin .offset-gt-sm-15,
+  [dir='rtl'] .offset-gt-sm-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-gt-sm-20,
+  .layout-margin .flex-offset-gt-sm-20,
+  .layout-margin .offset-gt-sm-20,
+  .offset-gt-sm-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-20,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-20,
+  [dir='rtl'] .layout-margin .offset-gt-sm-20,
+  [dir='rtl'] .offset-gt-sm-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-gt-sm-25,
+  .layout-margin .flex-offset-gt-sm-25,
+  .layout-margin .offset-gt-sm-25,
+  .offset-gt-sm-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-25,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-25,
+  [dir='rtl'] .layout-margin .offset-gt-sm-25,
+  [dir='rtl'] .offset-gt-sm-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-gt-sm-30,
+  .layout-margin .flex-offset-gt-sm-30,
+  .layout-margin .offset-gt-sm-30,
+  .offset-gt-sm-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-30,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-30,
+  [dir='rtl'] .layout-margin .offset-gt-sm-30,
+  [dir='rtl'] .offset-gt-sm-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-gt-sm-35,
+  .layout-margin .flex-offset-gt-sm-35,
+  .layout-margin .offset-gt-sm-35,
+  .offset-gt-sm-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-35,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-35,
+  [dir='rtl'] .layout-margin .offset-gt-sm-35,
+  [dir='rtl'] .offset-gt-sm-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-gt-sm-40,
+  .layout-margin .flex-offset-gt-sm-40,
+  .layout-margin .offset-gt-sm-40,
+  .offset-gt-sm-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-40,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-40,
+  [dir='rtl'] .layout-margin .offset-gt-sm-40,
+  [dir='rtl'] .offset-gt-sm-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-gt-sm-45,
+  .layout-margin .flex-offset-gt-sm-45,
+  .layout-margin .offset-gt-sm-45,
+  .offset-gt-sm-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-45,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-45,
+  [dir='rtl'] .layout-margin .offset-gt-sm-45,
+  [dir='rtl'] .offset-gt-sm-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-gt-sm-50,
+  .layout-margin .flex-offset-gt-sm-50,
+  .layout-margin .offset-gt-sm-50,
+  .offset-gt-sm-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-50,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-50,
+  [dir='rtl'] .layout-margin .offset-gt-sm-50,
+  [dir='rtl'] .offset-gt-sm-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-gt-sm-55,
+  .layout-margin .flex-offset-gt-sm-55,
+  .layout-margin .offset-gt-sm-55,
+  .offset-gt-sm-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-55,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-55,
+  [dir='rtl'] .layout-margin .offset-gt-sm-55,
+  [dir='rtl'] .offset-gt-sm-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-gt-sm-60,
+  .layout-margin .flex-offset-gt-sm-60,
+  .layout-margin .offset-gt-sm-60,
+  .offset-gt-sm-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-60,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-60,
+  [dir='rtl'] .layout-margin .offset-gt-sm-60,
+  [dir='rtl'] .offset-gt-sm-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-gt-sm-65,
+  .layout-margin .flex-offset-gt-sm-65,
+  .layout-margin .offset-gt-sm-65,
+  .offset-gt-sm-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-65,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-65,
+  [dir='rtl'] .layout-margin .offset-gt-sm-65,
+  [dir='rtl'] .offset-gt-sm-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-gt-sm-70,
+  .layout-margin .flex-offset-gt-sm-70,
+  .layout-margin .offset-gt-sm-70,
+  .offset-gt-sm-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-70,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-70,
+  [dir='rtl'] .layout-margin .offset-gt-sm-70,
+  [dir='rtl'] .offset-gt-sm-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-gt-sm-75,
+  .layout-margin .flex-offset-gt-sm-75,
+  .layout-margin .offset-gt-sm-75,
+  .offset-gt-sm-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-75,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-75,
+  [dir='rtl'] .layout-margin .offset-gt-sm-75,
+  [dir='rtl'] .offset-gt-sm-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-gt-sm-80,
+  .layout-margin .flex-offset-gt-sm-80,
+  .layout-margin .offset-gt-sm-80,
+  .offset-gt-sm-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-80,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-80,
+  [dir='rtl'] .layout-margin .offset-gt-sm-80,
+  [dir='rtl'] .offset-gt-sm-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-gt-sm-85,
+  .layout-margin .flex-offset-gt-sm-85,
+  .layout-margin .offset-gt-sm-85,
+  .offset-gt-sm-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-85,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-85,
+  [dir='rtl'] .layout-margin .offset-gt-sm-85,
+  [dir='rtl'] .offset-gt-sm-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-gt-sm-90,
+  .layout-margin .flex-offset-gt-sm-90,
+  .layout-margin .offset-gt-sm-90,
+  .offset-gt-sm-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-90,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-90,
+  [dir='rtl'] .layout-margin .offset-gt-sm-90,
+  [dir='rtl'] .offset-gt-sm-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-gt-sm-95,
+  .layout-margin .flex-offset-gt-sm-95,
+  .layout-margin .offset-gt-sm-95,
+  .offset-gt-sm-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-95,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-95,
+  [dir='rtl'] .layout-margin .offset-gt-sm-95,
+  [dir='rtl'] .offset-gt-sm-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-gt-sm-33,
+  .layout-margin .flex-offset-gt-sm-33,
+  .layout-margin .offset-gt-sm-33,
+  .offset-gt-sm-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-gt-sm-66,
+  .layout-margin .flex-offset-gt-sm-66,
+  .layout-margin .offset-gt-sm-66,
+  .offset-gt-sm-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-gt-sm-66,
+  [dir='rtl'] .layout-margin .flex-offset-gt-sm-66,
+  [dir='rtl'] .layout-margin .offset-gt-sm-66,
+  [dir='rtl'] .offset-gt-sm-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-gt-sm,
+  .layout-align-gt-sm-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-gt-sm-start,
+  .layout-align-gt-sm-start-center,
+  .layout-align-gt-sm-start-end,
+  .layout-align-gt-sm-start-start,
+  .layout-align-gt-sm-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-gt-sm-center,
+  .layout-align-gt-sm-center-center,
+  .layout-align-gt-sm-center-end,
+  .layout-align-gt-sm-center-start,
+  .layout-align-gt-sm-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-gt-sm-end,
+  .layout-align-gt-sm-end-center,
+  .layout-align-gt-sm-end-end,
+  .layout-align-gt-sm-end-start,
+  .layout-align-gt-sm-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-gt-sm-space-around,
+  .layout-align-gt-sm-space-around-center,
+  .layout-align-gt-sm-space-around-end,
+  .layout-align-gt-sm-space-around-start,
+  .layout-align-gt-sm-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-gt-sm-space-between,
+  .layout-align-gt-sm-space-between-center,
+  .layout-align-gt-sm-space-between-end,
+  .layout-align-gt-sm-space-between-start,
+  .layout-align-gt-sm-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-gt-sm-center-start,
+  .layout-align-gt-sm-end-start,
+  .layout-align-gt-sm-space-around-start,
+  .layout-align-gt-sm-space-between-start,
+  .layout-align-gt-sm-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-gt-sm-center-center,
+  .layout-align-gt-sm-end-center,
+  .layout-align-gt-sm-space-around-center,
+  .layout-align-gt-sm-space-between-center,
+  .layout-align-gt-sm-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-gt-sm-center-center > *,
+  .layout-align-gt-sm-end-center > *,
+  .layout-align-gt-sm-space-around-center > *,
+  .layout-align-gt-sm-space-between-center > *,
+  .layout-align-gt-sm-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-gt-sm-center-end,
+  .layout-align-gt-sm-end-end,
+  .layout-align-gt-sm-space-around-end,
+  .layout-align-gt-sm-space-between-end,
+  .layout-align-gt-sm-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-gt-sm-center-stretch,
+  .layout-align-gt-sm-end-stretch,
+  .layout-align-gt-sm-space-around-stretch,
+  .layout-align-gt-sm-space-between-stretch,
+  .layout-align-gt-sm-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-gt-sm {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-gt-sm-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-gt-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-gt-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-sm-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-sm-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex-gt-sm-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-row > .flex {
+    min-width: 0;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex-gt-sm-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-sm-column > .flex {
+    min-height: 0;
+  }
+  .layout-gt-sm,
+  .layout-gt-sm-column,
+  .layout-gt-sm-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-gt-sm-column {
+    flex-direction: column;
+  }
+  .layout-gt-sm-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 960px) and (max-width: 1279px) {
+  .hide-gt-sm:not(.show-gt-xs):not(.show-gt-sm):not(.show-md):not(.show),
+  .hide-gt-xs:not(.show-gt-xs):not(.show-gt-sm):not(.show-md):not(.show),
+  .hide:not(.show-gt-xs):not(.show-gt-sm):not(.show-md):not(.show) {
+    display: none;
+  }
+  .hide-md:not(.show-md):not(.show-gt-sm):not(.show-gt-xs):not(.show) {
+    display: none;
+  }
+  .flex-order-md--20 {
+    order: -20;
+  }
+  .flex-order-md--19 {
+    order: -19;
+  }
+  .flex-order-md--18 {
+    order: -18;
+  }
+  .flex-order-md--17 {
+    order: -17;
+  }
+  .flex-order-md--16 {
+    order: -16;
+  }
+  .flex-order-md--15 {
+    order: -15;
+  }
+  .flex-order-md--14 {
+    order: -14;
+  }
+  .flex-order-md--13 {
+    order: -13;
+  }
+  .flex-order-md--12 {
+    order: -12;
+  }
+  .flex-order-md--11 {
+    order: -11;
+  }
+  .flex-order-md--10 {
+    order: -10;
+  }
+  .flex-order-md--9 {
+    order: -9;
+  }
+  .flex-order-md--8 {
+    order: -8;
+  }
+  .flex-order-md--7 {
+    order: -7;
+  }
+  .flex-order-md--6 {
+    order: -6;
+  }
+  .flex-order-md--5 {
+    order: -5;
+  }
+  .flex-order-md--4 {
+    order: -4;
+  }
+  .flex-order-md--3 {
+    order: -3;
+  }
+  .flex-order-md--2 {
+    order: -2;
+  }
+  .flex-order-md--1 {
+    order: -1;
+  }
+  .flex-order-md-0 {
+    order: 0;
+  }
+  .flex-order-md-1 {
+    order: 1;
+  }
+  .flex-order-md-2 {
+    order: 2;
+  }
+  .flex-order-md-3 {
+    order: 3;
+  }
+  .flex-order-md-4 {
+    order: 4;
+  }
+  .flex-order-md-5 {
+    order: 5;
+  }
+  .flex-order-md-6 {
+    order: 6;
+  }
+  .flex-order-md-7 {
+    order: 7;
+  }
+  .flex-order-md-8 {
+    order: 8;
+  }
+  .flex-order-md-9 {
+    order: 9;
+  }
+  .flex-order-md-10 {
+    order: 10;
+  }
+  .flex-order-md-11 {
+    order: 11;
+  }
+  .flex-order-md-12 {
+    order: 12;
+  }
+  .flex-order-md-13 {
+    order: 13;
+  }
+  .flex-order-md-14 {
+    order: 14;
+  }
+  .flex-order-md-15 {
+    order: 15;
+  }
+  .flex-order-md-16 {
+    order: 16;
+  }
+  .flex-order-md-17 {
+    order: 17;
+  }
+  .flex-order-md-18 {
+    order: 18;
+  }
+  .flex-order-md-19 {
+    order: 19;
+  }
+  .flex-order-md-20 {
+    order: 20;
+  }
+  .flex-offset-md-0,
+  .layout-margin .flex-offset-md-0,
+  .layout-margin .offset-md-0,
+  .offset-md-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-md-0,
+  [dir='rtl'] .layout-margin .flex-offset-md-0,
+  [dir='rtl'] .layout-margin .offset-md-0,
+  [dir='rtl'] .offset-md-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-md-5,
+  .layout-margin .flex-offset-md-5,
+  .layout-margin .offset-md-5,
+  .offset-md-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-md-5,
+  [dir='rtl'] .layout-margin .flex-offset-md-5,
+  [dir='rtl'] .layout-margin .offset-md-5,
+  [dir='rtl'] .offset-md-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-md-10,
+  .layout-margin .flex-offset-md-10,
+  .layout-margin .offset-md-10,
+  .offset-md-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-md-10,
+  [dir='rtl'] .layout-margin .flex-offset-md-10,
+  [dir='rtl'] .layout-margin .offset-md-10,
+  [dir='rtl'] .offset-md-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-md-15,
+  .layout-margin .flex-offset-md-15,
+  .layout-margin .offset-md-15,
+  .offset-md-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-md-15,
+  [dir='rtl'] .layout-margin .flex-offset-md-15,
+  [dir='rtl'] .layout-margin .offset-md-15,
+  [dir='rtl'] .offset-md-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-md-20,
+  .layout-margin .flex-offset-md-20,
+  .layout-margin .offset-md-20,
+  .offset-md-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-md-20,
+  [dir='rtl'] .layout-margin .flex-offset-md-20,
+  [dir='rtl'] .layout-margin .offset-md-20,
+  [dir='rtl'] .offset-md-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-md-25,
+  .layout-margin .flex-offset-md-25,
+  .layout-margin .offset-md-25,
+  .offset-md-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-md-25,
+  [dir='rtl'] .layout-margin .flex-offset-md-25,
+  [dir='rtl'] .layout-margin .offset-md-25,
+  [dir='rtl'] .offset-md-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-md-30,
+  .layout-margin .flex-offset-md-30,
+  .layout-margin .offset-md-30,
+  .offset-md-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-md-30,
+  [dir='rtl'] .layout-margin .flex-offset-md-30,
+  [dir='rtl'] .layout-margin .offset-md-30,
+  [dir='rtl'] .offset-md-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-md-35,
+  .layout-margin .flex-offset-md-35,
+  .layout-margin .offset-md-35,
+  .offset-md-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-md-35,
+  [dir='rtl'] .layout-margin .flex-offset-md-35,
+  [dir='rtl'] .layout-margin .offset-md-35,
+  [dir='rtl'] .offset-md-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-md-40,
+  .layout-margin .flex-offset-md-40,
+  .layout-margin .offset-md-40,
+  .offset-md-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-md-40,
+  [dir='rtl'] .layout-margin .flex-offset-md-40,
+  [dir='rtl'] .layout-margin .offset-md-40,
+  [dir='rtl'] .offset-md-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-md-45,
+  .layout-margin .flex-offset-md-45,
+  .layout-margin .offset-md-45,
+  .offset-md-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-md-45,
+  [dir='rtl'] .layout-margin .flex-offset-md-45,
+  [dir='rtl'] .layout-margin .offset-md-45,
+  [dir='rtl'] .offset-md-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-md-50,
+  .layout-margin .flex-offset-md-50,
+  .layout-margin .offset-md-50,
+  .offset-md-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-md-50,
+  [dir='rtl'] .layout-margin .flex-offset-md-50,
+  [dir='rtl'] .layout-margin .offset-md-50,
+  [dir='rtl'] .offset-md-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-md-55,
+  .layout-margin .flex-offset-md-55,
+  .layout-margin .offset-md-55,
+  .offset-md-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-md-55,
+  [dir='rtl'] .layout-margin .flex-offset-md-55,
+  [dir='rtl'] .layout-margin .offset-md-55,
+  [dir='rtl'] .offset-md-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-md-60,
+  .layout-margin .flex-offset-md-60,
+  .layout-margin .offset-md-60,
+  .offset-md-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-md-60,
+  [dir='rtl'] .layout-margin .flex-offset-md-60,
+  [dir='rtl'] .layout-margin .offset-md-60,
+  [dir='rtl'] .offset-md-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-md-65,
+  .layout-margin .flex-offset-md-65,
+  .layout-margin .offset-md-65,
+  .offset-md-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-md-65,
+  [dir='rtl'] .layout-margin .flex-offset-md-65,
+  [dir='rtl'] .layout-margin .offset-md-65,
+  [dir='rtl'] .offset-md-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-md-70,
+  .layout-margin .flex-offset-md-70,
+  .layout-margin .offset-md-70,
+  .offset-md-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-md-70,
+  [dir='rtl'] .layout-margin .flex-offset-md-70,
+  [dir='rtl'] .layout-margin .offset-md-70,
+  [dir='rtl'] .offset-md-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-md-75,
+  .layout-margin .flex-offset-md-75,
+  .layout-margin .offset-md-75,
+  .offset-md-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-md-75,
+  [dir='rtl'] .layout-margin .flex-offset-md-75,
+  [dir='rtl'] .layout-margin .offset-md-75,
+  [dir='rtl'] .offset-md-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-md-80,
+  .layout-margin .flex-offset-md-80,
+  .layout-margin .offset-md-80,
+  .offset-md-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-md-80,
+  [dir='rtl'] .layout-margin .flex-offset-md-80,
+  [dir='rtl'] .layout-margin .offset-md-80,
+  [dir='rtl'] .offset-md-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-md-85,
+  .layout-margin .flex-offset-md-85,
+  .layout-margin .offset-md-85,
+  .offset-md-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-md-85,
+  [dir='rtl'] .layout-margin .flex-offset-md-85,
+  [dir='rtl'] .layout-margin .offset-md-85,
+  [dir='rtl'] .offset-md-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-md-90,
+  .layout-margin .flex-offset-md-90,
+  .layout-margin .offset-md-90,
+  .offset-md-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-md-90,
+  [dir='rtl'] .layout-margin .flex-offset-md-90,
+  [dir='rtl'] .layout-margin .offset-md-90,
+  [dir='rtl'] .offset-md-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-md-95,
+  .layout-margin .flex-offset-md-95,
+  .layout-margin .offset-md-95,
+  .offset-md-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-md-95,
+  [dir='rtl'] .layout-margin .flex-offset-md-95,
+  [dir='rtl'] .layout-margin .offset-md-95,
+  [dir='rtl'] .offset-md-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-md-33,
+  .layout-margin .flex-offset-md-33,
+  .layout-margin .offset-md-33,
+  .offset-md-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-md-66,
+  .layout-margin .flex-offset-md-66,
+  .layout-margin .offset-md-66,
+  .offset-md-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-md-66,
+  [dir='rtl'] .layout-margin .flex-offset-md-66,
+  [dir='rtl'] .layout-margin .offset-md-66,
+  [dir='rtl'] .offset-md-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-md,
+  .layout-align-md-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-md-start,
+  .layout-align-md-start-center,
+  .layout-align-md-start-end,
+  .layout-align-md-start-start,
+  .layout-align-md-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-md-center,
+  .layout-align-md-center-center,
+  .layout-align-md-center-end,
+  .layout-align-md-center-start,
+  .layout-align-md-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-md-end,
+  .layout-align-md-end-center,
+  .layout-align-md-end-end,
+  .layout-align-md-end-start,
+  .layout-align-md-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-md-space-around,
+  .layout-align-md-space-around-center,
+  .layout-align-md-space-around-end,
+  .layout-align-md-space-around-start,
+  .layout-align-md-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-md-space-between,
+  .layout-align-md-space-between-center,
+  .layout-align-md-space-between-end,
+  .layout-align-md-space-between-start,
+  .layout-align-md-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-md-center-start,
+  .layout-align-md-end-start,
+  .layout-align-md-space-around-start,
+  .layout-align-md-space-between-start,
+  .layout-align-md-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-md-center-center,
+  .layout-align-md-end-center,
+  .layout-align-md-space-around-center,
+  .layout-align-md-space-between-center,
+  .layout-align-md-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-md-center-center > *,
+  .layout-align-md-end-center > *,
+  .layout-align-md-space-around-center > *,
+  .layout-align-md-space-between-center > *,
+  .layout-align-md-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-md-center-end,
+  .layout-align-md-end-end,
+  .layout-align-md-space-around-end,
+  .layout-align-md-space-between-end,
+  .layout-align-md-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-md-center-stretch,
+  .layout-align-md-end-stretch,
+  .layout-align-md-space-around-stretch,
+  .layout-align-md-space-between-stretch,
+  .layout-align-md-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-md {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-md-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-md-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-md-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-md-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-md-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-md-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-md-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-md-column > .flex-md-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-md-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-md-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex-md-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-md-row > .flex {
+    min-width: 0;
+  }
+  .layout-md-column > .flex-md-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex-md-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-md-column > .flex {
+    min-height: 0;
+  }
+  .layout-md,
+  .layout-md-column,
+  .layout-md-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-md-column {
+    flex-direction: column;
+  }
+  .layout-md-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 1280px) {
+  .flex-order-gt-md--20 {
+    order: -20;
+  }
+  .flex-order-gt-md--19 {
+    order: -19;
+  }
+  .flex-order-gt-md--18 {
+    order: -18;
+  }
+  .flex-order-gt-md--17 {
+    order: -17;
+  }
+  .flex-order-gt-md--16 {
+    order: -16;
+  }
+  .flex-order-gt-md--15 {
+    order: -15;
+  }
+  .flex-order-gt-md--14 {
+    order: -14;
+  }
+  .flex-order-gt-md--13 {
+    order: -13;
+  }
+  .flex-order-gt-md--12 {
+    order: -12;
+  }
+  .flex-order-gt-md--11 {
+    order: -11;
+  }
+  .flex-order-gt-md--10 {
+    order: -10;
+  }
+  .flex-order-gt-md--9 {
+    order: -9;
+  }
+  .flex-order-gt-md--8 {
+    order: -8;
+  }
+  .flex-order-gt-md--7 {
+    order: -7;
+  }
+  .flex-order-gt-md--6 {
+    order: -6;
+  }
+  .flex-order-gt-md--5 {
+    order: -5;
+  }
+  .flex-order-gt-md--4 {
+    order: -4;
+  }
+  .flex-order-gt-md--3 {
+    order: -3;
+  }
+  .flex-order-gt-md--2 {
+    order: -2;
+  }
+  .flex-order-gt-md--1 {
+    order: -1;
+  }
+  .flex-order-gt-md-0 {
+    order: 0;
+  }
+  .flex-order-gt-md-1 {
+    order: 1;
+  }
+  .flex-order-gt-md-2 {
+    order: 2;
+  }
+  .flex-order-gt-md-3 {
+    order: 3;
+  }
+  .flex-order-gt-md-4 {
+    order: 4;
+  }
+  .flex-order-gt-md-5 {
+    order: 5;
+  }
+  .flex-order-gt-md-6 {
+    order: 6;
+  }
+  .flex-order-gt-md-7 {
+    order: 7;
+  }
+  .flex-order-gt-md-8 {
+    order: 8;
+  }
+  .flex-order-gt-md-9 {
+    order: 9;
+  }
+  .flex-order-gt-md-10 {
+    order: 10;
+  }
+  .flex-order-gt-md-11 {
+    order: 11;
+  }
+  .flex-order-gt-md-12 {
+    order: 12;
+  }
+  .flex-order-gt-md-13 {
+    order: 13;
+  }
+  .flex-order-gt-md-14 {
+    order: 14;
+  }
+  .flex-order-gt-md-15 {
+    order: 15;
+  }
+  .flex-order-gt-md-16 {
+    order: 16;
+  }
+  .flex-order-gt-md-17 {
+    order: 17;
+  }
+  .flex-order-gt-md-18 {
+    order: 18;
+  }
+  .flex-order-gt-md-19 {
+    order: 19;
+  }
+  .flex-order-gt-md-20 {
+    order: 20;
+  }
+  .flex-offset-gt-md-0,
+  .layout-margin .flex-offset-gt-md-0,
+  .layout-margin .offset-gt-md-0,
+  .offset-gt-md-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-gt-md-0,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-0,
+  [dir='rtl'] .layout-margin .offset-gt-md-0,
+  [dir='rtl'] .offset-gt-md-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-gt-md-5,
+  .layout-margin .flex-offset-gt-md-5,
+  .layout-margin .offset-gt-md-5,
+  .offset-gt-md-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-5,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-5,
+  [dir='rtl'] .layout-margin .offset-gt-md-5,
+  [dir='rtl'] .offset-gt-md-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-gt-md-10,
+  .layout-margin .flex-offset-gt-md-10,
+  .layout-margin .offset-gt-md-10,
+  .offset-gt-md-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-10,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-10,
+  [dir='rtl'] .layout-margin .offset-gt-md-10,
+  [dir='rtl'] .offset-gt-md-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-gt-md-15,
+  .layout-margin .flex-offset-gt-md-15,
+  .layout-margin .offset-gt-md-15,
+  .offset-gt-md-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-15,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-15,
+  [dir='rtl'] .layout-margin .offset-gt-md-15,
+  [dir='rtl'] .offset-gt-md-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-gt-md-20,
+  .layout-margin .flex-offset-gt-md-20,
+  .layout-margin .offset-gt-md-20,
+  .offset-gt-md-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-20,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-20,
+  [dir='rtl'] .layout-margin .offset-gt-md-20,
+  [dir='rtl'] .offset-gt-md-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-gt-md-25,
+  .layout-margin .flex-offset-gt-md-25,
+  .layout-margin .offset-gt-md-25,
+  .offset-gt-md-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-25,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-25,
+  [dir='rtl'] .layout-margin .offset-gt-md-25,
+  [dir='rtl'] .offset-gt-md-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-gt-md-30,
+  .layout-margin .flex-offset-gt-md-30,
+  .layout-margin .offset-gt-md-30,
+  .offset-gt-md-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-30,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-30,
+  [dir='rtl'] .layout-margin .offset-gt-md-30,
+  [dir='rtl'] .offset-gt-md-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-gt-md-35,
+  .layout-margin .flex-offset-gt-md-35,
+  .layout-margin .offset-gt-md-35,
+  .offset-gt-md-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-35,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-35,
+  [dir='rtl'] .layout-margin .offset-gt-md-35,
+  [dir='rtl'] .offset-gt-md-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-gt-md-40,
+  .layout-margin .flex-offset-gt-md-40,
+  .layout-margin .offset-gt-md-40,
+  .offset-gt-md-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-40,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-40,
+  [dir='rtl'] .layout-margin .offset-gt-md-40,
+  [dir='rtl'] .offset-gt-md-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-gt-md-45,
+  .layout-margin .flex-offset-gt-md-45,
+  .layout-margin .offset-gt-md-45,
+  .offset-gt-md-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-45,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-45,
+  [dir='rtl'] .layout-margin .offset-gt-md-45,
+  [dir='rtl'] .offset-gt-md-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-gt-md-50,
+  .layout-margin .flex-offset-gt-md-50,
+  .layout-margin .offset-gt-md-50,
+  .offset-gt-md-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-50,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-50,
+  [dir='rtl'] .layout-margin .offset-gt-md-50,
+  [dir='rtl'] .offset-gt-md-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-gt-md-55,
+  .layout-margin .flex-offset-gt-md-55,
+  .layout-margin .offset-gt-md-55,
+  .offset-gt-md-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-55,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-55,
+  [dir='rtl'] .layout-margin .offset-gt-md-55,
+  [dir='rtl'] .offset-gt-md-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-gt-md-60,
+  .layout-margin .flex-offset-gt-md-60,
+  .layout-margin .offset-gt-md-60,
+  .offset-gt-md-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-60,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-60,
+  [dir='rtl'] .layout-margin .offset-gt-md-60,
+  [dir='rtl'] .offset-gt-md-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-gt-md-65,
+  .layout-margin .flex-offset-gt-md-65,
+  .layout-margin .offset-gt-md-65,
+  .offset-gt-md-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-65,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-65,
+  [dir='rtl'] .layout-margin .offset-gt-md-65,
+  [dir='rtl'] .offset-gt-md-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-gt-md-70,
+  .layout-margin .flex-offset-gt-md-70,
+  .layout-margin .offset-gt-md-70,
+  .offset-gt-md-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-70,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-70,
+  [dir='rtl'] .layout-margin .offset-gt-md-70,
+  [dir='rtl'] .offset-gt-md-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-gt-md-75,
+  .layout-margin .flex-offset-gt-md-75,
+  .layout-margin .offset-gt-md-75,
+  .offset-gt-md-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-75,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-75,
+  [dir='rtl'] .layout-margin .offset-gt-md-75,
+  [dir='rtl'] .offset-gt-md-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-gt-md-80,
+  .layout-margin .flex-offset-gt-md-80,
+  .layout-margin .offset-gt-md-80,
+  .offset-gt-md-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-80,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-80,
+  [dir='rtl'] .layout-margin .offset-gt-md-80,
+  [dir='rtl'] .offset-gt-md-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-gt-md-85,
+  .layout-margin .flex-offset-gt-md-85,
+  .layout-margin .offset-gt-md-85,
+  .offset-gt-md-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-85,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-85,
+  [dir='rtl'] .layout-margin .offset-gt-md-85,
+  [dir='rtl'] .offset-gt-md-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-gt-md-90,
+  .layout-margin .flex-offset-gt-md-90,
+  .layout-margin .offset-gt-md-90,
+  .offset-gt-md-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-90,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-90,
+  [dir='rtl'] .layout-margin .offset-gt-md-90,
+  [dir='rtl'] .offset-gt-md-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-gt-md-95,
+  .layout-margin .flex-offset-gt-md-95,
+  .layout-margin .offset-gt-md-95,
+  .offset-gt-md-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-95,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-95,
+  [dir='rtl'] .layout-margin .offset-gt-md-95,
+  [dir='rtl'] .offset-gt-md-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-gt-md-33,
+  .layout-margin .flex-offset-gt-md-33,
+  .layout-margin .offset-gt-md-33,
+  .offset-gt-md-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-gt-md-66,
+  .layout-margin .flex-offset-gt-md-66,
+  .layout-margin .offset-gt-md-66,
+  .offset-gt-md-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-gt-md-66,
+  [dir='rtl'] .layout-margin .flex-offset-gt-md-66,
+  [dir='rtl'] .layout-margin .offset-gt-md-66,
+  [dir='rtl'] .offset-gt-md-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-gt-md,
+  .layout-align-gt-md-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-gt-md-start,
+  .layout-align-gt-md-start-center,
+  .layout-align-gt-md-start-end,
+  .layout-align-gt-md-start-start,
+  .layout-align-gt-md-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-gt-md-center,
+  .layout-align-gt-md-center-center,
+  .layout-align-gt-md-center-end,
+  .layout-align-gt-md-center-start,
+  .layout-align-gt-md-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-gt-md-end,
+  .layout-align-gt-md-end-center,
+  .layout-align-gt-md-end-end,
+  .layout-align-gt-md-end-start,
+  .layout-align-gt-md-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-gt-md-space-around,
+  .layout-align-gt-md-space-around-center,
+  .layout-align-gt-md-space-around-end,
+  .layout-align-gt-md-space-around-start,
+  .layout-align-gt-md-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-gt-md-space-between,
+  .layout-align-gt-md-space-between-center,
+  .layout-align-gt-md-space-between-end,
+  .layout-align-gt-md-space-between-start,
+  .layout-align-gt-md-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-gt-md-center-start,
+  .layout-align-gt-md-end-start,
+  .layout-align-gt-md-space-around-start,
+  .layout-align-gt-md-space-between-start,
+  .layout-align-gt-md-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-gt-md-center-center,
+  .layout-align-gt-md-end-center,
+  .layout-align-gt-md-space-around-center,
+  .layout-align-gt-md-space-between-center,
+  .layout-align-gt-md-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-gt-md-center-center > *,
+  .layout-align-gt-md-end-center > *,
+  .layout-align-gt-md-space-around-center > *,
+  .layout-align-gt-md-space-between-center > *,
+  .layout-align-gt-md-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-gt-md-center-end,
+  .layout-align-gt-md-end-end,
+  .layout-align-gt-md-space-around-end,
+  .layout-align-gt-md-space-between-end,
+  .layout-align-gt-md-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-gt-md-center-stretch,
+  .layout-align-gt-md-end-stretch,
+  .layout-align-gt-md-space-around-stretch,
+  .layout-align-gt-md-space-between-stretch,
+  .layout-align-gt-md-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-gt-md {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-gt-md-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-gt-md-column > .flex-gt-md-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-gt-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-gt-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-md-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-md-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex-gt-md-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-row > .flex {
+    min-width: 0;
+  }
+  .layout-gt-md-column > .flex-gt-md-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex-gt-md-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-md-column > .flex {
+    min-height: 0;
+  }
+  .layout-gt-md,
+  .layout-gt-md-column,
+  .layout-gt-md-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-gt-md-column {
+    flex-direction: column;
+  }
+  .layout-gt-md-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 1280px) and (max-width: 1919px) {
+  .hide-gt-md:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-lg):not(.show),
+  .hide-gt-sm:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-lg):not(.show),
+  .hide-gt-xs:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-lg):not(.show),
+  .hide:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-lg):not(.show) {
+    display: none;
+  }
+  .hide-lg:not(.show-lg):not(.show-gt-md):not(.show-gt-sm):not(.show-gt-xs):not(.show) {
+    display: none;
+  }
+  .flex-order-lg--20 {
+    order: -20;
+  }
+  .flex-order-lg--19 {
+    order: -19;
+  }
+  .flex-order-lg--18 {
+    order: -18;
+  }
+  .flex-order-lg--17 {
+    order: -17;
+  }
+  .flex-order-lg--16 {
+    order: -16;
+  }
+  .flex-order-lg--15 {
+    order: -15;
+  }
+  .flex-order-lg--14 {
+    order: -14;
+  }
+  .flex-order-lg--13 {
+    order: -13;
+  }
+  .flex-order-lg--12 {
+    order: -12;
+  }
+  .flex-order-lg--11 {
+    order: -11;
+  }
+  .flex-order-lg--10 {
+    order: -10;
+  }
+  .flex-order-lg--9 {
+    order: -9;
+  }
+  .flex-order-lg--8 {
+    order: -8;
+  }
+  .flex-order-lg--7 {
+    order: -7;
+  }
+  .flex-order-lg--6 {
+    order: -6;
+  }
+  .flex-order-lg--5 {
+    order: -5;
+  }
+  .flex-order-lg--4 {
+    order: -4;
+  }
+  .flex-order-lg--3 {
+    order: -3;
+  }
+  .flex-order-lg--2 {
+    order: -2;
+  }
+  .flex-order-lg--1 {
+    order: -1;
+  }
+  .flex-order-lg-0 {
+    order: 0;
+  }
+  .flex-order-lg-1 {
+    order: 1;
+  }
+  .flex-order-lg-2 {
+    order: 2;
+  }
+  .flex-order-lg-3 {
+    order: 3;
+  }
+  .flex-order-lg-4 {
+    order: 4;
+  }
+  .flex-order-lg-5 {
+    order: 5;
+  }
+  .flex-order-lg-6 {
+    order: 6;
+  }
+  .flex-order-lg-7 {
+    order: 7;
+  }
+  .flex-order-lg-8 {
+    order: 8;
+  }
+  .flex-order-lg-9 {
+    order: 9;
+  }
+  .flex-order-lg-10 {
+    order: 10;
+  }
+  .flex-order-lg-11 {
+    order: 11;
+  }
+  .flex-order-lg-12 {
+    order: 12;
+  }
+  .flex-order-lg-13 {
+    order: 13;
+  }
+  .flex-order-lg-14 {
+    order: 14;
+  }
+  .flex-order-lg-15 {
+    order: 15;
+  }
+  .flex-order-lg-16 {
+    order: 16;
+  }
+  .flex-order-lg-17 {
+    order: 17;
+  }
+  .flex-order-lg-18 {
+    order: 18;
+  }
+  .flex-order-lg-19 {
+    order: 19;
+  }
+  .flex-order-lg-20 {
+    order: 20;
+  }
+  .flex-offset-lg-0,
+  .layout-margin .flex-offset-lg-0,
+  .layout-margin .offset-lg-0,
+  .offset-lg-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-lg-0,
+  [dir='rtl'] .layout-margin .flex-offset-lg-0,
+  [dir='rtl'] .layout-margin .offset-lg-0,
+  [dir='rtl'] .offset-lg-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-lg-5,
+  .layout-margin .flex-offset-lg-5,
+  .layout-margin .offset-lg-5,
+  .offset-lg-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-lg-5,
+  [dir='rtl'] .layout-margin .flex-offset-lg-5,
+  [dir='rtl'] .layout-margin .offset-lg-5,
+  [dir='rtl'] .offset-lg-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-lg-10,
+  .layout-margin .flex-offset-lg-10,
+  .layout-margin .offset-lg-10,
+  .offset-lg-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-lg-10,
+  [dir='rtl'] .layout-margin .flex-offset-lg-10,
+  [dir='rtl'] .layout-margin .offset-lg-10,
+  [dir='rtl'] .offset-lg-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-lg-15,
+  .layout-margin .flex-offset-lg-15,
+  .layout-margin .offset-lg-15,
+  .offset-lg-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-lg-15,
+  [dir='rtl'] .layout-margin .flex-offset-lg-15,
+  [dir='rtl'] .layout-margin .offset-lg-15,
+  [dir='rtl'] .offset-lg-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-lg-20,
+  .layout-margin .flex-offset-lg-20,
+  .layout-margin .offset-lg-20,
+  .offset-lg-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-lg-20,
+  [dir='rtl'] .layout-margin .flex-offset-lg-20,
+  [dir='rtl'] .layout-margin .offset-lg-20,
+  [dir='rtl'] .offset-lg-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-lg-25,
+  .layout-margin .flex-offset-lg-25,
+  .layout-margin .offset-lg-25,
+  .offset-lg-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-lg-25,
+  [dir='rtl'] .layout-margin .flex-offset-lg-25,
+  [dir='rtl'] .layout-margin .offset-lg-25,
+  [dir='rtl'] .offset-lg-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-lg-30,
+  .layout-margin .flex-offset-lg-30,
+  .layout-margin .offset-lg-30,
+  .offset-lg-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-lg-30,
+  [dir='rtl'] .layout-margin .flex-offset-lg-30,
+  [dir='rtl'] .layout-margin .offset-lg-30,
+  [dir='rtl'] .offset-lg-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-lg-35,
+  .layout-margin .flex-offset-lg-35,
+  .layout-margin .offset-lg-35,
+  .offset-lg-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-lg-35,
+  [dir='rtl'] .layout-margin .flex-offset-lg-35,
+  [dir='rtl'] .layout-margin .offset-lg-35,
+  [dir='rtl'] .offset-lg-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-lg-40,
+  .layout-margin .flex-offset-lg-40,
+  .layout-margin .offset-lg-40,
+  .offset-lg-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-lg-40,
+  [dir='rtl'] .layout-margin .flex-offset-lg-40,
+  [dir='rtl'] .layout-margin .offset-lg-40,
+  [dir='rtl'] .offset-lg-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-lg-45,
+  .layout-margin .flex-offset-lg-45,
+  .layout-margin .offset-lg-45,
+  .offset-lg-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-lg-45,
+  [dir='rtl'] .layout-margin .flex-offset-lg-45,
+  [dir='rtl'] .layout-margin .offset-lg-45,
+  [dir='rtl'] .offset-lg-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-lg-50,
+  .layout-margin .flex-offset-lg-50,
+  .layout-margin .offset-lg-50,
+  .offset-lg-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-lg-50,
+  [dir='rtl'] .layout-margin .flex-offset-lg-50,
+  [dir='rtl'] .layout-margin .offset-lg-50,
+  [dir='rtl'] .offset-lg-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-lg-55,
+  .layout-margin .flex-offset-lg-55,
+  .layout-margin .offset-lg-55,
+  .offset-lg-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-lg-55,
+  [dir='rtl'] .layout-margin .flex-offset-lg-55,
+  [dir='rtl'] .layout-margin .offset-lg-55,
+  [dir='rtl'] .offset-lg-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-lg-60,
+  .layout-margin .flex-offset-lg-60,
+  .layout-margin .offset-lg-60,
+  .offset-lg-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-lg-60,
+  [dir='rtl'] .layout-margin .flex-offset-lg-60,
+  [dir='rtl'] .layout-margin .offset-lg-60,
+  [dir='rtl'] .offset-lg-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-lg-65,
+  .layout-margin .flex-offset-lg-65,
+  .layout-margin .offset-lg-65,
+  .offset-lg-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-lg-65,
+  [dir='rtl'] .layout-margin .flex-offset-lg-65,
+  [dir='rtl'] .layout-margin .offset-lg-65,
+  [dir='rtl'] .offset-lg-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-lg-70,
+  .layout-margin .flex-offset-lg-70,
+  .layout-margin .offset-lg-70,
+  .offset-lg-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-lg-70,
+  [dir='rtl'] .layout-margin .flex-offset-lg-70,
+  [dir='rtl'] .layout-margin .offset-lg-70,
+  [dir='rtl'] .offset-lg-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-lg-75,
+  .layout-margin .flex-offset-lg-75,
+  .layout-margin .offset-lg-75,
+  .offset-lg-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-lg-75,
+  [dir='rtl'] .layout-margin .flex-offset-lg-75,
+  [dir='rtl'] .layout-margin .offset-lg-75,
+  [dir='rtl'] .offset-lg-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-lg-80,
+  .layout-margin .flex-offset-lg-80,
+  .layout-margin .offset-lg-80,
+  .offset-lg-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-lg-80,
+  [dir='rtl'] .layout-margin .flex-offset-lg-80,
+  [dir='rtl'] .layout-margin .offset-lg-80,
+  [dir='rtl'] .offset-lg-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-lg-85,
+  .layout-margin .flex-offset-lg-85,
+  .layout-margin .offset-lg-85,
+  .offset-lg-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-lg-85,
+  [dir='rtl'] .layout-margin .flex-offset-lg-85,
+  [dir='rtl'] .layout-margin .offset-lg-85,
+  [dir='rtl'] .offset-lg-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-lg-90,
+  .layout-margin .flex-offset-lg-90,
+  .layout-margin .offset-lg-90,
+  .offset-lg-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-lg-90,
+  [dir='rtl'] .layout-margin .flex-offset-lg-90,
+  [dir='rtl'] .layout-margin .offset-lg-90,
+  [dir='rtl'] .offset-lg-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-lg-95,
+  .layout-margin .flex-offset-lg-95,
+  .layout-margin .offset-lg-95,
+  .offset-lg-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-lg-95,
+  [dir='rtl'] .layout-margin .flex-offset-lg-95,
+  [dir='rtl'] .layout-margin .offset-lg-95,
+  [dir='rtl'] .offset-lg-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-lg-33,
+  .layout-margin .flex-offset-lg-33,
+  .layout-margin .offset-lg-33,
+  .offset-lg-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-lg-66,
+  .layout-margin .flex-offset-lg-66,
+  .layout-margin .offset-lg-66,
+  .offset-lg-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-lg-66,
+  [dir='rtl'] .layout-margin .flex-offset-lg-66,
+  [dir='rtl'] .layout-margin .offset-lg-66,
+  [dir='rtl'] .offset-lg-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-lg,
+  .layout-align-lg-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-lg-start,
+  .layout-align-lg-start-center,
+  .layout-align-lg-start-end,
+  .layout-align-lg-start-start,
+  .layout-align-lg-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-lg-center,
+  .layout-align-lg-center-center,
+  .layout-align-lg-center-end,
+  .layout-align-lg-center-start,
+  .layout-align-lg-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-lg-end,
+  .layout-align-lg-end-center,
+  .layout-align-lg-end-end,
+  .layout-align-lg-end-start,
+  .layout-align-lg-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-lg-space-around,
+  .layout-align-lg-space-around-center,
+  .layout-align-lg-space-around-end,
+  .layout-align-lg-space-around-start,
+  .layout-align-lg-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-lg-space-between,
+  .layout-align-lg-space-between-center,
+  .layout-align-lg-space-between-end,
+  .layout-align-lg-space-between-start,
+  .layout-align-lg-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-lg-center-start,
+  .layout-align-lg-end-start,
+  .layout-align-lg-space-around-start,
+  .layout-align-lg-space-between-start,
+  .layout-align-lg-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-lg-center-center,
+  .layout-align-lg-end-center,
+  .layout-align-lg-space-around-center,
+  .layout-align-lg-space-between-center,
+  .layout-align-lg-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-lg-center-center > *,
+  .layout-align-lg-end-center > *,
+  .layout-align-lg-space-around-center > *,
+  .layout-align-lg-space-between-center > *,
+  .layout-align-lg-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-lg-center-end,
+  .layout-align-lg-end-end,
+  .layout-align-lg-space-around-end,
+  .layout-align-lg-space-between-end,
+  .layout-align-lg-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-lg-center-stretch,
+  .layout-align-lg-end-stretch,
+  .layout-align-lg-space-around-stretch,
+  .layout-align-lg-space-between-stretch,
+  .layout-align-lg-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-lg {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-lg-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-lg-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-lg-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-lg-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-lg-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-lg-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-lg-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-lg-column > .flex-lg-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-lg-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-lg-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex-lg-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-lg-row > .flex {
+    min-width: 0;
+  }
+  .layout-lg-column > .flex-lg-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex-lg-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-lg-column > .flex {
+    min-height: 0;
+  }
+  .layout-lg,
+  .layout-lg-column,
+  .layout-lg-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-lg-column {
+    flex-direction: column;
+  }
+  .layout-lg-row {
+    flex-direction: row;
+  }
+}
+@media (min-width: 1920px) {
+  .flex-order-gt-lg--20 {
+    order: -20;
+  }
+  .flex-order-gt-lg--19 {
+    order: -19;
+  }
+  .flex-order-gt-lg--18 {
+    order: -18;
+  }
+  .flex-order-gt-lg--17 {
+    order: -17;
+  }
+  .flex-order-gt-lg--16 {
+    order: -16;
+  }
+  .flex-order-gt-lg--15 {
+    order: -15;
+  }
+  .flex-order-gt-lg--14 {
+    order: -14;
+  }
+  .flex-order-gt-lg--13 {
+    order: -13;
+  }
+  .flex-order-gt-lg--12 {
+    order: -12;
+  }
+  .flex-order-gt-lg--11 {
+    order: -11;
+  }
+  .flex-order-gt-lg--10 {
+    order: -10;
+  }
+  .flex-order-gt-lg--9 {
+    order: -9;
+  }
+  .flex-order-gt-lg--8 {
+    order: -8;
+  }
+  .flex-order-gt-lg--7 {
+    order: -7;
+  }
+  .flex-order-gt-lg--6 {
+    order: -6;
+  }
+  .flex-order-gt-lg--5 {
+    order: -5;
+  }
+  .flex-order-gt-lg--4 {
+    order: -4;
+  }
+  .flex-order-gt-lg--3 {
+    order: -3;
+  }
+  .flex-order-gt-lg--2 {
+    order: -2;
+  }
+  .flex-order-gt-lg--1 {
+    order: -1;
+  }
+  .flex-order-gt-lg-0 {
+    order: 0;
+  }
+  .flex-order-gt-lg-1 {
+    order: 1;
+  }
+  .flex-order-gt-lg-2 {
+    order: 2;
+  }
+  .flex-order-gt-lg-3 {
+    order: 3;
+  }
+  .flex-order-gt-lg-4 {
+    order: 4;
+  }
+  .flex-order-gt-lg-5 {
+    order: 5;
+  }
+  .flex-order-gt-lg-6 {
+    order: 6;
+  }
+  .flex-order-gt-lg-7 {
+    order: 7;
+  }
+  .flex-order-gt-lg-8 {
+    order: 8;
+  }
+  .flex-order-gt-lg-9 {
+    order: 9;
+  }
+  .flex-order-gt-lg-10 {
+    order: 10;
+  }
+  .flex-order-gt-lg-11 {
+    order: 11;
+  }
+  .flex-order-gt-lg-12 {
+    order: 12;
+  }
+  .flex-order-gt-lg-13 {
+    order: 13;
+  }
+  .flex-order-gt-lg-14 {
+    order: 14;
+  }
+  .flex-order-gt-lg-15 {
+    order: 15;
+  }
+  .flex-order-gt-lg-16 {
+    order: 16;
+  }
+  .flex-order-gt-lg-17 {
+    order: 17;
+  }
+  .flex-order-gt-lg-18 {
+    order: 18;
+  }
+  .flex-order-gt-lg-19 {
+    order: 19;
+  }
+  .flex-order-gt-lg-20 {
+    order: 20;
+  }
+  .flex-offset-gt-lg-0,
+  .layout-margin .flex-offset-gt-lg-0,
+  .layout-margin .offset-gt-lg-0,
+  .offset-gt-lg-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-0,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-0,
+  [dir='rtl'] .layout-margin .offset-gt-lg-0,
+  [dir='rtl'] .offset-gt-lg-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-gt-lg-5,
+  .layout-margin .flex-offset-gt-lg-5,
+  .layout-margin .offset-gt-lg-5,
+  .offset-gt-lg-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-5,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-5,
+  [dir='rtl'] .layout-margin .offset-gt-lg-5,
+  [dir='rtl'] .offset-gt-lg-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-gt-lg-10,
+  .layout-margin .flex-offset-gt-lg-10,
+  .layout-margin .offset-gt-lg-10,
+  .offset-gt-lg-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-10,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-10,
+  [dir='rtl'] .layout-margin .offset-gt-lg-10,
+  [dir='rtl'] .offset-gt-lg-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-gt-lg-15,
+  .layout-margin .flex-offset-gt-lg-15,
+  .layout-margin .offset-gt-lg-15,
+  .offset-gt-lg-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-15,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-15,
+  [dir='rtl'] .layout-margin .offset-gt-lg-15,
+  [dir='rtl'] .offset-gt-lg-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-gt-lg-20,
+  .layout-margin .flex-offset-gt-lg-20,
+  .layout-margin .offset-gt-lg-20,
+  .offset-gt-lg-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-20,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-20,
+  [dir='rtl'] .layout-margin .offset-gt-lg-20,
+  [dir='rtl'] .offset-gt-lg-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-gt-lg-25,
+  .layout-margin .flex-offset-gt-lg-25,
+  .layout-margin .offset-gt-lg-25,
+  .offset-gt-lg-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-25,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-25,
+  [dir='rtl'] .layout-margin .offset-gt-lg-25,
+  [dir='rtl'] .offset-gt-lg-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-gt-lg-30,
+  .layout-margin .flex-offset-gt-lg-30,
+  .layout-margin .offset-gt-lg-30,
+  .offset-gt-lg-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-30,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-30,
+  [dir='rtl'] .layout-margin .offset-gt-lg-30,
+  [dir='rtl'] .offset-gt-lg-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-gt-lg-35,
+  .layout-margin .flex-offset-gt-lg-35,
+  .layout-margin .offset-gt-lg-35,
+  .offset-gt-lg-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-35,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-35,
+  [dir='rtl'] .layout-margin .offset-gt-lg-35,
+  [dir='rtl'] .offset-gt-lg-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-gt-lg-40,
+  .layout-margin .flex-offset-gt-lg-40,
+  .layout-margin .offset-gt-lg-40,
+  .offset-gt-lg-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-40,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-40,
+  [dir='rtl'] .layout-margin .offset-gt-lg-40,
+  [dir='rtl'] .offset-gt-lg-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-gt-lg-45,
+  .layout-margin .flex-offset-gt-lg-45,
+  .layout-margin .offset-gt-lg-45,
+  .offset-gt-lg-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-45,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-45,
+  [dir='rtl'] .layout-margin .offset-gt-lg-45,
+  [dir='rtl'] .offset-gt-lg-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-gt-lg-50,
+  .layout-margin .flex-offset-gt-lg-50,
+  .layout-margin .offset-gt-lg-50,
+  .offset-gt-lg-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-50,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-50,
+  [dir='rtl'] .layout-margin .offset-gt-lg-50,
+  [dir='rtl'] .offset-gt-lg-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-gt-lg-55,
+  .layout-margin .flex-offset-gt-lg-55,
+  .layout-margin .offset-gt-lg-55,
+  .offset-gt-lg-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-55,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-55,
+  [dir='rtl'] .layout-margin .offset-gt-lg-55,
+  [dir='rtl'] .offset-gt-lg-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-gt-lg-60,
+  .layout-margin .flex-offset-gt-lg-60,
+  .layout-margin .offset-gt-lg-60,
+  .offset-gt-lg-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-60,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-60,
+  [dir='rtl'] .layout-margin .offset-gt-lg-60,
+  [dir='rtl'] .offset-gt-lg-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-gt-lg-65,
+  .layout-margin .flex-offset-gt-lg-65,
+  .layout-margin .offset-gt-lg-65,
+  .offset-gt-lg-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-65,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-65,
+  [dir='rtl'] .layout-margin .offset-gt-lg-65,
+  [dir='rtl'] .offset-gt-lg-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-gt-lg-70,
+  .layout-margin .flex-offset-gt-lg-70,
+  .layout-margin .offset-gt-lg-70,
+  .offset-gt-lg-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-70,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-70,
+  [dir='rtl'] .layout-margin .offset-gt-lg-70,
+  [dir='rtl'] .offset-gt-lg-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-gt-lg-75,
+  .layout-margin .flex-offset-gt-lg-75,
+  .layout-margin .offset-gt-lg-75,
+  .offset-gt-lg-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-75,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-75,
+  [dir='rtl'] .layout-margin .offset-gt-lg-75,
+  [dir='rtl'] .offset-gt-lg-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-gt-lg-80,
+  .layout-margin .flex-offset-gt-lg-80,
+  .layout-margin .offset-gt-lg-80,
+  .offset-gt-lg-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-80,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-80,
+  [dir='rtl'] .layout-margin .offset-gt-lg-80,
+  [dir='rtl'] .offset-gt-lg-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-gt-lg-85,
+  .layout-margin .flex-offset-gt-lg-85,
+  .layout-margin .offset-gt-lg-85,
+  .offset-gt-lg-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-85,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-85,
+  [dir='rtl'] .layout-margin .offset-gt-lg-85,
+  [dir='rtl'] .offset-gt-lg-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-gt-lg-90,
+  .layout-margin .flex-offset-gt-lg-90,
+  .layout-margin .offset-gt-lg-90,
+  .offset-gt-lg-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-90,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-90,
+  [dir='rtl'] .layout-margin .offset-gt-lg-90,
+  [dir='rtl'] .offset-gt-lg-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-gt-lg-95,
+  .layout-margin .flex-offset-gt-lg-95,
+  .layout-margin .offset-gt-lg-95,
+  .offset-gt-lg-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-95,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-95,
+  [dir='rtl'] .layout-margin .offset-gt-lg-95,
+  [dir='rtl'] .offset-gt-lg-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-gt-lg-33,
+  .layout-margin .flex-offset-gt-lg-33,
+  .layout-margin .offset-gt-lg-33,
+  .offset-gt-lg-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-gt-lg-66,
+  .layout-margin .flex-offset-gt-lg-66,
+  .layout-margin .offset-gt-lg-66,
+  .offset-gt-lg-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-gt-lg-66,
+  [dir='rtl'] .layout-margin .flex-offset-gt-lg-66,
+  [dir='rtl'] .layout-margin .offset-gt-lg-66,
+  [dir='rtl'] .offset-gt-lg-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-gt-lg,
+  .layout-align-gt-lg-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-gt-lg-start,
+  .layout-align-gt-lg-start-center,
+  .layout-align-gt-lg-start-end,
+  .layout-align-gt-lg-start-start,
+  .layout-align-gt-lg-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-gt-lg-center,
+  .layout-align-gt-lg-center-center,
+  .layout-align-gt-lg-center-end,
+  .layout-align-gt-lg-center-start,
+  .layout-align-gt-lg-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-gt-lg-end,
+  .layout-align-gt-lg-end-center,
+  .layout-align-gt-lg-end-end,
+  .layout-align-gt-lg-end-start,
+  .layout-align-gt-lg-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-gt-lg-space-around,
+  .layout-align-gt-lg-space-around-center,
+  .layout-align-gt-lg-space-around-end,
+  .layout-align-gt-lg-space-around-start,
+  .layout-align-gt-lg-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-gt-lg-space-between,
+  .layout-align-gt-lg-space-between-center,
+  .layout-align-gt-lg-space-between-end,
+  .layout-align-gt-lg-space-between-start,
+  .layout-align-gt-lg-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-gt-lg-center-start,
+  .layout-align-gt-lg-end-start,
+  .layout-align-gt-lg-space-around-start,
+  .layout-align-gt-lg-space-between-start,
+  .layout-align-gt-lg-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-gt-lg-center-center,
+  .layout-align-gt-lg-end-center,
+  .layout-align-gt-lg-space-around-center,
+  .layout-align-gt-lg-space-between-center,
+  .layout-align-gt-lg-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-gt-lg-center-center > *,
+  .layout-align-gt-lg-end-center > *,
+  .layout-align-gt-lg-space-around-center > *,
+  .layout-align-gt-lg-space-between-center > *,
+  .layout-align-gt-lg-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-gt-lg-center-end,
+  .layout-align-gt-lg-end-end,
+  .layout-align-gt-lg-space-around-end,
+  .layout-align-gt-lg-space-between-end,
+  .layout-align-gt-lg-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-gt-lg-center-stretch,
+  .layout-align-gt-lg-end-stretch,
+  .layout-align-gt-lg-space-around-stretch,
+  .layout-align-gt-lg-space-between-stretch,
+  .layout-align-gt-lg-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-gt-lg {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-gt-lg-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-gt-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-gt-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-gt-lg-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-gt-lg-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex-gt-lg-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-row > .flex {
+    min-width: 0;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex-gt-lg-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-gt-lg-column > .flex {
+    min-height: 0;
+  }
+  .layout-gt-lg,
+  .layout-gt-lg-column,
+  .layout-gt-lg-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-gt-lg-column {
+    flex-direction: column;
+  }
+  .layout-gt-lg-row {
+    flex-direction: row;
+  }
+  .flex-order-xl--20 {
+    order: -20;
+  }
+  .flex-order-xl--19 {
+    order: -19;
+  }
+  .flex-order-xl--18 {
+    order: -18;
+  }
+  .flex-order-xl--17 {
+    order: -17;
+  }
+  .flex-order-xl--16 {
+    order: -16;
+  }
+  .flex-order-xl--15 {
+    order: -15;
+  }
+  .flex-order-xl--14 {
+    order: -14;
+  }
+  .flex-order-xl--13 {
+    order: -13;
+  }
+  .flex-order-xl--12 {
+    order: -12;
+  }
+  .flex-order-xl--11 {
+    order: -11;
+  }
+  .flex-order-xl--10 {
+    order: -10;
+  }
+  .flex-order-xl--9 {
+    order: -9;
+  }
+  .flex-order-xl--8 {
+    order: -8;
+  }
+  .flex-order-xl--7 {
+    order: -7;
+  }
+  .flex-order-xl--6 {
+    order: -6;
+  }
+  .flex-order-xl--5 {
+    order: -5;
+  }
+  .flex-order-xl--4 {
+    order: -4;
+  }
+  .flex-order-xl--3 {
+    order: -3;
+  }
+  .flex-order-xl--2 {
+    order: -2;
+  }
+  .flex-order-xl--1 {
+    order: -1;
+  }
+  .flex-order-xl-0 {
+    order: 0;
+  }
+  .flex-order-xl-1 {
+    order: 1;
+  }
+  .flex-order-xl-2 {
+    order: 2;
+  }
+  .flex-order-xl-3 {
+    order: 3;
+  }
+  .flex-order-xl-4 {
+    order: 4;
+  }
+  .flex-order-xl-5 {
+    order: 5;
+  }
+  .flex-order-xl-6 {
+    order: 6;
+  }
+  .flex-order-xl-7 {
+    order: 7;
+  }
+  .flex-order-xl-8 {
+    order: 8;
+  }
+  .flex-order-xl-9 {
+    order: 9;
+  }
+  .flex-order-xl-10 {
+    order: 10;
+  }
+  .flex-order-xl-11 {
+    order: 11;
+  }
+  .flex-order-xl-12 {
+    order: 12;
+  }
+  .flex-order-xl-13 {
+    order: 13;
+  }
+  .flex-order-xl-14 {
+    order: 14;
+  }
+  .flex-order-xl-15 {
+    order: 15;
+  }
+  .flex-order-xl-16 {
+    order: 16;
+  }
+  .flex-order-xl-17 {
+    order: 17;
+  }
+  .flex-order-xl-18 {
+    order: 18;
+  }
+  .flex-order-xl-19 {
+    order: 19;
+  }
+  .flex-order-xl-20 {
+    order: 20;
+  }
+  .flex-offset-xl-0,
+  .layout-margin .flex-offset-xl-0,
+  .layout-margin .offset-xl-0,
+  .offset-xl-0 {
+    margin-left: 0;
+  }
+  [dir='rtl'] .flex-offset-xl-0,
+  [dir='rtl'] .layout-margin .flex-offset-xl-0,
+  [dir='rtl'] .layout-margin .offset-xl-0,
+  [dir='rtl'] .offset-xl-0 {
+    margin-left: auto;
+    margin-right: 0;
+  }
+  .flex-offset-xl-5,
+  .layout-margin .flex-offset-xl-5,
+  .layout-margin .offset-xl-5,
+  .offset-xl-5 {
+    margin-left: 5%;
+  }
+  [dir='rtl'] .flex-offset-xl-5,
+  [dir='rtl'] .layout-margin .flex-offset-xl-5,
+  [dir='rtl'] .layout-margin .offset-xl-5,
+  [dir='rtl'] .offset-xl-5 {
+    margin-left: auto;
+    margin-right: 5%;
+  }
+  .flex-offset-xl-10,
+  .layout-margin .flex-offset-xl-10,
+  .layout-margin .offset-xl-10,
+  .offset-xl-10 {
+    margin-left: 10%;
+  }
+  [dir='rtl'] .flex-offset-xl-10,
+  [dir='rtl'] .layout-margin .flex-offset-xl-10,
+  [dir='rtl'] .layout-margin .offset-xl-10,
+  [dir='rtl'] .offset-xl-10 {
+    margin-left: auto;
+    margin-right: 10%;
+  }
+  .flex-offset-xl-15,
+  .layout-margin .flex-offset-xl-15,
+  .layout-margin .offset-xl-15,
+  .offset-xl-15 {
+    margin-left: 15%;
+  }
+  [dir='rtl'] .flex-offset-xl-15,
+  [dir='rtl'] .layout-margin .flex-offset-xl-15,
+  [dir='rtl'] .layout-margin .offset-xl-15,
+  [dir='rtl'] .offset-xl-15 {
+    margin-left: auto;
+    margin-right: 15%;
+  }
+  .flex-offset-xl-20,
+  .layout-margin .flex-offset-xl-20,
+  .layout-margin .offset-xl-20,
+  .offset-xl-20 {
+    margin-left: 20%;
+  }
+  [dir='rtl'] .flex-offset-xl-20,
+  [dir='rtl'] .layout-margin .flex-offset-xl-20,
+  [dir='rtl'] .layout-margin .offset-xl-20,
+  [dir='rtl'] .offset-xl-20 {
+    margin-left: auto;
+    margin-right: 20%;
+  }
+  .flex-offset-xl-25,
+  .layout-margin .flex-offset-xl-25,
+  .layout-margin .offset-xl-25,
+  .offset-xl-25 {
+    margin-left: 25%;
+  }
+  [dir='rtl'] .flex-offset-xl-25,
+  [dir='rtl'] .layout-margin .flex-offset-xl-25,
+  [dir='rtl'] .layout-margin .offset-xl-25,
+  [dir='rtl'] .offset-xl-25 {
+    margin-left: auto;
+    margin-right: 25%;
+  }
+  .flex-offset-xl-30,
+  .layout-margin .flex-offset-xl-30,
+  .layout-margin .offset-xl-30,
+  .offset-xl-30 {
+    margin-left: 30%;
+  }
+  [dir='rtl'] .flex-offset-xl-30,
+  [dir='rtl'] .layout-margin .flex-offset-xl-30,
+  [dir='rtl'] .layout-margin .offset-xl-30,
+  [dir='rtl'] .offset-xl-30 {
+    margin-left: auto;
+    margin-right: 30%;
+  }
+  .flex-offset-xl-35,
+  .layout-margin .flex-offset-xl-35,
+  .layout-margin .offset-xl-35,
+  .offset-xl-35 {
+    margin-left: 35%;
+  }
+  [dir='rtl'] .flex-offset-xl-35,
+  [dir='rtl'] .layout-margin .flex-offset-xl-35,
+  [dir='rtl'] .layout-margin .offset-xl-35,
+  [dir='rtl'] .offset-xl-35 {
+    margin-left: auto;
+    margin-right: 35%;
+  }
+  .flex-offset-xl-40,
+  .layout-margin .flex-offset-xl-40,
+  .layout-margin .offset-xl-40,
+  .offset-xl-40 {
+    margin-left: 40%;
+  }
+  [dir='rtl'] .flex-offset-xl-40,
+  [dir='rtl'] .layout-margin .flex-offset-xl-40,
+  [dir='rtl'] .layout-margin .offset-xl-40,
+  [dir='rtl'] .offset-xl-40 {
+    margin-left: auto;
+    margin-right: 40%;
+  }
+  .flex-offset-xl-45,
+  .layout-margin .flex-offset-xl-45,
+  .layout-margin .offset-xl-45,
+  .offset-xl-45 {
+    margin-left: 45%;
+  }
+  [dir='rtl'] .flex-offset-xl-45,
+  [dir='rtl'] .layout-margin .flex-offset-xl-45,
+  [dir='rtl'] .layout-margin .offset-xl-45,
+  [dir='rtl'] .offset-xl-45 {
+    margin-left: auto;
+    margin-right: 45%;
+  }
+  .flex-offset-xl-50,
+  .layout-margin .flex-offset-xl-50,
+  .layout-margin .offset-xl-50,
+  .offset-xl-50 {
+    margin-left: 50%;
+  }
+  [dir='rtl'] .flex-offset-xl-50,
+  [dir='rtl'] .layout-margin .flex-offset-xl-50,
+  [dir='rtl'] .layout-margin .offset-xl-50,
+  [dir='rtl'] .offset-xl-50 {
+    margin-left: auto;
+    margin-right: 50%;
+  }
+  .flex-offset-xl-55,
+  .layout-margin .flex-offset-xl-55,
+  .layout-margin .offset-xl-55,
+  .offset-xl-55 {
+    margin-left: 55%;
+  }
+  [dir='rtl'] .flex-offset-xl-55,
+  [dir='rtl'] .layout-margin .flex-offset-xl-55,
+  [dir='rtl'] .layout-margin .offset-xl-55,
+  [dir='rtl'] .offset-xl-55 {
+    margin-left: auto;
+    margin-right: 55%;
+  }
+  .flex-offset-xl-60,
+  .layout-margin .flex-offset-xl-60,
+  .layout-margin .offset-xl-60,
+  .offset-xl-60 {
+    margin-left: 60%;
+  }
+  [dir='rtl'] .flex-offset-xl-60,
+  [dir='rtl'] .layout-margin .flex-offset-xl-60,
+  [dir='rtl'] .layout-margin .offset-xl-60,
+  [dir='rtl'] .offset-xl-60 {
+    margin-left: auto;
+    margin-right: 60%;
+  }
+  .flex-offset-xl-65,
+  .layout-margin .flex-offset-xl-65,
+  .layout-margin .offset-xl-65,
+  .offset-xl-65 {
+    margin-left: 65%;
+  }
+  [dir='rtl'] .flex-offset-xl-65,
+  [dir='rtl'] .layout-margin .flex-offset-xl-65,
+  [dir='rtl'] .layout-margin .offset-xl-65,
+  [dir='rtl'] .offset-xl-65 {
+    margin-left: auto;
+    margin-right: 65%;
+  }
+  .flex-offset-xl-70,
+  .layout-margin .flex-offset-xl-70,
+  .layout-margin .offset-xl-70,
+  .offset-xl-70 {
+    margin-left: 70%;
+  }
+  [dir='rtl'] .flex-offset-xl-70,
+  [dir='rtl'] .layout-margin .flex-offset-xl-70,
+  [dir='rtl'] .layout-margin .offset-xl-70,
+  [dir='rtl'] .offset-xl-70 {
+    margin-left: auto;
+    margin-right: 70%;
+  }
+  .flex-offset-xl-75,
+  .layout-margin .flex-offset-xl-75,
+  .layout-margin .offset-xl-75,
+  .offset-xl-75 {
+    margin-left: 75%;
+  }
+  [dir='rtl'] .flex-offset-xl-75,
+  [dir='rtl'] .layout-margin .flex-offset-xl-75,
+  [dir='rtl'] .layout-margin .offset-xl-75,
+  [dir='rtl'] .offset-xl-75 {
+    margin-left: auto;
+    margin-right: 75%;
+  }
+  .flex-offset-xl-80,
+  .layout-margin .flex-offset-xl-80,
+  .layout-margin .offset-xl-80,
+  .offset-xl-80 {
+    margin-left: 80%;
+  }
+  [dir='rtl'] .flex-offset-xl-80,
+  [dir='rtl'] .layout-margin .flex-offset-xl-80,
+  [dir='rtl'] .layout-margin .offset-xl-80,
+  [dir='rtl'] .offset-xl-80 {
+    margin-left: auto;
+    margin-right: 80%;
+  }
+  .flex-offset-xl-85,
+  .layout-margin .flex-offset-xl-85,
+  .layout-margin .offset-xl-85,
+  .offset-xl-85 {
+    margin-left: 85%;
+  }
+  [dir='rtl'] .flex-offset-xl-85,
+  [dir='rtl'] .layout-margin .flex-offset-xl-85,
+  [dir='rtl'] .layout-margin .offset-xl-85,
+  [dir='rtl'] .offset-xl-85 {
+    margin-left: auto;
+    margin-right: 85%;
+  }
+  .flex-offset-xl-90,
+  .layout-margin .flex-offset-xl-90,
+  .layout-margin .offset-xl-90,
+  .offset-xl-90 {
+    margin-left: 90%;
+  }
+  [dir='rtl'] .flex-offset-xl-90,
+  [dir='rtl'] .layout-margin .flex-offset-xl-90,
+  [dir='rtl'] .layout-margin .offset-xl-90,
+  [dir='rtl'] .offset-xl-90 {
+    margin-left: auto;
+    margin-right: 90%;
+  }
+  .flex-offset-xl-95,
+  .layout-margin .flex-offset-xl-95,
+  .layout-margin .offset-xl-95,
+  .offset-xl-95 {
+    margin-left: 95%;
+  }
+  [dir='rtl'] .flex-offset-xl-95,
+  [dir='rtl'] .layout-margin .flex-offset-xl-95,
+  [dir='rtl'] .layout-margin .offset-xl-95,
+  [dir='rtl'] .offset-xl-95 {
+    margin-left: auto;
+    margin-right: 95%;
+  }
+  .flex-offset-xl-33,
+  .layout-margin .flex-offset-xl-33,
+  .layout-margin .offset-xl-33,
+  .offset-xl-33 {
+    margin-left: 33.33333%;
+  }
+  .flex-offset-xl-66,
+  .layout-margin .flex-offset-xl-66,
+  .layout-margin .offset-xl-66,
+  .offset-xl-66 {
+    margin-left: 66.66667%;
+  }
+  [dir='rtl'] .flex-offset-xl-66,
+  [dir='rtl'] .layout-margin .flex-offset-xl-66,
+  [dir='rtl'] .layout-margin .offset-xl-66,
+  [dir='rtl'] .offset-xl-66 {
+    margin-left: auto;
+    margin-right: 66.66667%;
+  }
+  .layout-align-xl,
+  .layout-align-xl-start-stretch {
+    justify-content: flex-start;
+    align-content: stretch;
+    align-items: stretch;
+  }
+  .layout-align-xl-start,
+  .layout-align-xl-start-center,
+  .layout-align-xl-start-end,
+  .layout-align-xl-start-start,
+  .layout-align-xl-start-stretch {
+    justify-content: flex-start;
+  }
+  .layout-align-xl-center,
+  .layout-align-xl-center-center,
+  .layout-align-xl-center-end,
+  .layout-align-xl-center-start,
+  .layout-align-xl-center-stretch {
+    justify-content: center;
+  }
+  .layout-align-xl-end,
+  .layout-align-xl-end-center,
+  .layout-align-xl-end-end,
+  .layout-align-xl-end-start,
+  .layout-align-xl-end-stretch {
+    justify-content: flex-end;
+  }
+  .layout-align-xl-space-around,
+  .layout-align-xl-space-around-center,
+  .layout-align-xl-space-around-end,
+  .layout-align-xl-space-around-start,
+  .layout-align-xl-space-around-stretch {
+    justify-content: space-around;
+  }
+  .layout-align-xl-space-between,
+  .layout-align-xl-space-between-center,
+  .layout-align-xl-space-between-end,
+  .layout-align-xl-space-between-start,
+  .layout-align-xl-space-between-stretch {
+    justify-content: space-between;
+  }
+  .layout-align-xl-center-start,
+  .layout-align-xl-end-start,
+  .layout-align-xl-space-around-start,
+  .layout-align-xl-space-between-start,
+  .layout-align-xl-start-start {
+    align-items: flex-start;
+    align-content: flex-start;
+  }
+  .layout-align-xl-center-center,
+  .layout-align-xl-end-center,
+  .layout-align-xl-space-around-center,
+  .layout-align-xl-space-between-center,
+  .layout-align-xl-start-center {
+    align-items: center;
+    align-content: center;
+    max-width: 100%;
+  }
+  .layout-align-xl-center-center > *,
+  .layout-align-xl-end-center > *,
+  .layout-align-xl-space-around-center > *,
+  .layout-align-xl-space-between-center > *,
+  .layout-align-xl-start-center > * {
+    max-width: 100%;
+    box-sizing: border-box;
+  }
+  .layout-align-xl-center-end,
+  .layout-align-xl-end-end,
+  .layout-align-xl-space-around-end,
+  .layout-align-xl-space-between-end,
+  .layout-align-xl-start-end {
+    align-items: flex-end;
+    align-content: flex-end;
+  }
+  .layout-align-xl-center-stretch,
+  .layout-align-xl-end-stretch,
+  .layout-align-xl-space-around-stretch,
+  .layout-align-xl-space-between-stretch,
+  .layout-align-xl-start-stretch {
+    align-items: stretch;
+    align-content: stretch;
+  }
+  .flex-xl {
+    flex: 1;
+    box-sizing: border-box;
+  }
+  .flex-xl-grow {
+    flex: 1 1 100%;
+    box-sizing: border-box;
+  }
+  .flex-xl-initial {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xl-auto {
+    flex: 1 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xl-none {
+    flex: 0 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-xl-noshrink {
+    flex: 1 0 auto;
+    box-sizing: border-box;
+  }
+  .flex-xl-nogrow {
+    flex: 0 1 auto;
+    box-sizing: border-box;
+  }
+  .flex-xl-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-column > .flex-xl-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-0 {
+    flex: 1 1 100%;
+    max-width: 0;
+    max-height: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+  }
+  .layout-xl-column > .flex-xl-0 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 0%;
+    box-sizing: border-box;
+    min-height: 0;
+  }
+  .flex-xl-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-5 {
+    flex: 1 1 100%;
+    max-width: 5%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-5 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 5%;
+    box-sizing: border-box;
+  }
+  .flex-xl-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-10 {
+    flex: 1 1 100%;
+    max-width: 10%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-10 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 10%;
+    box-sizing: border-box;
+  }
+  .flex-xl-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-15 {
+    flex: 1 1 100%;
+    max-width: 15%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-15 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 15%;
+    box-sizing: border-box;
+  }
+  .flex-xl-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-20 {
+    flex: 1 1 100%;
+    max-width: 20%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-20 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 20%;
+    box-sizing: border-box;
+  }
+  .flex-xl-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-25 {
+    flex: 1 1 100%;
+    max-width: 25%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-25 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 25%;
+    box-sizing: border-box;
+  }
+  .flex-xl-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-30 {
+    flex: 1 1 100%;
+    max-width: 30%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-30 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 30%;
+    box-sizing: border-box;
+  }
+  .flex-xl-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-35 {
+    flex: 1 1 100%;
+    max-width: 35%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-35 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 35%;
+    box-sizing: border-box;
+  }
+  .flex-xl-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-40 {
+    flex: 1 1 100%;
+    max-width: 40%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-40 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 40%;
+    box-sizing: border-box;
+  }
+  .flex-xl-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-45 {
+    flex: 1 1 100%;
+    max-width: 45%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-45 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 45%;
+    box-sizing: border-box;
+  }
+  .flex-xl-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-50 {
+    flex: 1 1 100%;
+    max-width: 50%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-50 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 50%;
+    box-sizing: border-box;
+  }
+  .flex-xl-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-55 {
+    flex: 1 1 100%;
+    max-width: 55%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-55 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 55%;
+    box-sizing: border-box;
+  }
+  .flex-xl-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-60 {
+    flex: 1 1 100%;
+    max-width: 60%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-60 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 60%;
+    box-sizing: border-box;
+  }
+  .flex-xl-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-65 {
+    flex: 1 1 100%;
+    max-width: 65%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-65 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 65%;
+    box-sizing: border-box;
+  }
+  .flex-xl-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-70 {
+    flex: 1 1 100%;
+    max-width: 70%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-70 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 70%;
+    box-sizing: border-box;
+  }
+  .flex-xl-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-75 {
+    flex: 1 1 100%;
+    max-width: 75%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-75 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 75%;
+    box-sizing: border-box;
+  }
+  .flex-xl-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-80 {
+    flex: 1 1 100%;
+    max-width: 80%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-80 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 80%;
+    box-sizing: border-box;
+  }
+  .flex-xl-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-85 {
+    flex: 1 1 100%;
+    max-width: 85%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-85 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 85%;
+    box-sizing: border-box;
+  }
+  .flex-xl-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-90 {
+    flex: 1 1 100%;
+    max-width: 90%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-90 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 90%;
+    box-sizing: border-box;
+  }
+  .flex-xl-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-95 {
+    flex: 1 1 100%;
+    max-width: 95%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-95 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 95%;
+    box-sizing: border-box;
+  }
+  .flex-xl-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-100 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-33 {
+    flex: 1 1 33.33%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-row > .flex-xl-66 {
+    flex: 1 1 66.66%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-33 {
+    flex: 1 1 33.33%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-column > .flex-xl-66 {
+    flex: 1 1 66.66%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-33 {
+    flex: 1 1 100%;
+    max-width: 33.33%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex-xl-66 {
+    flex: 1 1 100%;
+    max-width: 66.66%;
+    max-height: 100%;
+    box-sizing: border-box;
+  }
+  .layout-xl-row > .flex {
+    min-width: 0;
+  }
+  .layout-xl-column > .flex-xl-33 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 33.33%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex-xl-66 {
+    flex: 1 1 100%;
+    max-width: 100%;
+    max-height: 66.66%;
+    box-sizing: border-box;
+  }
+  .layout-xl-column > .flex {
+    min-height: 0;
+  }
+  .layout-xl,
+  .layout-xl-column,
+  .layout-xl-row {
+    box-sizing: border-box;
+    display: flex;
+  }
+  .layout-xl-column {
+    flex-direction: column;
+  }
+  .layout-xl-row {
+    flex-direction: row;
+  }
+  .hide-gt-lg:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-gt-lg):not(.show-xl):not(.show),
+  .hide-gt-md:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-gt-lg):not(.show-xl):not(.show),
+  .hide-gt-sm:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-gt-lg):not(.show-xl):not(.show),
+  .hide-gt-xs:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-gt-lg):not(.show-xl):not(.show),
+  .hide:not(.show-gt-xs):not(.show-gt-sm):not(.show-gt-md):not(.show-gt-lg):not(.show-xl):not(.show) {
+    display: none;
+  }
+  .hide-xl:not(.show-xl):not(.show-gt-lg):not(.show-gt-md):not(.show-gt-sm):not(.show-gt-xs):not(.show) {
+    display: none;
+  }
+}
+@media print {
+  .hide-print:not(.show-print):not(.show) {
+    display: none !important;
+  }
+}
diff --git a/public/tvox/css/style.css b/public/tvox/css/style.css
new file mode 100644
index 0000000..47be304
--- /dev/null
+++ b/public/tvox/css/style.css
@@ -0,0 +1,69 @@
+.btn-accept {
+  background-color: #5db75b !important;
+  color: #ffffff !important;
+}
+.btn-refuse {
+  background-color: red !important;
+}
+
+.message-data-name {
+  font-size: 12px;
+  font-weight: bold;
+}
+
+.message-data-time {
+  color: #a8aab1;
+  font-size: 12px;
+  padding-left: 6px;
+}
+
+.user-message {
+  background-color: #86bb71;
+  color: #ffffff;
+  padding: 5px;
+  display: block;
+  font-size: 13px;
+}
+.agent-message {
+  background-color: #94c2ed;
+  color: #ffffff;
+  padding: 5px;
+  display: block;
+  font-size: 13px;
+}
+.message {
+  margin-bottom: 4px;
+}
+
+.block-left {
+  float: left;
+}
+.block-right {
+  float: right;
+}
+
+.footer {
+  position: fixed;
+  bottom: 10px;
+  width: 100%;
+}
+
+main {
+  overflow-y: auto;
+}
+
+.block-footer {
+  margin-bottom: 10px;
+}
+
+.logo {
+  width: 80px;
+}
+.info {
+  font-size: 12px;
+  color: gray;
+}
+
+.legenda {
+  font-size: 13px;
+}
diff --git a/public/tvox/js/angular-animate.min.js b/public/tvox/js/angular-animate.min.js
new file mode 100644
index 0000000..9a29e8c
--- /dev/null
+++ b/public/tvox/js/angular-animate.min.js
@@ -0,0 +1,1535 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(Y, z) {
+  'use strict';
+
+  function Fa(a, b, c) {
+    if (!a) throw Pa("areq", b || "?", c || "required");
+    return a
+  }
+
+  function Ga(a, b) {
+    if (!a && !b) return "";
+    if (!a) return b;
+    if (!b) return a;
+    Z(a) && (a = a.join(" "));
+    Z(b) && (b = b.join(" "));
+    return a + " " + b
+  }
+
+  function Qa(a) {
+    var b = {};
+    a && (a.to || a.from) && (b.to = a.to, b.from = a.from);
+    return b
+  }
+
+  function $(a, b, c) {
+    var d = "";
+    a = Z(a) ? a : a && G(a) && a.length ? a.split(/\s+/) : [];
+    s(a, function(a, k) {
+      a && 0 < a.length && (d += 0 < k ? " " : "", d += c ? b + a : a + b)
+    });
+    return d
+  }
+
+  function Ha(a) {
+    if (a instanceof A) switch (a.length) {
+      case 0:
+        return a;
+      case 1:
+        if (1 === a[0].nodeType) return a;
+        break;
+      default:
+        return A(va(a))
+    }
+    if (1 === a.nodeType) return A(a)
+  }
+
+  function va(a) {
+    if (!a[0]) return a;
+    for (var b = 0; b < a.length; b++) {
+      var c = a[b];
+      if (1 === c.nodeType) return c
+    }
+  }
+
+  function Ra(a, b, c) {
+    s(b, function(b) {
+      a.addClass(b, c)
+    })
+  }
+
+  function Sa(a, b, c) {
+    s(b, function(b) {
+      a.removeClass(b, c)
+    })
+  }
+
+  function aa(a) {
+    return function(b, c) {
+      c.addClass && (Ra(a, b, c.addClass), c.addClass = null);
+      c.removeClass && (Sa(a, b, c.removeClass), c.removeClass = null)
+    }
+  }
+
+  function pa(a) {
+    a = a || {};
+    if (!a.$$prepared) {
+      var b = a.domOperation ||
+        N;
+      a.domOperation = function() {
+        a.$$domOperationFired = !0;
+        b();
+        b = N
+      };
+      a.$$prepared = !0
+    }
+    return a
+  }
+
+  function ha(a, b) {
+    Ia(a, b);
+    Ja(a, b)
+  }
+
+  function Ia(a, b) {
+    b.from && (a.css(b.from), b.from = null)
+  }
+
+  function Ja(a, b) {
+    b.to && (a.css(b.to), b.to = null)
+  }
+
+  function T(a, b, c) {
+    var d = b.options || {};
+    c = c.options || {};
+    var f = (d.addClass || "") + " " + (c.addClass || ""),
+      k = (d.removeClass || "") + " " + (c.removeClass || "");
+    a = Ta(a.attr("class"), f, k);
+    c.preparationClasses && (d.preparationClasses = ba(c.preparationClasses, d.preparationClasses), delete c.preparationClasses);
+    f = d.domOperation !== N ? d.domOperation : null;
+    wa(d, c);
+    f && (d.domOperation = f);
+    d.addClass = a.addClass ? a.addClass : null;
+    d.removeClass = a.removeClass ? a.removeClass : null;
+    b.addClass = d.addClass;
+    b.removeClass = d.removeClass;
+    return d
+  }
+
+  function Ta(a, b, c) {
+    function d(a) {
+      G(a) && (a = a.split(" "));
+      var c = {};
+      s(a, function(a) {
+        a.length && (c[a] = !0)
+      });
+      return c
+    }
+    var f = {};
+    a = d(a);
+    b = d(b);
+    s(b, function(a, c) {
+      f[c] = 1
+    });
+    c = d(c);
+    s(c, function(a, c) {
+      f[c] = 1 === f[c] ? null : -1
+    });
+    var k = {
+      addClass: "",
+      removeClass: ""
+    };
+    s(f, function(c, b) {
+      var d, f;
+      1 === c ? (d = "addClass",
+        f = !a[b] || a[b + "-remove"]) : -1 === c && (d = "removeClass", f = a[b] || a[b + "-add"]);
+      f && (k[d].length && (k[d] += " "), k[d] += b)
+    });
+    return k
+  }
+
+  function K(a) {
+    return a instanceof A ? a[0] : a
+  }
+
+  function Ua(a, b, c, d) {
+    a = "";
+    c && (a = $(c, "ng-", !0));
+    d.addClass && (a = ba(a, $(d.addClass, "-add")));
+    d.removeClass && (a = ba(a, $(d.removeClass, "-remove")));
+    a.length && (d.preparationClasses = a, b.addClass(a))
+  }
+
+  function xa(a, b) {
+    var c = b ? "paused" : "",
+      d = ca + "PlayState";
+    ma(a, [d, c]);
+    return [d, c]
+  }
+
+  function ma(a, b) {
+    a.style[b[0]] = b[1]
+  }
+
+  function ba(a, b) {
+    return a ? b ? a + " " +
+      b : a : b
+  }
+
+  function Ka(a, b, c) {
+    var d = Object.create(null),
+      f = a.getComputedStyle(b) || {};
+    s(c, function(a, c) {
+      var b = f[a];
+      if (b) {
+        var L = b.charAt(0);
+        if ("-" === L || "+" === L || 0 <= L) b = Va(b);
+        0 === b && (b = null);
+        d[c] = b
+      }
+    });
+    return d
+  }
+
+  function Va(a) {
+    var b = 0;
+    a = a.split(/\s*,\s*/);
+    s(a, function(a) {
+      "s" === a.charAt(a.length - 1) && (a = a.substring(0, a.length - 1));
+      a = parseFloat(a) || 0;
+      b = b ? Math.max(a, b) : a
+    });
+    return b
+  }
+
+  function ya(a) {
+    return 0 === a || null != a
+  }
+
+  function La(a, b) {
+    var c = M,
+      d = a + "s";
+    b ? c += "Duration" : d += " linear all";
+    return [c, d]
+  }
+
+  function Ma(a, b, c) {
+    s(c,
+      function(c) {
+        a[c] = za(a[c]) ? a[c] : b.style.getPropertyValue(c)
+      })
+  }
+  var M, Aa, ca, Ba;
+  void 0 === Y.ontransitionend && void 0 !== Y.onwebkittransitionend ? (M = "WebkitTransition", Aa = "webkitTransitionEnd transitionend") : (M = "transition", Aa = "transitionend");
+  void 0 === Y.onanimationend && void 0 !== Y.onwebkitanimationend ? (ca = "WebkitAnimation", Ba = "webkitAnimationEnd animationend") : (ca = "animation", Ba = "animationend");
+  var qa = ca + "Delay",
+    Ca = ca + "Duration",
+    na = M + "Delay",
+    Na = M + "Duration",
+    Pa = z.$$minErr("ng"),
+    ra = {
+      blockTransitions: function(a,
+        b) {
+        var c = b ? "-" + b + "s" : "";
+        ma(a, [na, c]);
+        return [na, c]
+      }
+    },
+    Wa = {
+      transitionDuration: Na,
+      transitionDelay: na,
+      transitionProperty: M + "Property",
+      animationDuration: Ca,
+      animationDelay: qa,
+      animationIterationCount: ca + "IterationCount"
+    },
+    Xa = {
+      transitionDuration: Na,
+      transitionDelay: na,
+      animationDuration: Ca,
+      animationDelay: qa
+    },
+    Da, wa, s, Z, za, sa, Ea, ta, G, R, A, N;
+  z.module("ngAnimate", [], function() {
+    N = z.noop;
+    Da = z.copy;
+    wa = z.extend;
+    A = z.element;
+    s = z.forEach;
+    Z = z.isArray;
+    G = z.isString;
+    ta = z.isObject;
+    R = z.isUndefined;
+    za = z.isDefined;
+    Ea = z.isFunction;
+    sa = z.isElement
+  }).info({
+    angularVersion: "1.8.2"
+  }).directive("ngAnimateSwap", ["$animate", function(a) {
+    return {
+      restrict: "A",
+      transclude: "element",
+      terminal: !0,
+      priority: 550,
+      link: function(b, c, d, f, k) {
+        var e, Q;
+        b.$watchCollection(d.ngAnimateSwap || d["for"], function(b) {
+          e && a.leave(e);
+          Q && (Q.$destroy(), Q = null);
+          (b || 0 === b) && k(function(b, d) {
+            e = b;
+            Q = d;
+            a.enter(b, null, c)
+          })
+        })
+      }
+    }
+  }]).directive("ngAnimateChildren", ["$interpolate", function(a) {
+    return {
+      link: function(b, c, d) {
+        function f(a) {
+          c.data("$$ngAnimateChildren", "on" === a || "true" ===
+            a)
+        }
+        var k = d.ngAnimateChildren;
+        G(k) && 0 === k.length ? c.data("$$ngAnimateChildren", !0) : (f(a(k)(b)), d.$observe("ngAnimateChildren", f))
+      }
+    }
+  }]).factory("$$rAFScheduler", ["$$rAF", function(a) {
+    function b(a) {
+      d = d.concat(a);
+      c()
+    }
+
+    function c() {
+      if (d.length) {
+        for (var b = d.shift(), e = 0; e < b.length; e++) b[e]();
+        f || a(function() {
+          f || c()
+        })
+      }
+    }
+    var d, f;
+    d = b.queue = [];
+    b.waitUntilQuiet = function(b) {
+      f && f();
+      f = a(function() {
+        f = null;
+        b();
+        c()
+      })
+    };
+    return b
+  }]).provider("$$animateQueue", ["$animateProvider", function(a) {
+    function b(a) {
+      return {
+        addClass: a.addClass,
+        removeClass: a.removeClass,
+        from: a.from,
+        to: a.to
+      }
+    }
+
+    function c(a) {
+      if (!a) return null;
+      a = a.split(" ");
+      var b = Object.create(null);
+      s(a, function(a) {
+        b[a] = !0
+      });
+      return b
+    }
+
+    function d(a, b) {
+      if (a && b) {
+        var d = c(b);
+        return a.split(" ").some(function(a) {
+          return d[a]
+        })
+      }
+    }
+
+    function f(a, b, c) {
+      return e[a].some(function(a) {
+        return a(b, c)
+      })
+    }
+
+    function k(a, b) {
+      var c = 0 < (a.addClass || "").length,
+        d = 0 < (a.removeClass || "").length;
+      return b ? c && d : c || d
+    }
+    var e = this.rules = {
+      skip: [],
+      cancel: [],
+      join: []
+    };
+    e.join.push(function(a, b) {
+      return !a.structural && k(a)
+    });
+    e.skip.push(function(a, b) {
+      return !a.structural && !k(a)
+    });
+    e.skip.push(function(a, b) {
+      return "leave" === b.event && a.structural
+    });
+    e.skip.push(function(a, b) {
+      return b.structural && 2 === b.state && !a.structural
+    });
+    e.cancel.push(function(a, b) {
+      return b.structural && a.structural
+    });
+    e.cancel.push(function(a, b) {
+      return 2 === b.state && a.structural
+    });
+    e.cancel.push(function(a, b) {
+      if (b.structural) return !1;
+      var c = a.addClass,
+        f = a.removeClass,
+        k = b.addClass,
+        e = b.removeClass;
+      return R(c) && R(f) || R(k) && R(e) ? !1 : d(c, e) || d(f, k)
+    });
+    this.$get = ["$$rAF",
+      "$rootScope", "$rootElement", "$document", "$$Map", "$$animation", "$$AnimateRunner", "$templateRequest", "$$jqLite", "$$forceReflow", "$$isDocumentHidden",
+      function(c, d, e, C, U, oa, H, u, t, I, da) {
+        function ia(a) {
+          O.delete(a.target)
+        }
+
+        function v() {
+          var a = !1;
+          return function(b) {
+            a ? b() : d.$$postDigest(function() {
+              a = !0;
+              b()
+            })
+          }
+        }
+
+        function ua(a, b, c) {
+          var g = [],
+            l = m[c];
+          l && s(l, function(l) {
+            Oa.call(l.node, b) ? g.push(l.callback) : "leave" === c && Oa.call(l.node, a) && g.push(l.callback)
+          });
+          return g
+        }
+
+        function h(a, b, c) {
+          var l = va(b);
+          return a.filter(function(a) {
+            return !(a.node ===
+              l && (!c || a.callback === c))
+          })
+        }
+
+        function q(a, J, w) {
+          function e(a, b, l, g) {
+            u(function() {
+              var a = ua(ia, m, b);
+              a.length ? c(function() {
+                s(a, function(a) {
+                  a(h, l, g)
+                });
+                "close" !== l || m.parentNode || D.off(m)
+              }) : "close" !== l || m.parentNode || D.off(m)
+            });
+            a.progress(b, l, g)
+          }
+
+          function I(a) {
+            var b = h,
+              c = n;
+            c.preparationClasses && (b.removeClass(c.preparationClasses), c.preparationClasses = null);
+            c.activeClasses && (b.removeClass(c.activeClasses), c.activeClasses = null);
+            W(h, n);
+            ha(h, n);
+            n.domOperation();
+            q.complete(!a)
+          }
+          var n = Da(w),
+            h = Ha(a),
+            m = K(h),
+            ia = m &&
+            m.parentNode,
+            n = pa(n),
+            q = new H,
+            u = v();
+          Z(n.addClass) && (n.addClass = n.addClass.join(" "));
+          n.addClass && !G(n.addClass) && (n.addClass = null);
+          Z(n.removeClass) && (n.removeClass = n.removeClass.join(" "));
+          n.removeClass && !G(n.removeClass) && (n.removeClass = null);
+          n.from && !ta(n.from) && (n.from = null);
+          n.to && !ta(n.to) && (n.to = null);
+          if (!(B && m && fa(m, J, w) && Ya(m, n))) return I(), q;
+          var x = 0 <= ["enter", "move", "leave"].indexOf(J),
+            r = da(),
+            P = r || O.get(m);
+          w = !P && y.get(m) || {};
+          var p = !!w.state;
+          P || p && 1 === w.state || (P = !E(m, ia, J));
+          if (P) return r &&
+            e(q, J, "start", b(n)), I(), r && e(q, J, "close", b(n)), q;
+          x && F(m);
+          r = {
+            structural: x,
+            element: h,
+            event: J,
+            addClass: n.addClass,
+            removeClass: n.removeClass,
+            close: I,
+            options: n,
+            runner: q
+          };
+          if (p) {
+            if (f("skip", r, w)) {
+              if (2 === w.state) return I(), q;
+              T(h, w, r);
+              return w.runner
+            }
+            if (f("cancel", r, w))
+              if (2 === w.state) w.runner.end();
+              else if (w.structural) w.close();
+            else return T(h, w, r), w.runner;
+            else if (f("join", r, w))
+              if (2 === w.state) T(h, r, {});
+              else return Ua(t, h, x ? J : null, n), J = r.event = w.event, n = T(h, w, r), w.runner
+          } else T(h, r, {});
+          (p = r.structural) ||
+          (p = "animate" === r.event && 0 < Object.keys(r.options.to || {}).length || k(r));
+          if (!p) return I(), g(m), q;
+          var C = (w.counter || 0) + 1;
+          r.counter = C;
+          l(m, 1, r);
+          d.$$postDigest(function() {
+            h = Ha(a);
+            var c = y.get(m),
+              d = !c,
+              c = c || {},
+              t = 0 < (h.parent() || []).length && ("animate" === c.event || c.structural || k(c));
+            if (d || c.counter !== C || !t) {
+              d && (W(h, n), ha(h, n));
+              if (d || x && c.event !== J) n.domOperation(), q.end();
+              t || g(m)
+            } else J = !c.structural && k(c, !0) ? "setClass" : c.event, l(m, 2), c = oa(h, J, c.options), q.setHost(c), e(q, J, "start", b(n)), c.done(function(a) {
+              I(!a);
+              (a = y.get(m)) && a.counter === C && g(m);
+              e(q, J, "close", b(n))
+            })
+          });
+          return q
+        }
+
+        function F(a) {
+          a = a.querySelectorAll("[data-ng-animate]");
+          s(a, function(a) {
+            var b = parseInt(a.getAttribute("data-ng-animate"), 10),
+              c = y.get(a);
+            if (c) switch (b) {
+              case 2:
+                c.runner.end();
+              case 1:
+                y.delete(a)
+            }
+          })
+        }
+
+        function g(a) {
+          a.removeAttribute("data-ng-animate");
+          y.delete(a)
+        }
+
+        function E(a, b, c) {
+          c = C[0].body;
+          var l = K(e),
+            g = a === c || "HTML" === a.nodeName,
+            d = a === l,
+            t = !1,
+            m = O.get(a),
+            h;
+          for ((a = A.data(a, "$ngAnimatePin")) && (b = K(a)); b;) {
+            d || (d = b === l);
+            if (1 !== b.nodeType) break;
+            a = y.get(b) || {};
+            if (!t) {
+              var f = O.get(b);
+              if (!0 === f && !1 !== m) {
+                m = !0;
+                break
+              } else !1 === f && (m = !1);
+              t = a.structural
+            }
+            if (R(h) || !0 === h) a = A.data(b, "$$ngAnimateChildren"), za(a) && (h = a);
+            if (t && !1 === h) break;
+            g || (g = b === c);
+            if (g && d) break;
+            if (!d && (a = A.data(b, "$ngAnimatePin"))) {
+              b = K(a);
+              continue
+            }
+            b = b.parentNode
+          }
+          return (!t || h) && !0 !== m && d && g
+        }
+
+        function l(a, b, c) {
+          c = c || {};
+          c.state = b;
+          a.setAttribute("data-ng-animate", b);
+          c = (b = y.get(a)) ? wa(b, c) : c;
+          y.set(a, c)
+        }
+        var y = new U,
+          O = new U,
+          B = null,
+          P = d.$watch(function() {
+            return 0 === u.totalPendingRequests
+          }, function(a) {
+            a &&
+              (P(), d.$$postDigest(function() {
+                d.$$postDigest(function() {
+                  null === B && (B = !0)
+                })
+              }))
+          }),
+          m = Object.create(null);
+        U = a.customFilter();
+        var la = a.classNameFilter();
+        I = function() {
+          return !0
+        };
+        var fa = U || I,
+          Ya = la ? function(a, b) {
+            var c = [a.getAttribute("class"), b.addClass, b.removeClass].join(" ");
+            return la.test(c)
+          } : I,
+          W = aa(t),
+          Oa = Y.Node.prototype.contains || function(a) {
+            return this === a || !!(this.compareDocumentPosition(a) & 16)
+          },
+          D = {
+            on: function(a, b, c) {
+              var l = va(b);
+              m[a] = m[a] || [];
+              m[a].push({
+                node: l,
+                callback: c
+              });
+              A(b).on("$destroy", function() {
+                y.get(l) ||
+                  D.off(a, b, c)
+              })
+            },
+            off: function(a, b, c) {
+              if (1 !== arguments.length || G(arguments[0])) {
+                var l = m[a];
+                l && (m[a] = 1 === arguments.length ? null : h(l, b, c))
+              } else
+                for (l in b = arguments[0], m) m[l] = h(m[l], b)
+            },
+            pin: function(a, b) {
+              Fa(sa(a), "element", "not an element");
+              Fa(sa(b), "parentElement", "not an element");
+              a.data("$ngAnimatePin", b)
+            },
+            push: function(a, b, c, l) {
+              c = c || {};
+              c.domOperation = l;
+              return q(a, b, c)
+            },
+            enabled: function(a, b) {
+              var c = arguments.length;
+              if (0 === c) b = !!B;
+              else if (sa(a)) {
+                var l = K(a);
+                if (1 === c) b = !O.get(l);
+                else {
+                  if (!O.has(l)) A(a).on("$destroy",
+                    ia);
+                  O.set(l, !b)
+                }
+              } else b = B = !!a;
+              return b
+            }
+          };
+        return D
+      }
+    ]
+  }]).provider("$$animateCache", function() {
+    var a = 0,
+      b = Object.create(null);
+    this.$get = [function() {
+      return {
+        cacheKey: function(b, d, f, k) {
+          var e = b.parentNode;
+          b = [e.$$ngAnimateParentKey || (e.$$ngAnimateParentKey = ++a), d, b.getAttribute("class")];
+          f && b.push(f);
+          k && b.push(k);
+          return b.join(" ")
+        },
+        containsCachedAnimationWithoutDuration: function(a) {
+          return (a = b[a]) && !a.isValid || !1
+        },
+        flush: function() {
+          b = Object.create(null)
+        },
+        count: function(a) {
+          return (a = b[a]) ? a.total : 0
+        },
+        get: function(a) {
+          return (a =
+            b[a]) && a.value
+        },
+        put: function(a, d, f) {
+          b[a] ? (b[a].total++, b[a].value = d) : b[a] = {
+            total: 1,
+            value: d,
+            isValid: f
+          }
+        }
+      }
+    }]
+  }).provider("$$animation", ["$animateProvider", function(a) {
+    var b = this.drivers = [];
+    this.$get = ["$$jqLite", "$rootScope", "$injector", "$$AnimateRunner", "$$Map", "$$rAFScheduler", "$$animateCache", function(a, d, f, k, e, Q, L) {
+      function x(a) {
+        function b(a) {
+          if (a.processed) return a;
+          a.processed = !0;
+          var d = a.domNode,
+            t = d.parentNode;
+          f.set(d, a);
+          for (var h; t;) {
+            if (h = f.get(t)) {
+              h.processed || (h = b(h));
+              break
+            }
+            t = t.parentNode
+          }(h ||
+            c).children.push(a);
+          return a
+        }
+        var c = {
+            children: []
+          },
+          d, f = new e;
+        for (d = 0; d < a.length; d++) {
+          var da = a[d];
+          f.set(da.domNode, a[d] = {
+            domNode: da.domNode,
+            element: da.element,
+            fn: da.fn,
+            children: []
+          })
+        }
+        for (d = 0; d < a.length; d++) b(a[d]);
+        return function(a) {
+          var b = [],
+            c = [],
+            d;
+          for (d = 0; d < a.children.length; d++) c.push(a.children[d]);
+          a = c.length;
+          var t = 0,
+            f = [];
+          for (d = 0; d < c.length; d++) {
+            var g = c[d];
+            0 >= a && (a = t, t = 0, b.push(f), f = []);
+            f.push(g);
+            g.children.forEach(function(a) {
+              t++;
+              c.push(a)
+            });
+            a--
+          }
+          f.length && b.push(f);
+          return b
+        }(c)
+      }
+      var C = [],
+        U = aa(a);
+      return function(e,
+        H, u) {
+        function t(a) {
+          a = a.hasAttribute("ng-animate-ref") ? [a] : a.querySelectorAll("[ng-animate-ref]");
+          var b = [];
+          s(a, function(a) {
+            var c = a.getAttribute("ng-animate-ref");
+            c && c.length && b.push(a)
+          });
+          return b
+        }
+
+        function I(a) {
+          var b = [],
+            c = {};
+          s(a, function(a, d) {
+            var l = K(a.element),
+              g = 0 <= ["enter", "move"].indexOf(a.event),
+              l = a.structural ? t(l) : [];
+            if (l.length) {
+              var f = g ? "to" : "from";
+              s(l, function(a) {
+                var b = a.getAttribute("ng-animate-ref");
+                c[b] = c[b] || {};
+                c[b][f] = {
+                  animationID: d,
+                  element: A(a)
+                }
+              })
+            } else b.push(a)
+          });
+          var d = {},
+            g = {};
+          s(c, function(c,
+            t) {
+            var f = c.from,
+              e = c.to;
+            if (f && e) {
+              var h = a[f.animationID],
+                k = a[e.animationID],
+                E = f.animationID.toString();
+              if (!g[E]) {
+                var I = g[E] = {
+                  structural: !0,
+                  beforeStart: function() {
+                    h.beforeStart();
+                    k.beforeStart()
+                  },
+                  close: function() {
+                    h.close();
+                    k.close()
+                  },
+                  classes: da(h.classes, k.classes),
+                  from: h,
+                  to: k,
+                  anchors: []
+                };
+                I.classes.length ? b.push(I) : (b.push(h), b.push(k))
+              }
+              g[E].anchors.push({
+                out: f.element,
+                "in": e.element
+              })
+            } else f = f ? f.animationID : e.animationID, e = f.toString(), d[e] || (d[e] = !0, b.push(a[f]))
+          });
+          return b
+        }
+
+        function da(a, b) {
+          a = a.split(" ");
+          b = b.split(" ");
+          for (var c = [], d = 0; d < a.length; d++) {
+            var g = a[d];
+            if ("ng-" !== g.substring(0, 3))
+              for (var t = 0; t < b.length; t++)
+                if (g === b[t]) {
+                  c.push(g);
+                  break
+                }
+          }
+          return c.join(" ")
+        }
+
+        function ia(a) {
+          for (var c = b.length - 1; 0 <= c; c--) {
+            var d = f.get(b[c])(a);
+            if (d) return d
+          }
+        }
+
+        function v(a, b) {
+          function c(a) {
+            (a = a.data("$$animationRunner")) && a.setHost(b)
+          }
+          a.from && a.to ? (c(a.from.element), c(a.to.element)) : c(a.element)
+        }
+
+        function ua() {
+          var a = e.data("$$animationRunner");
+          !a || "leave" === H && u.$$domOperationFired || a.end()
+        }
+
+        function h(b) {
+          e.off("$destroy",
+            ua);
+          e.removeData("$$animationRunner");
+          U(e, u);
+          ha(e, u);
+          u.domOperation();
+          E && a.removeClass(e, E);
+          F.complete(!b)
+        }
+        u = pa(u);
+        var q = 0 <= ["enter", "move", "leave"].indexOf(H),
+          F = new k({
+            end: function() {
+              h()
+            },
+            cancel: function() {
+              h(!0)
+            }
+          });
+        if (!b.length) return h(), F;
+        var g = Ga(e.attr("class"), Ga(u.addClass, u.removeClass)),
+          E = u.tempClasses;
+        E && (g += " " + E, u.tempClasses = null);
+        q && e.data("$$animatePrepareClasses", "ng-" + H + "-prepare");
+        e.data("$$animationRunner", F);
+        C.push({
+          element: e,
+          classes: g,
+          event: H,
+          structural: q,
+          options: u,
+          beforeStart: function() {
+            E =
+              (E ? E + " " : "") + "ng-animate";
+            a.addClass(e, E);
+            var b = e.data("$$animatePrepareClasses");
+            b && a.removeClass(e, b)
+          },
+          close: h
+        });
+        e.on("$destroy", ua);
+        if (1 < C.length) return F;
+        d.$$postDigest(function() {
+          var b = [];
+          s(C, function(a) {
+            a.element.data("$$animationRunner") ? b.push(a) : a.close()
+          });
+          C.length = 0;
+          var d = I(b),
+            g = [];
+          s(d, function(a) {
+            var b = a.from ? a.from.element : a.element,
+              c = u.addClass,
+              d = L.cacheKey(b[0], a.event, (c ? c + " " : "") + "ng-animate", u.removeClass);
+            g.push({
+              element: b,
+              domNode: K(b),
+              fn: function() {
+                var b, c = a.close;
+                if (L.containsCachedAnimationWithoutDuration(d)) c();
+                else {
+                  a.beforeStart();
+                  if ((a.anchors ? a.from.element || a.to.element : a.element).data("$$animationRunner")) {
+                    var g = ia(a);
+                    g && (b = g.start)
+                  }
+                  b ? (b = b(), b.done(function(a) {
+                    c(!a)
+                  }), v(a, b)) : c()
+                }
+              }
+            })
+          });
+          for (var d = x(g), t = 0; t < d.length; t++)
+            for (var f = d[t], e = 0; e < f.length; e++) {
+              var h = f[e],
+                k = h.element;
+              d[t][e] = h.fn;
+              0 === t ? k.removeData("$$animatePrepareClasses") : (h = k.data("$$animatePrepareClasses")) && a.addClass(k, h)
+            }
+          Q(d)
+        });
+        return F
+      }
+    }]
+  }]).provider("$animateCss", ["$animateProvider", function(a) {
+    this.$get = ["$window", "$$jqLite", "$$AnimateRunner",
+      "$timeout", "$$animateCache", "$$forceReflow", "$sniffer", "$$rAFScheduler", "$$animateQueue",
+      function(a, c, d, f, k, e, Q, L, x) {
+        function C(d, f, e, x) {
+          var v, s = "stagger-" + e;
+          0 < k.count(e) && (v = k.get(s), v || (f = $(f, "-stagger"), c.addClass(d, f), v = Ka(a, d, x), v.animationDuration = Math.max(v.animationDuration, 0), v.transitionDuration = Math.max(v.transitionDuration, 0), c.removeClass(d, f), k.put(s, v, !0)));
+          return v || {}
+        }
+
+        function U(a) {
+          u.push(a);
+          L.waitUntilQuiet(function() {
+            k.flush();
+            for (var a = e(), b = 0; b < u.length; b++) u[b](a);
+            u.length = 0
+          })
+        }
+
+        function z(c, d, f, e) {
+          d = k.get(f);
+          d || (d = Ka(a, c, Wa), "infinite" === d.animationIterationCount && (d.animationIterationCount = 1));
+          k.put(f, d, e || 0 < d.transitionDuration || 0 < d.animationDuration);
+          c = d;
+          f = c.animationDelay;
+          e = c.transitionDelay;
+          c.maxDelay = f && e ? Math.max(f, e) : f || e;
+          c.maxDuration = Math.max(c.animationDuration * c.animationIterationCount, c.transitionDuration);
+          return c
+        }
+        var H = aa(c),
+          u = [];
+        return function(a, b) {
+          function e() {
+            v()
+          }
+
+          function L() {
+            v(!0)
+          }
+
+          function v(b) {
+            if (!(P || la && m)) {
+              P = !0;
+              m = !1;
+              V && !g.$$skipPreparationClasses &&
+                c.removeClass(a, V);
+              ba && c.removeClass(a, ba);
+              xa(l, !1);
+              ra.blockTransitions(l, !1);
+              s(y, function(a) {
+                l.style[a[0]] = ""
+              });
+              H(a, g);
+              ha(a, g);
+              Object.keys(E).length && s(E, function(a, b) {
+                a ? l.style.setProperty(b, a) : l.style.removeProperty(b)
+              });
+              if (g.onDone) g.onDone();
+              w && w.length && a.off(w.join(" "), q);
+              var d = a.data("$$animateCss");
+              d && (f.cancel(d[0].timer), a.removeData("$$animateCss"));
+              fa && fa.complete(!b)
+            }
+          }
+
+          function u(a) {
+            p.blockTransition && ra.blockTransitions(l, a);
+            p.blockKeyframeAnimation && xa(l, !!a)
+          }
+
+          function h() {
+            fa = new d({
+              end: e,
+              cancel: L
+            });
+            U(N);
+            v();
+            return {
+              $$willAnimate: !1,
+              start: function() {
+                return fa
+              },
+              end: e
+            }
+          }
+
+          function q(a) {
+            a.stopPropagation();
+            var b = a.originalEvent || a;
+            b.target === l && (a = b.$manualTimeStamp || Date.now(), b = parseFloat(b.elapsedTime.toFixed(3)), Math.max(a - J, 0) >= G && b >= D && (la = !0, v()))
+          }
+
+          function F() {
+            function b() {
+              if (!P) {
+                u(!1);
+                s(y, function(a) {
+                  l.style[a[0]] = a[1]
+                });
+                H(a, g);
+                c.addClass(a, ba);
+                if (p.recalculateTimingStyles) {
+                  T = l.getAttribute("class") + " " + V;
+                  ka = k.cacheKey(l, ja, g.addClass, g.removeClass);
+                  r = z(l, T, ka, !1);
+                  ga = r.maxDelay;
+                  W =
+                    Math.max(ga, 0);
+                  D = r.maxDuration;
+                  if (0 === D) {
+                    v();
+                    return
+                  }
+                  p.hasTransitions = 0 < r.transitionDuration;
+                  p.hasAnimations = 0 < r.animationDuration
+                }
+                p.applyAnimationDelay && (ga = "boolean" !== typeof g.delay && ya(g.delay) ? parseFloat(g.delay) : ga, W = Math.max(ga, 0), r.animationDelay = ga, ea = [qa, ga + "s"], y.push(ea), l.style[ea[0]] = ea[1]);
+                G = 1E3 * W;
+                R = 1E3 * D;
+                if (g.easing) {
+                  var e, h = g.easing;
+                  p.hasTransitions && (e = M + "TimingFunction", y.push([e, h]), l.style[e] = h);
+                  p.hasAnimations && (e = ca + "TimingFunction", y.push([e, h]), l.style[e] = h)
+                }
+                r.transitionDuration &&
+                  w.push(Aa);
+                r.animationDuration && w.push(Ba);
+                J = Date.now();
+                var m = G + 1.5 * R;
+                e = J + m;
+                var h = a.data("$$animateCss") || [],
+                  F = !0;
+                if (h.length) {
+                  var n = h[0];
+                  (F = e > n.expectedEndTime) ? f.cancel(n.timer): h.push(v)
+                }
+                F && (m = f(d, m, !1), h[0] = {
+                  timer: m,
+                  expectedEndTime: e
+                }, h.push(v), a.data("$$animateCss", h));
+                if (w.length) a.on(w.join(" "), q);
+                g.to && (g.cleanupStyles && Ma(E, l, Object.keys(g.to)), Ja(a, g))
+              }
+            }
+
+            function d() {
+              var b = a.data("$$animateCss");
+              if (b) {
+                for (var c = 1; c < b.length; c++) b[c]();
+                a.removeData("$$animateCss")
+              }
+            }
+            if (!P)
+              if (l.parentNode) {
+                var e =
+                  function(a) {
+                    if (la) m && a && (m = !1, v());
+                    else if (m = !a, r.animationDuration)
+                      if (a = xa(l, m), m) y.push(a);
+                      else {
+                        var b = y,
+                          c = b.indexOf(a);
+                        0 <= a && b.splice(c, 1)
+                      }
+                  },
+                  h = 0 < aa && (r.transitionDuration && 0 === X.transitionDuration || r.animationDuration && 0 === X.animationDuration) && Math.max(X.animationDelay, X.transitionDelay);
+                h ? f(b, Math.floor(h * aa * 1E3), !1) : b();
+                A.resume = function() {
+                  e(!0)
+                };
+                A.pause = function() {
+                  e(!1)
+                }
+              } else v()
+          }
+          var g = b || {};
+          g.$$prepared || (g = pa(Da(g)));
+          var E = {},
+            l = K(a);
+          if (!l || !l.parentNode || !x.enabled()) return h();
+          var y = [],
+            O =
+            a.attr("class"),
+            B = Qa(g),
+            P, m, la, fa, A, W, G, D, R, J, w = [];
+          if (0 === g.duration || !Q.animations && !Q.transitions) return h();
+          var ja = g.event && Z(g.event) ? g.event.join(" ") : g.event,
+            Y = ja && g.structural,
+            n = "",
+            S = "";
+          Y ? n = $(ja, "ng-", !0) : ja && (n = ja);
+          g.addClass && (S += $(g.addClass, "-add"));
+          g.removeClass && (S.length && (S += " "), S += $(g.removeClass, "-remove"));
+          g.applyClassesEarly && S.length && H(a, g);
+          var V = [n, S].join(" ").trim(),
+            T = O + " " + V,
+            O = B.to && 0 < Object.keys(B.to).length;
+          if (!(0 < (g.keyframeStyle || "").length || O || V)) return h();
+          var X, ka =
+            k.cacheKey(l, ja, g.addClass, g.removeClass);
+          if (k.containsCachedAnimationWithoutDuration(ka)) return V = null, h();
+          0 < g.stagger ? (B = parseFloat(g.stagger), X = {
+            transitionDelay: B,
+            animationDelay: B,
+            transitionDuration: 0,
+            animationDuration: 0
+          }) : X = C(l, V, ka, Xa);
+          g.$$skipPreparationClasses || c.addClass(a, V);
+          g.transitionStyle && (B = [M, g.transitionStyle], ma(l, B), y.push(B));
+          0 <= g.duration && (B = 0 < l.style[M].length, B = La(g.duration, B), ma(l, B), y.push(B));
+          g.keyframeStyle && (B = [ca, g.keyframeStyle], ma(l, B), y.push(B));
+          var aa = X ? 0 <= g.staggerIndex ?
+            g.staggerIndex : k.count(ka) : 0;
+          (n = 0 === aa) && !g.skipBlocking && ra.blockTransitions(l, 9999);
+          var r = z(l, T, ka, !Y),
+            ga = r.maxDelay;
+          W = Math.max(ga, 0);
+          D = r.maxDuration;
+          var p = {};
+          p.hasTransitions = 0 < r.transitionDuration;
+          p.hasAnimations = 0 < r.animationDuration;
+          p.hasTransitionAll = p.hasTransitions && "all" === r.transitionProperty;
+          p.applyTransitionDuration = O && (p.hasTransitions && !p.hasTransitionAll || p.hasAnimations && !p.hasTransitions);
+          p.applyAnimationDuration = g.duration && p.hasAnimations;
+          p.applyTransitionDelay = ya(g.delay) && (p.applyTransitionDuration ||
+            p.hasTransitions);
+          p.applyAnimationDelay = ya(g.delay) && p.hasAnimations;
+          p.recalculateTimingStyles = 0 < S.length;
+          if (p.applyTransitionDuration || p.applyAnimationDuration) D = g.duration ? parseFloat(g.duration) : D, p.applyTransitionDuration && (p.hasTransitions = !0, r.transitionDuration = D, B = 0 < l.style[M + "Property"].length, y.push(La(D, B))), p.applyAnimationDuration && (p.hasAnimations = !0, r.animationDuration = D, y.push([Ca, D + "s"]));
+          if (0 === D && !p.recalculateTimingStyles) return h();
+          var ba = $(V, "-active");
+          if (null != g.delay) {
+            var ea;
+            "boolean" !== typeof g.delay && (ea = parseFloat(g.delay), W = Math.max(ea, 0));
+            p.applyTransitionDelay && y.push([na, ea + "s"]);
+            p.applyAnimationDelay && y.push([qa, ea + "s"])
+          }
+          null == g.duration && 0 < r.transitionDuration && (p.recalculateTimingStyles = p.recalculateTimingStyles || n);
+          G = 1E3 * W;
+          R = 1E3 * D;
+          g.skipBlocking || (p.blockTransition = 0 < r.transitionDuration, p.blockKeyframeAnimation = 0 < r.animationDuration && 0 < X.animationDelay && 0 === X.animationDuration);
+          g.from && (g.cleanupStyles && Ma(E, l, Object.keys(g.from)), Ia(a, g));
+          p.blockTransition ||
+            p.blockKeyframeAnimation ? u(D) : g.skipBlocking || ra.blockTransitions(l, !1);
+          return {
+            $$willAnimate: !0,
+            end: e,
+            start: function() {
+              if (!P) return A = {
+                end: e,
+                cancel: L,
+                resume: null,
+                pause: null
+              }, fa = new d(A), U(F), fa
+            }
+          }
+        }
+      }
+    ]
+  }]).provider("$$animateCssDriver", ["$$animationProvider", function(a) {
+    a.drivers.push("$$animateCssDriver");
+    this.$get = ["$animateCss", "$rootScope", "$$AnimateRunner", "$rootElement", "$sniffer", "$$jqLite", "$document", function(a, c, d, f, k, e, Q) {
+      function L(a) {
+        return a.replace(/\bng-\S+\b/g, "")
+      }
+
+      function x(a, b) {
+        G(a) &&
+          (a = a.split(" "));
+        G(b) && (b = b.split(" "));
+        return a.filter(function(a) {
+          return -1 === b.indexOf(a)
+        }).join(" ")
+      }
+
+      function C(c, e, f) {
+        function k(a) {
+          var b = {},
+            c = K(a).getBoundingClientRect();
+          s(["width", "height", "top", "left"], function(a) {
+            var d = c[a];
+            switch (a) {
+              case "top":
+                d += H.scrollTop;
+                break;
+              case "left":
+                d += H.scrollLeft
+            }
+            b[a] = Math.floor(d) + "px"
+          });
+          return b
+        }
+
+        function v() {
+          var c = L(f.attr("class") || ""),
+            d = x(c, q),
+            c = x(q, c),
+            d = a(h, {
+              to: k(f),
+              addClass: "ng-anchor-in " + d,
+              removeClass: "ng-anchor-out " + c,
+              delay: !0
+            });
+          return d.$$willAnimate ?
+            d : null
+        }
+
+        function C() {
+          h.remove();
+          e.removeClass("ng-animate-shim");
+          f.removeClass("ng-animate-shim")
+        }
+        var h = A(K(e).cloneNode(!0)),
+          q = L(h.attr("class") || "");
+        e.addClass("ng-animate-shim");
+        f.addClass("ng-animate-shim");
+        h.addClass("ng-anchor");
+        u.append(h);
+        var F;
+        c = function() {
+          var c = a(h, {
+            addClass: "ng-anchor-out",
+            delay: !0,
+            from: k(e)
+          });
+          return c.$$willAnimate ? c : null
+        }();
+        if (!c && (F = v(), !F)) return C();
+        var g = c || F;
+        return {
+          start: function() {
+            function a() {
+              c && c.end()
+            }
+            var b, c = g.start();
+            c.done(function() {
+              c = null;
+              if (!F && (F = v())) return c =
+                F.start(), c.done(function() {
+                  c = null;
+                  C();
+                  b.complete()
+                }), c;
+              C();
+              b.complete()
+            });
+            return b = new d({
+              end: a,
+              cancel: a
+            })
+          }
+        }
+      }
+
+      function z(a, b, c, e) {
+        var f = oa(a, N),
+          k = oa(b, N),
+          h = [];
+        s(e, function(a) {
+          (a = C(c, a.out, a["in"])) && h.push(a)
+        });
+        if (f || k || 0 !== h.length) return {
+          start: function() {
+            function a() {
+              s(b, function(a) {
+                a.end()
+              })
+            }
+            var b = [];
+            f && b.push(f.start());
+            k && b.push(k.start());
+            s(h, function(a) {
+              b.push(a.start())
+            });
+            var c = new d({
+              end: a,
+              cancel: a
+            });
+            d.all(b, function(a) {
+              c.complete(a)
+            });
+            return c
+          }
+        }
+      }
+
+      function oa(c) {
+        var d = c.element,
+          e = c.options || {};
+        c.structural && (e.event = c.event, e.structural = !0, e.applyClassesEarly = !0, "leave" === c.event && (e.onDone = e.domOperation));
+        e.preparationClasses && (e.event = ba(e.event, e.preparationClasses));
+        c = a(d, e);
+        return c.$$willAnimate ? c : null
+      }
+      if (!k.animations && !k.transitions) return N;
+      var H = Q[0].body;
+      c = K(f);
+      var u = A(c.parentNode && 11 === c.parentNode.nodeType || H.contains(c) ? c : H);
+      return function(a) {
+        return a.from && a.to ? z(a.from, a.to, a.classes, a.anchors) : oa(a)
+      }
+    }]
+  }]).provider("$$animateJs", ["$animateProvider", function(a) {
+    this.$get = ["$injector", "$$AnimateRunner", "$$jqLite", function(b, c, d) {
+      function f(c) {
+        c = Z(c) ? c : c.split(" ");
+        for (var d = [], f = {}, k = 0; k < c.length; k++) {
+          var s = c[k],
+            z = a.$$registeredAnimations[s];
+          z && !f[s] && (d.push(b.get(z)), f[s] = !0)
+        }
+        return d
+      }
+      var k = aa(d);
+      return function(a, b, d, x) {
+        function C() {
+          x.domOperation();
+          k(a, x)
+        }
+
+        function z(a, b, d, f, e) {
+          switch (d) {
+            case "animate":
+              b = [b, f.from, f.to, e];
+              break;
+            case "setClass":
+              b = [b, t, I, e];
+              break;
+            case "addClass":
+              b = [b, t, e];
+              break;
+            case "removeClass":
+              b = [b, I, e];
+              break;
+            default:
+              b = [b, e]
+          }
+          b.push(f);
+          if (a = a.apply(a,
+              b))
+            if (Ea(a.start) && (a = a.start()), a instanceof c) a.done(e);
+            else if (Ea(a)) return a;
+          return N
+        }
+
+        function A(a, b, d, e, f) {
+          var h = [];
+          s(e, function(e) {
+            var l = e[f];
+            l && h.push(function() {
+              var e, f, h = !1,
+                k = function(a) {
+                  h || (h = !0, (f || N)(a), e.complete(!a))
+                };
+              e = new c({
+                end: function() {
+                  k()
+                },
+                cancel: function() {
+                  k(!0)
+                }
+              });
+              f = z(l, a, b, d, function(a) {
+                k(!1 === a)
+              });
+              return e
+            })
+          });
+          return h
+        }
+
+        function H(a, b, d, e, f) {
+          var h = A(a, b, d, e, f);
+          if (0 === h.length) {
+            var k, q;
+            "beforeSetClass" === f ? (k = A(a, "removeClass", d, e, "beforeRemoveClass"), q = A(a, "addClass", d, e, "beforeAddClass")) :
+              "setClass" === f && (k = A(a, "removeClass", d, e, "removeClass"), q = A(a, "addClass", d, e, "addClass"));
+            k && (h = h.concat(k));
+            q && (h = h.concat(q))
+          }
+          if (0 !== h.length) return function(a) {
+            var b = [];
+            h.length && s(h, function(a) {
+              b.push(a())
+            });
+            b.length ? c.all(b, a) : a();
+            return function(a) {
+              s(b, function(b) {
+                a ? b.cancel() : b.end()
+              })
+            }
+          }
+        }
+        var u = !1;
+        3 === arguments.length && ta(d) && (x = d, d = null);
+        x = pa(x);
+        d || (d = a.attr("class") || "", x.addClass && (d += " " + x.addClass), x.removeClass && (d += " " + x.removeClass));
+        var t = x.addClass,
+          I = x.removeClass,
+          G = f(d),
+          K, v;
+        if (G.length) {
+          var M,
+            h;
+          "leave" === b ? (h = "leave", M = "afterLeave") : (h = "before" + b.charAt(0).toUpperCase() + b.substr(1), M = b);
+          "enter" !== b && "move" !== b && (K = H(a, b, x, G, h));
+          v = H(a, b, x, G, M)
+        }
+        if (K || v) {
+          var q;
+          return {
+            $$willAnimate: !0,
+            end: function() {
+              q ? q.end() : (u = !0, C(), ha(a, x), q = new c, q.complete(!0));
+              return q
+            },
+            start: function() {
+              function b(c) {
+                u = !0;
+                C();
+                ha(a, x);
+                q.complete(c)
+              }
+              if (q) return q;
+              q = new c;
+              var d, f = [];
+              K && f.push(function(a) {
+                d = K(a)
+              });
+              f.length ? f.push(function(a) {
+                C();
+                a(!0)
+              }) : C();
+              v && f.push(function(a) {
+                d = v(a)
+              });
+              q.setHost({
+                end: function() {
+                  u || ((d ||
+                    N)(void 0), b(void 0))
+                },
+                cancel: function() {
+                  u || ((d || N)(!0), b(!0))
+                }
+              });
+              c.chain(f, b);
+              return q
+            }
+          }
+        }
+      }
+    }]
+  }]).provider("$$animateJsDriver", ["$$animationProvider", function(a) {
+    a.drivers.push("$$animateJsDriver");
+    this.$get = ["$$animateJs", "$$AnimateRunner", function(a, c) {
+      function d(c) {
+        return a(c.element, c.event, c.classes, c.options)
+      }
+      return function(a) {
+        if (a.from && a.to) {
+          var b = d(a.from),
+            e = d(a.to);
+          if (b || e) return {
+            start: function() {
+              function a() {
+                return function() {
+                  s(d, function(a) {
+                    a.end()
+                  })
+                }
+              }
+              var d = [];
+              b && d.push(b.start());
+              e &&
+                d.push(e.start());
+              c.all(d, function(a) {
+                f.complete(a)
+              });
+              var f = new c({
+                end: a(),
+                cancel: a()
+              });
+              return f
+            }
+          }
+        } else return d(a)
+      }
+    }]
+  }])
+})(window, window.angular);
+//# sourceMappingURL=angular-animate.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/angular-aria.min.js b/public/tvox/js/angular-aria.min.js
new file mode 100644
index 0000000..7b818c7
--- /dev/null
+++ b/public/tvox/js/angular-aria.min.js
@@ -0,0 +1,173 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(t, l) {
+  'use strict';
+  var c = "BUTTON A INPUT TEXTAREA SELECT DETAILS SUMMARY".split(" "),
+    m = function(a, e) {
+      if (-1 !== e.indexOf(a[0].nodeName)) return !0
+    };
+  l.module("ngAria", ["ng"]).info({
+    angularVersion: "1.8.2"
+  }).provider("$aria", function() {
+    function a(a, c, n, g) {
+      return function(d, f, b) {
+        if (!b.hasOwnProperty("ngAriaDisable")) {
+          var p = b.$normalize(c);
+          !e[p] || m(f, n) || b[p] || d.$watch(b[a], function(b) {
+            b = g ? !b : !!b;
+            f.attr(c, b)
+          })
+        }
+      }
+    }
+    var e = {
+      ariaHidden: !0,
+      ariaChecked: !0,
+      ariaReadonly: !0,
+      ariaDisabled: !0,
+      ariaRequired: !0,
+      ariaInvalid: !0,
+      ariaValue: !0,
+      tabindex: !0,
+      bindKeydown: !0,
+      bindRoleForClick: !0
+    };
+    this.config = function(a) {
+      e = l.extend(e, a)
+    };
+    this.$get = function() {
+      return {
+        config: function(a) {
+          return e[a]
+        },
+        $$watchExpr: a
+      }
+    }
+  }).directive("ngShow", ["$aria", function(a) {
+    return a.$$watchExpr("ngShow", "aria-hidden", [], !0)
+  }]).directive("ngHide", ["$aria", function(a) {
+    return a.$$watchExpr("ngHide", "aria-hidden", [], !1)
+  }]).directive("ngValue", ["$aria", function(a) {
+    return a.$$watchExpr("ngValue", "aria-checked", c, !1)
+  }]).directive("ngChecked", ["$aria", function(a) {
+    return a.$$watchExpr("ngChecked",
+      "aria-checked", c, !1)
+  }]).directive("ngReadonly", ["$aria", function(a) {
+    return a.$$watchExpr("ngReadonly", "aria-readonly", c, !1)
+  }]).directive("ngRequired", ["$aria", function(a) {
+    return a.$$watchExpr("ngRequired", "aria-required", c, !1)
+  }]).directive("ngModel", ["$aria", function(a) {
+    function e(e, g, d, f) {
+      return a.config(g) && !d.attr(e) && (f || !m(d, c)) && ("hidden" !== d.attr("type") || "INPUT" !== d[0].nodeName)
+    }
+
+    function k(a, e) {
+      return !e.attr("role") && e.attr("type") === a && !m(e, c)
+    }
+
+    function h(a, e) {
+      var d = a.type,
+        f = a.role;
+      return "checkbox" ===
+        (d || f) || "menuitemcheckbox" === f ? "checkbox" : "radio" === (d || f) || "menuitemradio" === f ? "radio" : "range" === d || "progressbar" === f || "slider" === f ? "range" : ""
+    }
+    return {
+      restrict: "A",
+      require: "ngModel",
+      priority: 200,
+      compile: function(c, g) {
+        if (!g.hasOwnProperty("ngAriaDisable")) {
+          var d = h(g, c);
+          return {
+            post: function(f, b, c, g) {
+              function h() {
+                return g.$modelValue
+              }
+
+              function m(a) {
+                b.attr("aria-checked", c.value == g.$viewValue)
+              }
+
+              function n() {
+                b.attr("aria-checked", !g.$isEmpty(g.$viewValue))
+              }
+              var l = e("tabindex", "tabindex", b, !1);
+              switch (d) {
+                case "radio":
+                case "checkbox":
+                  k(d,
+                    b) && b.attr("role", d);
+                  e("aria-checked", "ariaChecked", b, !1) && f.$watch(h, "radio" === d ? m : n);
+                  l && b.attr("tabindex", 0);
+                  break;
+                case "range":
+                  k(d, b) && b.attr("role", "slider");
+                  if (a.config("ariaValue")) {
+                    var q = !b.attr("aria-valuemin") && (c.hasOwnProperty("min") || c.hasOwnProperty("ngMin")),
+                      r = !b.attr("aria-valuemax") && (c.hasOwnProperty("max") || c.hasOwnProperty("ngMax")),
+                      s = !b.attr("aria-valuenow");
+                    q && c.$observe("min", function(a) {
+                      b.attr("aria-valuemin", a)
+                    });
+                    r && c.$observe("max", function(a) {
+                      b.attr("aria-valuemax", a)
+                    });
+                    s && f.$watch(h, function(a) {
+                      b.attr("aria-valuenow", a)
+                    })
+                  }
+                  l && b.attr("tabindex", 0)
+              }!c.hasOwnProperty("ngRequired") && g.$validators.required && e("aria-required", "ariaRequired", b, !1) && c.$observe("required", function() {
+                b.attr("aria-required", !!c.required)
+              });
+              e("aria-invalid", "ariaInvalid", b, !0) && f.$watch(function() {
+                return g.$invalid
+              }, function(a) {
+                b.attr("aria-invalid", !!a)
+              })
+            }
+          }
+        }
+      }
+    }
+  }]).directive("ngDisabled", ["$aria", function(a) {
+    return a.$$watchExpr("ngDisabled", "aria-disabled", c, !1)
+  }]).directive("ngMessages", function() {
+    return {
+      restrict: "A",
+      require: "?ngMessages",
+      link: function(a, c, k, h) {
+        k.hasOwnProperty("ngAriaDisable") || c.attr("aria-live") || c.attr("aria-live", "assertive")
+      }
+    }
+  }).directive("ngClick", ["$aria", "$parse", function(a, e) {
+    return {
+      restrict: "A",
+      compile: function(k, h) {
+        if (!h.hasOwnProperty("ngAriaDisable")) {
+          var l = e(h.ngClick);
+          return function(e, d, f) {
+            if (!m(d, c) && (a.config("bindRoleForClick") && !d.attr("role") && d.attr("role", "button"), a.config("tabindex") && !d.attr("tabindex") && d.attr("tabindex", 0), a.config("bindKeydown") && !f.ngKeydown && !f.ngKeypress &&
+                !f.ngKeyup)) d.on("keydown", function(a) {
+              function d() {
+                l(e, {
+                  $event: a
+                })
+              }
+              var f = a.which || a.keyCode;
+              if (13 === f || 32 === f) - 1 !== c.indexOf(a.target.nodeName) || a.target.isContentEditable || a.preventDefault(), e.$apply(d)
+            })
+          }
+        }
+      }
+    }
+  }]).directive("ngDblclick", ["$aria", function(a) {
+    return function(e, k, h) {
+      h.hasOwnProperty("ngAriaDisable") || !a.config("tabindex") || k.attr("tabindex") || m(k, c) || k.attr("tabindex", 0)
+    }
+  }])
+})(window, window.angular);
+//# sourceMappingURL=angular-aria.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/angular-cookies.min.js b/public/tvox/js/angular-cookies.min.js
new file mode 100644
index 0000000..bd0c542
--- /dev/null
+++ b/public/tvox/js/angular-cookies.min.js
@@ -0,0 +1,62 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(n, e) {
+  'use strict';
+
+  function m(d, k, l) {
+    var a = l.baseHref(),
+      h = d[0];
+    return function(f, b, c) {
+      var d, g;
+      c = c || {};
+      g = c.expires;
+      d = e.isDefined(c.path) ? c.path : a;
+      e.isUndefined(b) && (g = "Thu, 01 Jan 1970 00:00:00 GMT", b = "");
+      e.isString(g) && (g = new Date(g));
+      b = encodeURIComponent(f) + "=" + encodeURIComponent(b);
+      b = b + (d ? ";path=" + d : "") + (c.domain ? ";domain=" + c.domain : "");
+      b += g ? ";expires=" + g.toUTCString() : "";
+      b += c.secure ? ";secure" : "";
+      b += c.samesite ? ";samesite=" + c.samesite : "";
+      c = b.length + 1;
+      4096 < c && k.warn("Cookie '" + f + "' possibly not set or overflowed because it was too large (" +
+        c + " > 4096 bytes)!");
+      h.cookie = b
+    }
+  }
+  e.module("ngCookies", ["ng"]).info({
+    angularVersion: "1.8.2"
+  }).provider("$cookies", [function() {
+    var d = this.defaults = {};
+    this.$get = ["$$cookieReader", "$$cookieWriter", function(k, l) {
+      return {
+        get: function(a) {
+          return k()[a]
+        },
+        getObject: function(a) {
+          return (a = this.get(a)) ? e.fromJson(a) : a
+        },
+        getAll: function() {
+          return k()
+        },
+        put: function(a, h, f) {
+          l(a, h, f ? e.extend({}, d, f) : d)
+        },
+        putObject: function(a, d, f) {
+          this.put(a, e.toJson(d), f)
+        },
+        remove: function(a, h) {
+          l(a, void 0, h ? e.extend({}, d, h) : d)
+        }
+      }
+    }]
+  }]);
+  m.$inject = ["$document", "$log", "$browser"];
+  e.module("ngCookies").provider("$$cookieWriter", function() {
+    this.$get = m
+  })
+})(window, window.angular);
+//# sourceMappingURL=angular-cookies.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/angular-material.min.js b/public/tvox/js/angular-material.min.js
new file mode 100644
index 0000000..5cf07f8
--- /dev/null
+++ b/public/tvox/js/angular-material.min.js
@@ -0,0 +1,11685 @@
+/*!
+ * AngularJS Material Design
+ * https://github.com/angular/material
+ * @license MIT
+ * v1.2.2
+ */
+! function(L, be, ge) {
+  "use strict";
+
+  function e(e, t) {
+    if (t.has("$swipe")) {
+      e.warn("You are using the ngTouch module. \nAngularJS Material already has mobile click, tap, and swipe support... \nngTouch is not supported with AngularJS Material!")
+    }
+  }
+
+  function t(e, t) {
+    e.decorator("$$rAF", ["$delegate", n]), e.decorator("$q", ["$delegate", o]), t.theme("default").primaryPalette("indigo").accentPalette("pink").warnPalette("deep-orange").backgroundPalette("grey")
+  }
+
+  function n(i) {
+    return i.throttle = function(e) {
+      var t, n, o, r;
+      return function() {
+        t = arguments, r = this, o = e, n || (n = !0, i(function() {
+          o.apply(r, Array.prototype.slice.call(t)), n = !1
+        }))
+      }
+    }, i
+  }
+
+  function o(e) {
+    return e.resolve || (e.resolve = e.when), e
+  }
+
+  function r(i) {
+    return {
+      restrict: "A",
+      link: {
+        pre: function(e, t, n) {
+          var o = n.mdAutoFocus || n.mdAutofocus || n.mdSidenavFocus;
+          r(i(o)(e)), o && e.$watch(o, r);
+
+          function r(e) {
+            be.isUndefined(e) && (e = !0), t.toggleClass("md-autofocus", !!e)
+          }
+        }
+      }
+    }
+  }
+
+  function i(e, d) {
+    function s() {
+      return !0
+    }
+    e && !be.isArray(e) && (e = Array.prototype.slice.call(e)), d = !!d;
+    var l = e || [];
+    return {
+      items: function() {
+        return [].concat(l)
+      },
+      count: function() {
+        return l.length
+      },
+      inRange: c,
+      contains: t,
+      indexOf: m,
+      itemAt: function(e) {
+        return c(e) ? l[e] : null
+      },
+      findBy: function(t, n) {
+        return l.filter(function(e) {
+          return e[t] === n
+        })
+      },
+      add: function(e, t) {
+        if (!e) return -1;
+        be.isNumber(t) || (t = l.length);
+        return l.splice(t, 0, e), m(e)
+      },
+      remove: function(e) {
+        t(e) && l.splice(m(e), 1)
+      },
+      first: u,
+      last: p,
+      next: be.bind(null, n, !1),
+      previous: be.bind(null, n, !0),
+      hasPrevious: function(e) {
+        return !!e && c(m(e) - 1)
+      },
+      hasNext: function(e) {
+        return !!e && c(m(e) + 1)
+      }
+    };
+
+    function c(e) {
+      return l.length && -1 < e && e < l.length
+    }
+
+    function m(e) {
+      return l.indexOf(e)
+    }
+
+    function t(e) {
+      return e && -1 < m(e)
+    }
+
+    function u() {
+      return l.length ? l[0] : null
+    }
+
+    function p() {
+      return l.length ? l[l.length - 1] : null
+    }
+
+    function n(e, t, n, o) {
+      n = n || s;
+      for (var r = m(t);;) {
+        if (!c(r)) return null;
+        var i = r + (e ? -1 : 1),
+          a = null;
+        if (c(i) ? a = l[i] : d && (i = m(a = e ? p() : u())), null === a || i === o) return null;
+        if (n(a)) return a;
+        be.isUndefined(o) && (o = i), r = i
+      }
+    }
+  }
+
+  function a(a, t, o) {
+    var i = {},
+      d = {},
+      r = {},
+      n = {};
+    return e.getResponsiveAttribute = function(e, t) {
+      for (var n = 0; n < a.MEDIA_PRIORITY.length; n++) {
+        var o = a.MEDIA_PRIORITY[n];
+        if (d[i[o]].matches) {
+          var r = l(e, t + "-" + o);
+          if (e[r]) return e[r]
+        }
+      }
+      return e[l(e, t)]
+    }, e.getQuery = function(e) {
+      return d[e]
+    }, e.watchResponsiveAttributes = function(e, o, r) {
+      var i = [];
+      return e.forEach(function(e) {
+          var t = l(o, e);
+          for (var n in be.isDefined(o[t]) && i.push(o.$observe(t, be.bind(void 0, r, null))), a.MEDIA) t = l(o, e + "-" + n), be.isDefined(o[t]) && i.push(o.$observe(t, be.bind(void 0, r, n)))
+        }),
+        function() {
+          i.forEach(function(e) {
+            e()
+          })
+        }
+    }, e;
+
+    function e(e) {
+      var t = i[e];
+      be.isUndefined(t) && (t = i[e] = function(e) {
+        return a.MEDIA[e] || ("(" !== e.charAt(0) ? "(" + e + ")" : e)
+      }(e));
+      var n = r[t];
+      return be.isUndefined(n) && (n = function(e) {
+        var t = d[e];
+        t = t || (d[e] = o.matchMedia(e));
+        return t.addListener(s), r[t.media] = !!t.matches
+      }(t)), n
+    }
+
+    function s(e) {
+      t.$evalAsync(function() {
+        r[e.media] = !!e.matches
+      })
+    }
+
+    function l(e, t) {
+      return n[t] || (n[t] = e.$normalize(t))
+    }
+  }
+
+  function d(e, t) {
+    var o = ["data", "x"];
+    return e ? t ? n(e) : r(e) : {
+      buildList: r,
+      buildSelector: n,
+      hasAttribute: function(e, t) {
+        if (!(e = i(e))) return !1;
+        for (var n = r(t), o = 0; o < n.length; o++)
+          if (e.hasAttribute(n[o])) return !0;
+        return !1
+      },
+      removeAttribute: function(t, e) {
+        if (!(t = i(t))) return;
+        r(e).forEach(function(e) {
+          t.removeAttribute(e)
+        })
+      }
+    };
+
+    function r(n) {
+      return (n = be.isArray(n) ? n : [n]).forEach(function(t) {
+        o.forEach(function(e) {
+          n.push(e + "-" + t)
+        })
+      }), n
+    }
+
+    function n(e) {
+      return r(e = be.isArray(e) ? e : [e]).map(function(e) {
+        return "[" + e + "]"
+      }).join(",")
+    }
+
+    function i(e) {
+      if ((e = e[0] || e).nodeType) return e
+    }
+  }
+
+  function A(e) {
+    return e.replace(/-[a-z]/g, function(e) {
+      return e.charAt(1).toUpperCase()
+    })
+  }
+  var w, _, k, x, N, s, l, c, m, u, p, h, f, b, g, E, v, $, M, y, C, T;
+
+  function S(o, r, s, i) {
+    var a = this.showWarnings;
+    return {
+      expect: d,
+      expectAsync: l,
+      expectWithText: function(e, t) {
+        var n = c(e) || ""; - 1 < n.indexOf(i.startSymbol()) ? l(e, t, function() {
+          return c(e)
+        }) : d(e, t, n)
+      },
+      expectWithoutText: function(e, t) {
+        var n = c(e); - 1 < n.indexOf(i.startSymbol()) || n || d(e, t, n)
+      },
+      getText: c,
+      hasAriaLabel: m,
+      parentHasAriaLabel: function e(t, n) {
+        n = n || 1;
+        var o = be.element(t)[0] || t;
+        if (!o.parentNode) return !1;
+        if (r(o.parentNode)) return !0;
+        n--;
+        if (n) return e(o.parentNode, n);
+        return !1;
+
+        function r(e) {
+          if (!m(e)) return !1;
+          if (e.hasAttribute("role")) switch (e.getAttribute("role").toLowerCase()) {
+            case "command":
+            case "definition":
+            case "directory":
+            case "grid":
+            case "list":
+            case "listitem":
+            case "log":
+            case "marquee":
+            case "menu":
+            case "menubar":
+            case "note":
+            case "presentation":
+            case "separator":
+            case "scrollbar":
+            case "status":
+            case "tablist":
+              return !1
+          }
+          switch (e.tagName.toLowerCase()) {
+            case "abbr":
+            case "acronym":
+            case "address":
+            case "applet":
+            case "audio":
+            case "b":
+            case "bdi":
+            case "bdo":
+            case "big":
+            case "blockquote":
+            case "br":
+            case "canvas":
+            case "caption":
+            case "center":
+            case "cite":
+            case "code":
+            case "col":
+            case "data":
+            case "dd":
+            case "del":
+            case "dfn":
+            case "dir":
+            case "div":
+            case "dl":
+            case "em":
+            case "embed":
+            case "fieldset":
+            case "figcaption":
+            case "font":
+            case "h1":
+            case "h2":
+            case "h3":
+            case "h4":
+            case "h5":
+            case "h6":
+            case "hgroup":
+            case "html":
+            case "i":
+            case "ins":
+            case "isindex":
+            case "kbd":
+            case "keygen":
+            case "label":
+            case "legend":
+            case "li":
+            case "map":
+            case "mark":
+            case "menu":
+            case "object":
+            case "ol":
+            case "output":
+            case "pre":
+            case "presentation":
+            case "q":
+            case "rt":
+            case "ruby":
+            case "samp":
+            case "small":
+            case "source":
+            case "span":
+            case "status":
+            case "strike":
+            case "strong":
+            case "sub":
+            case "sup":
+            case "svg":
+            case "tbody":
+            case "td":
+            case "th":
+            case "thead":
+            case "time":
+            case "tr":
+            case "track":
+            case "tt":
+            case "ul":
+            case "var":
+              return !1
+          }
+          return !0
+        }
+      }
+    };
+
+    function d(e, t, n) {
+      var o = be.element(e)[0] || e;
+      !o || o.hasAttribute(t) && 0 !== o.getAttribute(t).length || function(e, t) {
+        var n = e.hasChildNodes(),
+          o = !1;
+        if (n)
+          for (var r = e.childNodes, i = 0; i < r.length; i++) {
+            var a = r[i];
+            1 === a.nodeType && a.hasAttribute(t) && "none" !== ((d = a).currentStyle ? d.currentStyle : s.getComputedStyle(d)).display && (o = !0)
+          }
+        var d;
+        return o
+      }(o, t) || ((n = be.isString(n) ? n.trim() : "").length ? e.attr(t, n) : a && r.warn('ARIA: Attribute "', t, '", required for accessibility, is missing on node:', o))
+    }
+
+    function l(e, t, n) {
+      o(function() {
+        d(e, t, n())
+      })
+    }
+
+    function c(t) {
+      t = t[0] || t;
+      for (var e, n = document.createTreeWalker(t, NodeFilter.SHOW_TEXT, null, !1), o = ""; e = n.nextNode();) r(e) || (o += e.textContent);
+      return o.trim() || "";
+
+      function r(e) {
+        for (; e.parentNode && (e = e.parentNode) !== t;)
+          if (e.getAttribute && "true" === e.getAttribute("aria-hidden")) return !0
+      }
+    }
+
+    function m(e) {
+      var t = be.element(e)[0] || e;
+      return !!t.hasAttribute && (t.hasAttribute("aria-label") || t.hasAttribute("aria-labelledby") || t.hasAttribute("aria-describedby"))
+    }
+  }
+
+  function D() {
+    function i(e, t, n, o, r) {
+      this.$q = e, this.$templateRequest = t, this.$injector = n, this.$compile = o, this.$controller = r
+    }
+    this.$get = ["$q", "$templateRequest", "$injector", "$compile", "$controller", function(e, t, n, o, r) {
+      return new i(e, t, n, o, r)
+    }], i.prototype.compile = function(e) {
+      return e.contentElement ? this._prepareContentElement(e) : this._compileTemplate(e)
+    }, i.prototype._prepareContentElement = function(e) {
+      var t = this._fetchContentElement(e);
+      return this.$q.resolve({
+        element: t.element,
+        cleanup: t.restore,
+        locals: {},
+        link: function() {
+          return t.element
+        }
+      })
+    }, i.prototype._compileTemplate = function(o) {
+      var r = this,
+        e = o.templateUrl,
+        t = o.template || "",
+        n = be.extend({}, o.resolve),
+        i = be.extend({}, o.locals),
+        a = o.transformTemplate || be.identity;
+      return be.forEach(n, function(e, t) {
+        be.isString(e) ? n[t] = r.$injector.get(e) : n[t] = r.$injector.invoke(e)
+      }), be.extend(n, i), n.$$ngTemplate = e ? this.$templateRequest(e) : this.$q.when(t), this.$q.all(n).then(function(e) {
+        var t = a(e.$$ngTemplate, o),
+          n = o.element || be.element("<div>").html(t.trim()).contents();
+        return r._compileElement(e, n, o)
+      })
+    }, i.prototype._compileElement = function(o, r, i) {
+      var a = this,
+        d = this.$compile(r),
+        s = {
+          element: r,
+          cleanup: r.remove.bind(r),
+          locals: o,
+          link: function(e) {
+            if (o.$scope = e, i.controller) {
+              var t = be.extend({}, o, {
+                  $element: r
+                }),
+                n = a._createController(i, t, o);
+              be.isFunction(n.$onDestroy) && e.$on("$destroy", function() {
+                be.isFunction(n.$onDestroy) && n.$onDestroy()
+              }), r.data("$ngControllerController", n), r.children().data("$ngControllerController", n), s.controller = n
+            }
+            return d(e)
+          }
+        };
+      return s
+    }, i.prototype._createController = function(e, t, n) {
+      var o = this.$controller(e.controller, t);
+      return e.bindToController && be.extend(o, n), e.controllerAs && (t.$scope[e.controllerAs] = o), be.isFunction(o.$onInit) && o.$onInit(), o
+    }, i.prototype._fetchContentElement = function(e) {
+      var t, n = e.contentElement;
+      return t = be.isString(n) ? o(n = document.querySelector(n)) : (n = n[0] || n, document.contains(n) ? o(n) : function() {
+        n.parentNode && n.parentNode.removeChild(n)
+      }), {
+        element: be.element(n),
+        restore: t
+      };
+
+      function o(e) {
+        var t = e.parentNode,
+          n = e.nextElementSibling;
+        return function() {
+          n ? t.insertBefore(e, n) : t.appendChild(e)
+        }
+      }
+    }
+  }
+
+  function H(e, t, n) {
+    this.$timeout = e, this.$mdUtil = t, this.$rootScope = n, this.pointerEvent = "MSPointerEvent" in L ? "MSPointerDown" : "PointerEvent" in L ? "pointerdown" : null, this.bodyElement = be.element(document.body), this.isBuffering = !1, this.bufferTimeout = null, this.lastInteractionType = null, this.lastInteractionTime = null, this.inputHandler = this.onInputEvent.bind(this), this.bufferedInputHandler = this.onBufferInputEvent.bind(this), this.inputEventMap = {
+      keydown: "keyboard",
+      mousedown: "mouse",
+      mouseenter: "mouse",
+      touchstart: "touch",
+      pointerdown: "pointer",
+      MSPointerDown: "pointer"
+    }, this.iePointerMap = {
+      2: "touch",
+      3: "touch",
+      4: "mouse"
+    }, this.initializeEvents(), this.$rootScope.$on("$destroy", this.deregister.bind(this))
+  }
+
+  function I(e) {
+    return e.replace(h, "").replace(f, function(e, t, n, o) {
+      return o ? n.toUpperCase() : n
+    })
+  }
+
+  function O() {
+    var e = !!document.querySelector("[md-layouts-disabled]");
+    T.enabled = !e
+  }
+
+  function P() {
+    return T.enabled = !1, {
+      restrict: "A",
+      priority: "900"
+    }
+  }
+
+  function R(o) {
+    return ["$mdUtil", "$interpolate", "$log", function(e, t, n) {
+      return l = e, c = t, m = n, {
+        restrict: "A",
+        compile: function(e, t) {
+          var n;
+          return T.enabled && (B(o, z(o, t, ""), U(e, o, t)), r(null, e), n = r), n || be.noop
+        }
+      }
+    }];
+
+    function r(e, t) {
+      t.addClass(o)
+    }
+  }
+
+  function F(e, t, n, o) {
+    var r, i = n[0].nodeName.toLowerCase();
+    switch (e.replace(E, "")) {
+      case "flex":
+        "md-button" !== i && "fieldset" !== i || (r = "<" + i + " " + e + "></" + i + ">", "https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers", "Markup '{0}' may not work as expected in IE Browsers. Consult '{1}' for details.", o.warn(l.supplant("Markup '{0}' may not work as expected in IE Browsers. Consult '{1}' for details.", [r, "https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers"])))
+    }
+  }
+
+  function B(e, t, n) {
+    var o = t;
+    if (!j(t)) {
+      switch (e.replace(E, "")) {
+        case "layout":
+          q(t, M) || (t = M[0]);
+          break;
+        case "flex":
+          q(t, $) || isNaN(t) && (t = "");
+          break;
+        case "flex-offset":
+        case "flex-order":
+          t && !isNaN(+t) || (t = "0");
+          break;
+        case "layout-align":
+          var r = function(e) {
+            var t, n = {
+              main: "start",
+              cross: "stretch"
+            };
+            0 !== (e = e || "").indexOf("-") && 0 !== e.indexOf(" ") || (e = "none" + e);
+            (t = e.toLowerCase().trim().replace(v, "-").split("-")).length && "space" === t[0] && (t = [t[0] + "-" + t[1], t[2]]);
+            0 < t.length && (n.main = t[0] || n.main);
+            1 < t.length && (n.cross = t[1] || n.cross);
+            y.indexOf(n.main) < 0 && (n.main = "start");
+            C.indexOf(n.cross) < 0 && (n.cross = "stretch");
+            return n
+          }(t);
+          t = l.supplant("{main}-{cross}", r);
+          break;
+        case "layout-padding":
+        case "layout-margin":
+        case "layout-fill":
+        case "layout-wrap":
+        case "layout-nowrap":
+          t = ""
+      }
+      t !== o && (n || be.noop)(t)
+    }
+    return t ? t.trim() : ""
+  }
+
+  function U(e, t, n) {
+    return function(e) {
+      j(e) || (n[n.$normalize(t)] = e)
+    }
+  }
+
+  function j(e) {
+    return -1 < (e || "").indexOf(c.startSymbol())
+  }
+
+  function z(e, t, n) {
+    var o = t.$normalize(e);
+    return t[o] ? t[o].trim().replace(v, "-") : n || null
+  }
+
+  function q(t, e, n) {
+    t = n && t ? t.replace(v, n) : t;
+    var o = !1;
+    return t && e.forEach(function(e) {
+      e = n ? e.replace(v, n) : e, o = o || e === t
+    }), o
+  }
+
+  function V(e) {
+    this._$timeout = e, this._liveElement = this._createLiveElement(), this._announceTimeout = 100
+  }
+
+  function W(n, o) {
+    var r, i = [],
+      a = {};
+    return r = {
+      notFoundError: function(e, t) {
+        n.error((t || "") + "No instance found for handle", e)
+      },
+      getInstances: function() {
+        return i
+      },
+      get: function(e) {
+        if (!d(e)) return null;
+        var t, n, o;
+        for (t = 0, n = i.length; t < n; t++)
+          if ((o = i[t]).$$mdHandle === e) return o;
+        return null
+      },
+      register: function(t, e) {
+        return e ? (t.$$mdHandle = e, i.push(t), (n = a[e]) && (n.forEach(function(e) {
+          e.resolve(t)
+        }), delete a[e]), function() {
+          var e = i.indexOf(t); - 1 !== e && i.splice(e, 1)
+        }) : be.noop;
+        var n
+      },
+      when: function(e) {
+        if (d(e)) {
+          var t = o.defer(),
+            n = r.get(e);
+          return n ? t.resolve(n) : (a[e] === ge && (a[e] = []), a[e].push(t)), t.promise
+        }
+        return o.reject("Invalid `md-component-id` value.")
+      }
+    };
+
+    function d(e) {
+      return e && "" !== e
+    }
+  }
+
+  function Y(o) {
+    return {
+      attach: function(e, t, n) {
+        return n = be.extend(function(e) {
+          return e.hasClass("md-icon-button") ? {
+            isMenuItem: e.hasClass("md-menu-item"),
+            fitRipple: !0,
+            center: !0
+          } : {
+            isMenuItem: e.hasClass("md-menu-item"),
+            dimBackground: !0
+          }
+        }(t), n), o.attach(e, t, n)
+      }
+    }
+  }
+
+  function K(o) {
+    return {
+      attach: function(e, t, n) {
+        return o.attach(e, t, be.extend({
+          center: !0,
+          dimBackground: !1,
+          fitRipple: !0
+        }, n))
+      }
+    }
+  }
+
+  function G(o) {
+    return {
+      attach: function(e, t, n) {
+        return o.attach(e, t, be.extend({
+          center: !1,
+          dimBackground: !0,
+          outline: !1,
+          rippleSize: "full"
+        }, n))
+      }
+    }
+  }
+
+  function X(o) {
+    return {
+      attach: function(e, t, n) {
+        return o.attach(e, t, be.extend({
+          center: !1,
+          dimBackground: !0,
+          outline: !1,
+          rippleSize: "full"
+        }, n))
+      }
+    }
+  }
+
+  function Z(l) {
+    var c = "virtual",
+      t = ["standard", c];
+
+    function m(e) {
+      return e ? (e = e.toLowerCase(), -1 < t.indexOf(e) ? e : c) : c
+    }
+    return {
+      controller: "MdAutocompleteCtrl",
+      controllerAs: "$mdAutocompleteCtrl",
+      scope: {
+        inputName: "@mdInputName",
+        inputMinlength: "@mdInputMinlength",
+        inputMaxlength: "@mdInputMaxlength",
+        searchText: "=?mdSearchText",
+        selectedItem: "=?mdSelectedItem",
+        itemsExpr: "@mdItems",
+        itemText: "&mdItemText",
+        placeholder: "@placeholder",
+        inputAriaDescribedBy: "@?inputAriaDescribedby",
+        inputAriaLabelledBy: "@?inputAriaLabelledby",
+        inputAriaLabel: "@?inputAriaLabel",
+        noCache: "=?mdNoCache",
+        requireMatch: "=?mdRequireMatch",
+        selectOnMatch: "=?mdSelectOnMatch",
+        matchInsensitive: "=?mdMatchCaseInsensitive",
+        itemChange: "&?mdSelectedItemChange",
+        textChange: "&?mdSearchTextChange",
+        minLength: "=?mdMinLength",
+        delay: "=?mdDelay",
+        autofocus: "=?mdAutofocus",
+        floatingLabel: "@?mdFloatingLabel",
+        autoselect: "=?mdAutoselect",
+        menuClass: "@?mdMenuClass",
+        menuContainerClass: "@?mdMenuContainerClass",
+        inputClass: "@?mdInputClass",
+        inputId: "@?mdInputId",
+        escapeOptions: "@?mdEscapeOptions",
+        dropdownItems: "=?mdDropdownItems",
+        dropdownPosition: "@?mdDropdownPosition",
+        clearButton: "=?mdClearButton",
+        selectedMessage: "@?mdSelectedMessage",
+        noMatchMessage: "@?mdNoMatchMessage",
+        singleMatchMessage: "@?mdSingleMatchMessage",
+        multipleMatchStartMessage: "@?mdMultipleMatchStartMessage",
+        multipleMatchEndMessage: "@?mdMultipleMatchEndMessage",
+        mdMode: "=?mdMode"
+      },
+      compile: function(e, n) {
+        var o = e.find("input");
+        return ["md-select-on-focus", "md-no-asterisk", "ng-trim", "ng-pattern"].forEach(function(e) {
+            var t = n[n.$normalize(e)];
+            null !== t && o.attr(e, t)
+          }),
+          function(e, t, n, o) {
+            o.hasNotFound = !!t.attr("md-has-not-found"), be.isDefined(n.mdClearButton) || e.floatingLabel || (e.clearButton = !0), e.mdMode = m(n.mdMode), t.on("click touchstart touchend", function(e) {
+              e.stopPropagation()
+            })
+          }
+      },
+      template: function(n, e) {
+        var t, o, r = (t = n.find("md-not-found").detach(), (o = t.length ? t.html() : "") ? '<li ng-if="$mdAutocompleteCtrl.notFoundVisible()" class="md-autocomplete-suggestion"                         md-autocomplete-parent-scope>' + o + "</li>" : ""),
+          i = function() {
+            var e = n.find("md-item-template").detach(),
+              t = e.length ? e.html() : n.html();
+            e.length || n.empty();
+            return "<md-autocomplete-parent-scope md-autocomplete-replace>" + t + "</md-autocomplete-parent-scope>"
+          }(),
+          a = n.html(),
+          d = e.tabindex;
+        return r && n.attr("md-has-not-found", !0), n.attr("tabindex", "-1"), "        <md-autocomplete-wrap            ng-class=\"{ 'md-whiteframe-z1': !floatingLabel,                         'md-menu-showing': !$mdAutocompleteCtrl.hidden,                         'md-show-clear-button': !!clearButton }\">          " + (e.mdFloatingLabel ? '            <md-input-container ng-if="floatingLabel">              <label>{{floatingLabel}}</label>              <input type="text"                ' + (null != d ? 'tabindex="' + d + '"' : "") + '                id="{{inputId || \'fl-input-\' + $mdAutocompleteCtrl.id}}"                name="{{inputName || \'fl-input-\' + $mdAutocompleteCtrl.id }}"                ng-class="::inputClass"                autocomplete="off"                ng-required="$mdAutocompleteCtrl.isRequired"                ng-readonly="$mdAutocompleteCtrl.isReadonly"                ng-minlength="inputMinlength"                ng-maxlength="inputMaxlength"                ng-disabled="$mdAutocompleteCtrl.isDisabled"                ng-model="$mdAutocompleteCtrl.scope.searchText"                ng-model-options="{ allowInvalid: true }"                ng-mousedown="$mdAutocompleteCtrl.focusInput()"                ng-keydown="$mdAutocompleteCtrl.keydown($event)"                ng-blur="$mdAutocompleteCtrl.blur($event)"                ng-focus="$mdAutocompleteCtrl.focus($event)"                aria-label="{{floatingLabel}}"                ng-attr-aria-autocomplete="{{$mdAutocompleteCtrl.isDisabled ? undefined : \'list\'}}"                ng-attr-role="{{$mdAutocompleteCtrl.isDisabled ? undefined : \'combobox\'}}"                aria-haspopup="{{!$mdAutocompleteCtrl.isDisabled}}"                aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"                ng-attr-aria-owns="{{$mdAutocompleteCtrl.hidden || $mdAutocompleteCtrl.isDisabled ? undefined : \'ul-\' + $mdAutocompleteCtrl.id}}"                ng-attr-aria-activedescendant="{{!$mdAutocompleteCtrl.hidden && $mdAutocompleteCtrl.activeOption ? $mdAutocompleteCtrl.activeOption : undefined}}">              <div md-autocomplete-parent-scope md-autocomplete-replace>' + a + "</div>            </md-input-container>" : '            <input type="text"              ' + (null != d ? 'tabindex="' + d + '"' : "") + '              id="{{inputId || \'input-\' + $mdAutocompleteCtrl.id}}"              name="{{inputName || \'input-\' + $mdAutocompleteCtrl.id }}"              ng-class="::inputClass"              ng-if="!floatingLabel"              autocomplete="off"              ng-required="$mdAutocompleteCtrl.isRequired"              ng-disabled="$mdAutocompleteCtrl.isDisabled"              ng-readonly="$mdAutocompleteCtrl.isReadonly"              ng-minlength="inputMinlength"              ng-maxlength="inputMaxlength"              ng-model="$mdAutocompleteCtrl.scope.searchText"              ng-mousedown="$mdAutocompleteCtrl.focusInput()"              ng-keydown="$mdAutocompleteCtrl.keydown($event)"              ng-blur="$mdAutocompleteCtrl.blur($event)"              ng-focus="$mdAutocompleteCtrl.focus($event)"              placeholder="{{placeholder}}"              aria-label="{{placeholder}}"              ng-attr-aria-autocomplete="{{$mdAutocompleteCtrl.isDisabled ? undefined : \'list\'}}"              ng-attr-role="{{$mdAutocompleteCtrl.isDisabled ? undefined : \'combobox\'}}"              aria-haspopup="{{!$mdAutocompleteCtrl.isDisabled}}"              aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"              ng-attr-aria-owns="{{$mdAutocompleteCtrl.hidden || $mdAutocompleteCtrl.isDisabled ? undefined : \'ul-\' + $mdAutocompleteCtrl.id}}"              ng-attr-aria-activedescendant="{{!$mdAutocompleteCtrl.hidden && $mdAutocompleteCtrl.activeOption ? $mdAutocompleteCtrl.activeOption : undefined}}">') + '          <button type="button" aria-label="Clear Input" tabindex="0" ng-if="clearButton && $mdAutocompleteCtrl.scope.searchText" ng-click="$mdAutocompleteCtrl.clear($event)"><md-icon md-svg-src="' + l.mdClose + '"></md-icon></button>          <md-progress-linear              class="' + (e.mdFloatingLabel ? "md-inline" : "") + '"              ng-if="$mdAutocompleteCtrl.loadingIsVisible()"              md-mode="indeterminate"></md-progress-linear>          ' + function(e, t) {
+          if (e = e ? " " + e : "", s(t)) return '            <div                 ng-hide="$mdAutocompleteCtrl.hidden"                class="md-standard-list-container md-autocomplete-suggestions-container md-whiteframe-z1' + e + '"                ng-class="{ \'md-not-found\': $mdAutocompleteCtrl.notFoundVisible() }"                ng-mouseenter="$mdAutocompleteCtrl.listEnter()"                ng-mouseleave="$mdAutocompleteCtrl.listLeave()"                role="presentation">              <div class="md-standard-list-scroller" role="presentation">';
+          return '          <md-virtual-repeat-container              md-auto-shrink              md-auto-shrink-min="1"              ng-hide="$mdAutocompleteCtrl.hidden"              class="md-virtual-repeat-container md-autocomplete-suggestions-container md-whiteframe-z1' + e + '"              ng-class="{ \'md-not-found\': $mdAutocompleteCtrl.notFoundVisible() }"              ng-mouseenter="$mdAutocompleteCtrl.listEnter()"              ng-mouseleave="$mdAutocompleteCtrl.listLeave()"              role="presentation">'
+        }(e.mdMenuContainerClass, e.mdMode) + '            <ul class="md-autocomplete-suggestions"                ng-class="::menuClass"                id="ul-{{$mdAutocompleteCtrl.id}}"                ng-mouseup="$mdAutocompleteCtrl.focusInput()"                role="listbox">              <li class="md-autocomplete-suggestion" ' + (s(e.mdMode) ? "ng-repeat" : "md-virtual-repeat") + ' ="item in $mdAutocompleteCtrl.matches"                  ng-class="{ selected: $index === $mdAutocompleteCtrl.index }"                  ng-attr-id="{{\'md-option-\' + $mdAutocompleteCtrl.id + \'-\' + $index}}"                  ng-click="$mdAutocompleteCtrl.select($index)"                  role="option"                  aria-setsize="{{$mdAutocompleteCtrl.matches.length}}"                  aria-posinset="{{$index+1}}"                  aria-selected="{{$index === $mdAutocompleteCtrl.index ? true : false}}"                   md-extra-name="$mdAutocompleteCtrl.itemName">                  ' + i + "                  </li>" + r + "            </ul>          " + (s(e.mdMode) ? "   </div>              </div>            </div>" : "</md-virtual-repeat-container>") + "        </md-autocomplete-wrap>";
+
+        function s(e) {
+          return m(e) !== c
+        }
+      }
+    }
+  }
+
+  function Q(e, c) {
+    return {
+      restrict: "AE",
+      compile: function(e, t, l) {
+        return function(n, t, e) {
+          var o, r, i = n.$mdAutocompleteCtrl,
+            a = i.parent.$new(),
+            d = i.itemName;
+
+          function s(e, t) {
+            a[t] = n[e], n.$watch(e, function(e) {
+              c.nextTick(function() {
+                a[t] = e
+              })
+            })
+          }
+          s("$index", "$index"), s("item", d), r = o = !1, n.$watch(function() {
+            r || o || (o = !0, n.$$postDigest(function() {
+              r || a.$digest(), o = r = !1
+            }))
+          }), a.$watch(function() {
+            r = !0
+          }), l(a, function(e) {
+            t.after(e)
+          })
+        }
+      },
+      terminal: !0,
+      transclude: "element"
+    }
+  }
+
+  function J(e, t, n, o) {
+    this.$scope = e, this.$element = t, this.$attrs = n, this.$mdUtil = o, this.regex = null
+  }
+
+  function ee(n, o) {
+    return {
+      terminal: !0,
+      controller: "MdHighlightCtrl",
+      compile: function(e, t) {
+        var r = o(t.mdHighlightText),
+          i = n(e.html());
+        return function(e, t, n, o) {
+          o.init(r, i)
+        }
+      }
+    }
+  }
+
+  function te(n) {
+    return {
+      restrict: "E",
+      link: function(e, t) {
+        t.addClass("_md"), e.$on("$destroy", function() {
+          n.destroy()
+        })
+      }
+    }
+  }
+
+  function ne(e) {
+    t.$inject = ["$animate", "$mdConstant", "$mdUtil", "$mdTheming", "$mdBottomSheet", "$rootElement", "$mdGesture", "$log"];
+    var u = .5,
+      p = 80;
+    return e("$mdBottomSheet").setDefaults({
+      methods: ["disableParentScroll", "escapeToClose", "clickOutsideToClose"],
+      options: t
+    });
+
+    function t(o, a, d, r, s, i, l, c) {
+      var m;
+      return {
+        themable: !0,
+        onShow: function(e, t, n) {
+          if ((t = d.extractElementByName(t, "md-bottom-sheet")).attr("tabindex", "-1"), t.hasClass("ng-cloak")) {
+            c.warn("$mdBottomSheet: using `<md-bottom-sheet ng-cloak>` will affect the bottom-sheet opening animations.", t[0])
+          }
+          n.isLockedOpen ? (n.clickOutsideToClose = !1, n.escapeToClose = !1) : n.cleanupGestures = function(o, e) {
+            var t = l.register(e, "drag", {
+              horizontal: !1
+            });
+            return e.on("$md.dragstart", n).on("$md.drag", r).on("$md.dragend", i),
+              function() {
+                t(), e.off("$md.dragstart", n), e.off("$md.drag", r), e.off("$md.dragend", i)
+              };
+
+            function n() {
+              o.css(a.CSS.TRANSITION_DURATION, "0ms")
+            }
+
+            function r(e) {
+              var t = e.pointer.distanceY;
+              t < 5 && (t = Math.max(-p, t / 2)), o.css(a.CSS.TRANSFORM, "translate3d(0," + (p + t) + "px,0)")
+            }
+
+            function i(e) {
+              if (0 < e.pointer.distanceY && (20 < e.pointer.distanceY || Math.abs(e.pointer.velocityY) > u)) {
+                var t = o.prop("offsetHeight") - e.pointer.distanceY,
+                  n = Math.min(t / e.pointer.velocityY * .75, 500);
+                o.css(a.CSS.TRANSITION_DURATION, n + "ms"), d.nextTick(s.cancel, !0)
+              } else o.css(a.CSS.TRANSITION_DURATION, ""), o.css(a.CSS.TRANSFORM, "")
+            }
+          }(t, n.parent);
+          n.disableBackdrop || ((m = d.createBackdrop(e, "md-bottom-sheet-backdrop md-opaque"))[0].tabIndex = -1, n.clickOutsideToClose && m.on("click", function() {
+            d.nextTick(s.cancel, !0)
+          }), r.inherit(m, n.parent), o.enter(m, n.parent, null));
+          r.inherit(t, n.parent), n.disableParentScroll && (n.restoreScroll = d.disableScrollAround(t, n.parent));
+          return o.enter(t, n.parent, m).then(function() {
+            var e = d.findFocusTarget(t) || be.element(t[0].querySelector("button") || t[0].querySelector("a") || t[0].querySelector(d.prefixer("ng-click", !0))) || m;
+            n.escapeToClose && (n.rootElementKeyupCallback = function(e) {
+              e.keyCode === a.KEY_CODE.ESCAPE && d.nextTick(s.cancel, !0)
+            }, i.on("keyup", n.rootElementKeyupCallback), e && e.focus())
+          })
+        },
+        onRemove: function(e, t, n) {
+          n.disableBackdrop || o.leave(m);
+          return o.leave(t).then(function() {
+            n.disableParentScroll && (n.restoreScroll(), delete n.restoreScroll), n.cleanupGestures && n.cleanupGestures()
+          })
+        },
+        disableBackdrop: !1,
+        escapeToClose: !0,
+        clickOutsideToClose: !0,
+        disableParentScroll: !0,
+        isLockedOpen: !1
+      }
+    }
+  }
+
+  function oe(n) {
+    return {
+      restrict: "E",
+      link: function(e, t) {
+        n(t)
+      }
+    }
+  }
+
+  function re(o, r, i, a) {
+    return {
+      restrict: "EA",
+      replace: !0,
+      transclude: !0,
+      template: function(e, t) {
+        {
+          return d(t) ? '<a class="md-button" ng-transclude></a>' : '<button class="md-button" type="' + (void 0 === t.type ? "button" : t.type) + '" ng-transclude></button>'
+        }
+      },
+      link: function(e, t, n) {
+        r(t), o.attach(e, t), i.expectWithoutText(t, "aria-label"), d(n) && be.isDefined(n.ngDisabled) && !t.hasClass("_md-nav-button") && e.$watch(n.ngDisabled, function(e) {
+          t.attr("tabindex", e ? -1 : 0)
+        });
+        t.on("click", function(e) {
+          !0 === n.disabled && (e.preventDefault(), e.stopImmediatePropagation())
+        }), t.hasClass("md-no-focus") || (t.on("focus", function() {
+          a.isUserInvoked() && "keyboard" !== a.getLastInteractionType() || t.addClass("md-focused")
+        }), t.on("blur", function() {
+          t.removeClass("md-focused")
+        }))
+      }
+    };
+
+    function d(e) {
+      return be.isDefined(e.href) || be.isDefined(e.ngHref) || be.isDefined(e.ngLink) || be.isDefined(e.uiSref)
+    }
+  }
+
+  function ie(o) {
+    return {
+      restrict: "E",
+      link: function(e, t, n) {
+        t.addClass("_md"), o(t)
+      }
+    }
+  }
+
+  function ae(h, f, b, g, E, v) {
+    return h = h[0], {
+      restrict: "E",
+      transclude: !0,
+      require: ["^?mdInputContainer", "?ngModel", "?^form"],
+      priority: b.BEFORE_NG_ARIA,
+      template: '<div class="md-container" md-ink-ripple md-ink-ripple-checkbox><div class="md-icon"></div></div><div ng-transclude class="md-label"></div>',
+      compile: function(e, t) {
+        return t.$set("tabindex", t.tabindex || "0"), t.$set("type", "checkbox"), t.$set("role", t.type), e.addClass("md-auto-horizontal-margin"), {
+          pre: function(e, t) {
+            t.on("click", function(e) {
+              this.hasAttribute("disabled") && e.stopImmediatePropagation()
+            })
+          },
+          post: function(o, r, i, e) {
+            var t, n = e[0],
+              a = e[1] || E.fakeNgModel(),
+              d = e[2],
+              s = 0 < r.find("a").length;
+            if (s) {
+              var l = "label-" + E.nextUid();
+              i.$set("aria-labelledby", l);
+              var c = r.children()[1];
+              be.element(c).remove(), c.removeAttribute("ng-transclude"), c.className = "md-checkbox-link-label", c.setAttribute("id", l), r.after(c), r.next().on("click", u)
+            }
+            if (n) {
+              var m = n.isErrorGetter || function() {
+                return a.$invalid && (a.$touched || d && d.$submitted)
+              };
+              n.input = r, o.$watch(m, n.setInvalid)
+            }
+            g(r), r.children().on("focus", function() {
+              r.focus()
+            }), E.parseAttributeBoolean(i.mdIndeterminate) && (p(), o.$watch(i.mdIndeterminate, p));
+            i.ngChecked && o.$watch(o.$eval.bind(o, i.ngChecked), function(e) {
+              a.$setViewValue(e), a.$render()
+            });
+            (function(e, t, n) {
+              i[e] && o.$watch(i[e], function(e) {
+                n[e] && r.attr(t, n[e])
+              })
+            })("ngDisabled", "tabindex", {
+              true: "-1",
+              false: i.tabindex
+            }), s || f.expectWithText(r, "aria-label");
+
+            function u(t) {
+              r[0].hasAttribute("disabled") || o.skipToggle || "A" === t.target.tagName || o.$apply(function() {
+                var e = i.ngChecked && i.ngClick ? i.checked : !a.$viewValue;
+                a.$setViewValue(e, t && t.type), a.$render()
+              })
+            }
+
+            function p(e) {
+              (t = !1 !== e) && r.attr("aria-checked", "mixed"), r.toggleClass("md-indeterminate", t), a.$render()
+            }
+            h.link.pre(o, {
+              on: be.noop,
+              0: {}
+            }, i, [a]), r.on("click", u).on("keypress", function(e) {
+              var t, n, o = e.which || e.keyCode;
+              switch (e.preventDefault(), o) {
+                case b.KEY_CODE.SPACE:
+                  r.addClass("md-focused"), u(e);
+                  break;
+                case b.KEY_CODE.ENTER:
+                  (n = E.getClosest(e.target, "form")) && (t = n.querySelector('button[type="submit"]:enabled, input[type="submit"]:enabled')) && t.click()
+              }
+            }).on("focus", function() {
+              "keyboard" === v.getLastInteractionType() && r.addClass("md-focused")
+            }).on("blur", function() {
+              r.removeClass("md-focused")
+            }), a.$render = function() {
+              var e = !!a.$viewValue && !t;
+              r.toggleClass("md-checked", e), t || (e ? r.attr("aria-checked", "true") : r.attr("aria-checked", "false"))
+            }
+          }
+        }
+      }
+    }
+  }
+
+  function de(e, t, n, o, r) {
+    this.$scope = e, this.$element = t, this.$mdConstant = n, this.$timeout = o, this.$mdUtil = r, this.isEditing = !1, this.parentController = ge, this.enableChipEdit = !1
+  }
+
+  function se(d, e, t, s) {
+    return {
+      restrict: "E",
+      require: ["^?mdChips", "mdChip"],
+      link: function(e, t, n, o) {
+        var r = o.shift(),
+          i = o.shift(),
+          a = be.element(t[0].querySelector(".md-chip-content"));
+        d(t), r && (i.init(r), a.on("blur", function() {
+          r.resetSelectedChip(), r.$scope.$applyAsync()
+        }));
+        s(function() {
+          r && r.shouldFocusLastChip && r.focusLastChipThenInput()
+        })
+      },
+      controller: "MdChipCtrl"
+    }
+  }
+
+  function le(r) {
+    return {
+      restrict: "A",
+      require: "^mdChips",
+      scope: !1,
+      link: function(e, t, n, o) {
+        t.on("click", function() {
+          e.$apply(function() {
+            o.removeChip(e.$$replacedScope.$index)
+          })
+        }), r(function() {
+          t.attr({
+            tabindex: "-1",
+            "aria-hidden": "true"
+          }), t.find("button").attr("tabindex", "-1")
+        })
+      }
+    }
+  }
+
+  function ce(a) {
+    return {
+      restrict: "EA",
+      terminal: !0,
+      link: function(e, t, n) {
+        var o = e.$parent.$mdChipsCtrl,
+          r = o.parent.$new(!1, o.parent);
+        r.$$replacedScope = e, r.$chip = e.$chip, r.$index = e.$index;
+        var i = (r.$mdChipsCtrl = o).$scope.$eval(n.mdChipTransclude);
+        t.html(i), a(t.contents())(r)
+      },
+      scope: !1
+    }
+  }
+
+  function me(e, t, n) {
+    this.$element = t, this.$attrs = e, this.$timeout = n, this.selectedItem = null, this.searchText = "", this.deRegister = [], this.init()
+  }
+
+  function ue(n) {
+    return {
+      restrict: "E",
+      controller: ["$scope", "$element", function(e, t) {
+        this.$scope = e, this.$element = t
+      }],
+      link: function(e, t) {
+        t.addClass("_md"), n(t), e.$broadcast("$mdContentLoaded", t),
+          function(t) {
+            be.element(t).on("$md.pressdown", function(e) {
+              "t" === e.pointer.type && (e.$materialScrollFixed || (e.$materialScrollFixed = !0, 0 === t.scrollTop ? t.scrollTop = 1 : t.scrollHeight === t.scrollTop + t.offsetHeight && (t.scrollTop -= 1)))
+            })
+          }(t[0])
+      }
+    }
+  }
+
+  function pe(e, t) {
+    var d = e('<md-icon md-svg-src="' + t.mdTabsArrow + '"></md-icon>')({})[0];
+    return {
+      require: ["^^mdCalendar", "^^mdCalendarMonth", "mdCalendarMonthBody"],
+      scope: {
+        offset: "=mdMonthOffset"
+      },
+      controller: he,
+      controllerAs: "mdMonthBodyCtrl",
+      bindToController: !0,
+      link: function(e, t, n, o) {
+        var r = o[0],
+          i = o[1],
+          a = o[2];
+        a.calendarCtrl = r, a.monthCtrl = i, a.arrowIcon = d.cloneNode(!0), e.$watch(function() {
+          return a.offset
+        }, function(e) {
+          be.isNumber(e) && a.generateContent()
+        })
+      }
+    }
+  }
+
+  function he(e, t, n) {
+    this.$element = e, this.dateUtil = t, this.dateLocale = n, this.monthCtrl = null, this.calendarCtrl = null, this.offset = null, this.focusAfterAppend = null
+  }
+
+  function fe(e, t, n) {
+    this.$element = e, this.dateUtil = t, this.dateLocale = n, this.calendarCtrl = null, this.yearCtrl = null, this.offset = null, this.focusAfterAppend = null
+  }
+
+  function Ee(e, t, i) {
+    return {
+      restrict: "E",
+      link: function(o, r) {
+        r.addClass("_md"), t(r), e(function() {
+          var e, t = r[0].querySelector("md-dialog-content");
+
+          function n() {
+            r.toggleClass("md-content-overflow", t.scrollHeight > t.clientHeight)
+          }
+          t && (e = t.getElementsByTagName("img"), n(), be.element(e).on("load", n)), o.$on("$destroy", function() {
+            i.destroy(r)
+          })
+        })
+      }
+    }
+  }
+
+  function ve(e) {
+    var g, E, v;
+    return n.$inject = ["$mdDialog", "$mdConstant"], o.$inject = ["$mdDialog", "$mdAria", "$mdUtil", "$mdConstant", "$animate", "$document", "$window", "$rootElement", "$log", "$injector", "$mdTheming", "$interpolate", "$mdInteraction"], e("$mdDialog").setDefaults({
+      methods: ["disableParentScroll", "hasBackdrop", "clickOutsideToClose", "escapeToClose", "targetEvent", "closeTo", "openFrom", "parent", "fullscreen", "multiple"],
+      options: o
+    }).addPreset("alert", {
+      methods: ["title", "htmlContent", "textContent", "ariaLabel", "ok", "theme", "css"],
+      options: t
+    }).addPreset("confirm", {
+      methods: ["title", "htmlContent", "textContent", "ariaLabel", "ok", "cancel", "theme", "css"],
+      options: t
+    }).addPreset("prompt", {
+      methods: ["title", "htmlContent", "textContent", "initialValue", "placeholder", "ariaLabel", "ok", "cancel", "theme", "css", "required"],
+      options: t
+    });
+
+    function t() {
+      return {
+        template: ['<md-dialog md-theme="{{ dialog.theme || dialog.defaultTheme }}" aria-label="{{ dialog.ariaLabel }}" ng-class="dialog.css">', '  <md-dialog-content class="md-dialog-content" role="document" tabIndex="-1">', '    <h2 class="md-title">{{ dialog.title }}</h2>', '    <div ng-if="::dialog.mdHtmlContent" class="md-dialog-content-body" ', '        ng-bind-html="::dialog.mdHtmlContent"></div>', '    <div ng-if="::!dialog.mdHtmlContent" class="md-dialog-content-body">', "      <p>{{::dialog.mdTextContent}}</p>", "    </div>", '    <md-input-container md-no-float ng-if="::dialog.$type == \'prompt\'" class="md-prompt-input-container">', '      <input ng-keypress="dialog.keypress($event)" md-autofocus ng-model="dialog.result"              placeholder="{{::dialog.placeholder}}" ng-required="dialog.required">', "    </md-input-container>", "  </md-dialog-content>", "  <md-dialog-actions>", '    <md-button ng-if="dialog.$type === \'confirm\' || dialog.$type === \'prompt\'"               ng-click="dialog.abort()" class="md-primary md-cancel-button">', "      {{ dialog.cancel }}", "    </md-button>", '    <md-button ng-click="dialog.hide()" class="md-primary md-confirm-button" md-autofocus="dialog.$type===\'alert\'"               ng-disabled="dialog.required && !dialog.result">', "      {{ dialog.ok }}", "    </md-button>", "  </md-dialog-actions>", "</md-dialog>"].join("").replace(/\s\s+/g, ""),
+        controller: n,
+        controllerAs: "dialog",
+        bindToController: !0
+      }
+    }
+
+    function n(o, r) {
+      this.$onInit = function() {
+        var n = "prompt" === this.$type;
+        n && this.initialValue && (this.result = this.initialValue), this.hide = function() {
+          o.hide(!n || this.result)
+        }, this.abort = function() {
+          o.cancel()
+        }, this.keypress = function(e) {
+          var t = n && this.required && !be.isDefined(this.result);
+          e.keyCode !== r.KEY_CODE.ENTER || t || o.hide(this.result)
+        }
+      }
+    }
+
+    function o(u, d, p, h, r, s, f, i, a, l, t, c, m) {
+      return {
+        hasBackdrop: !0,
+        isolateScope: !0,
+        onCompiling: function(e) {
+          e.defaultTheme = t.defaultTheme(),
+            function(t) {
+              var e;
+              t.targetEvent && t.targetEvent.target && (e = be.element(t.targetEvent.target));
+              var n = e && e.controller("mdTheme");
+              if (t.hasTheme = !!n, !t.hasTheme) return;
+              t.themeWatch = n.$shouldWatch;
+              var o = t.theme || n.$mdTheme;
+              o && (t.scope.theme = o);
+              var r = n.registerChanges(function(e) {
+                t.scope.theme = e, t.themeWatch || r()
+              })
+            }(e)
+        },
+        onShow: function(e, t, n) {
+          be.element(s[0].body).addClass("md-dialog-is-showing");
+          var o = t.find("md-dialog");
+          if (o.hasClass("ng-cloak")) {
+            a.warn("$mdDialog: using `<md-dialog ng-cloak>` will affect the dialog opening animations.", t[0])
+          }
+          return function(e) {
+              e.origin = be.extend({
+                element: null,
+                bounds: null,
+                focus: be.noop
+              }, e.origin || {}), e.parent = n(e.parent, i), e.closeTo = t(n(e.closeTo)), e.openFrom = t(n(e.openFrom)), e.targetEvent && (e.origin = t(e.targetEvent.target, e.origin), e.originInteraction = m.getLastInteractionType());
+
+              function t(e, t) {
+                var n = be.element(e || {});
+                if (n && n.length) {
+                  var o = be.isFunction(n[0].getBoundingClientRect);
+                  return be.extend(t || {}, {
+                    element: o ? n : ge,
+                    bounds: o ? n[0].getBoundingClientRect() : be.extend({}, {
+                      top: 0,
+                      left: 0,
+                      height: 0,
+                      width: 0
+                    }, n[0]),
+                    focus: be.bind(n, n.focus)
+                  })
+                }
+              }
+
+              function n(e, t) {
+                return be.isString(e) && (e = s[0].querySelector(e)), be.element(e || t)
+              }
+            }(n),
+            function(n, t) {
+              var e = "alert" === t.$type ? "alertdialog" : "dialog",
+                o = n.find("md-dialog-content"),
+                r = n.attr("id"),
+                i = "dialogContent_" + (r || p.nextUid());
+              n.attr({
+                role: e,
+                tabIndex: "-1"
+              }), 0 === o.length && (o = n, r && (i = r));
+              o.attr("id", i), n.attr("aria-describedby", i), t.ariaLabel ? d.expect(n, "aria-label", t.ariaLabel) : d.expectAsync(n, "aria-label", function() {
+                if (t.title) return t.title;
+                var e = o.text().split(/\s+/);
+                return 3 < e.length && (e = e.slice(0, 3).concat("...")), e.join(" ")
+              });
+              (g = document.createElement("div")).classList.add("md-dialog-focus-trap"), g.tabIndex = 0, E = g.cloneNode(!1);
+
+              function a(e) {
+                if (e.target && e.target.nextSibling && "MD-DIALOG" === e.target.nextSibling.nodeName) {
+                  var t = p.getLastTabbableElement(n[0]);
+                  be.isElement(t) && t.focus()
+                } else n.focus()
+              }
+              g.addEventListener("focus", a), E.addEventListener("focus", a), v = function() {
+                g.removeEventListener("focus", a), E.removeEventListener("focus", a), g && g.parentNode && g.parentNode.removeChild(g), E && E.parentNode && E.parentNode.removeChild(E)
+              }, n[0].parentNode.insertBefore(g, n[0]), n.after(E)
+            }(o, n),
+            function(e, t, n) {
+              n.disableParentScroll && (n.restoreScroll = p.disableScrollAround(t, n.parent));
+              n.hasBackdrop && (n.backdrop = p.createBackdrop(e, "md-dialog-backdrop md-opaque"), r.enter(n.backdrop, n.parent));
+              n.hideBackdrop = function(e) {
+                n.backdrop && (e ? n.backdrop.remove() : r.leave(n.backdrop)), n.disableParentScroll && (n.restoreScroll && n.restoreScroll(), delete n.restoreScroll), n.hideBackdrop = null
+              }
+            }(e, t, n),
+            function(e, t) {
+              function n() {
+                var e = "alert" === t.$type ? u.hide : u.cancel;
+                p.nextTick(e, !0)
+              }
+              var o = be.element(f),
+                r = p.debounce(function() {
+                  b(e, t)
+                }, 60),
+                i = [];
+              if (t.escapeToClose) {
+                var a = t.parent,
+                  d = function(e) {
+                    e.keyCode === h.KEY_CODE.ESCAPE && (e.stopImmediatePropagation(), e.preventDefault(), n())
+                  };
+                e.on("keydown", d), a.on("keydown", d), i.push(function() {
+                  e.off("keydown", d), a.off("keydown", d)
+                })
+              }
+              if (o.on("resize", r), i.push(function() {
+                  o.off("resize", r)
+                }), t.clickOutsideToClose) {
+                var s, l = e,
+                  c = function(e) {
+                    s = e.target
+                  },
+                  m = function(e) {
+                    s === l[0] && e.target === l[0] && (e.stopPropagation(), e.preventDefault(), n())
+                  };
+                l.on("mousedown", c), l.on("mouseup", m), i.push(function() {
+                  l.off("mousedown", c), l.off("mouseup", m)
+                })
+              }
+              t.deactivateListeners = function() {
+                i.forEach(function(e) {
+                  e()
+                }), t.deactivateListeners = null
+              }
+            }(t, n),
+            function(e, t) {
+              t.parent.append(e), t.reverseContainerStretch = b(e, t);
+              var n = e.find("md-dialog"),
+                o = p.dom.animator,
+                r = o.calculateZoomToOrigin,
+                i = {
+                  transitionInClass: "md-transition-in",
+                  transitionOutClass: "md-transition-out"
+                },
+                a = o.toTransformCss(r(n, t.openFrom || t.origin)),
+                d = o.toTransformCss("");
+              return n.toggleClass("md-dialog-fullscreen", !!t.fullscreen), o.translate3d(n, a, d, i).then(function(e) {
+                return t.reverseAnimate = function() {
+                  return delete t.reverseAnimate, t.closeTo ? (i = {
+                    transitionInClass: "md-transition-out",
+                    transitionOutClass: "md-transition-in"
+                  }, a = d, d = o.toTransformCss(r(n, t.closeTo)), o.translate3d(n, a, d, i)) : e(d = o.toTransformCss(r(n, t.origin)))
+                }, t.clearAnimate = function() {
+                  return delete t.clearAnimate, n.removeClass([i.transitionOutClass, i.transitionInClass].join(" ")), o.translate3d(n, d, o.toTransformCss(""), {})
+                }, !0
+              })
+            }(t, n).then(function() {
+              ! function(e, t) {
+                var o = !0;
+
+                function n(e) {
+                  for (var t = function(e) {
+                      for (var t, n = []; e.parentNode;) {
+                        if (e === document.body) return n;
+                        for (var o = e.parentNode.children, r = 0; r < o.length; r++) e === o[r] || (t = o[r], -1 !== ["SCRIPT", "STYLE"].indexOf(t.nodeName)) || o[r].hasAttribute("aria-live") || n.push(o[r]);
+                        e = e.parentNode
+                      }
+                      return n
+                    }(e), n = 0; n < t.length; n++) t[n].setAttribute("aria-hidden", o)
+                }
+                n(e[0]), t.unlockScreenReader = function() {
+                  o = !1, n(e[0]), t.unlockScreenReader = null
+                }
+              }(t, n),
+              function() {
+                if (n.focusOnOpen) {
+                  (p.findFocusTarget(t) || t[0].querySelector(".dialog-close, md-dialog-actions button:last-child") || o).focus()
+                }
+              }()
+            })
+        },
+        onShowing: function(e, t, n, o) {
+          if (o) {
+            var r = o.htmlContent || n.htmlContent || "",
+              i = o.textContent || n.textContent || "";
+            if (r && !l.has("$sanitize")) throw Error("The ngSanitize module must be loaded in order to use htmlContent.");
+            if (r && i) throw Error("md-dialog cannot have both `htmlContent` and `textContent`");
+            o.mdHtmlContent = r, o.mdTextContent = i
+          }
+        },
+        onRemove: function(e, t, n) {
+          n.deactivateListeners(), n.unlockScreenReader(), n.hideBackdrop(n.$destroy), v && (v(), v = null);
+          return n.$destroy ? o() : function(e, t) {
+            return t.reverseAnimate().then(function() {
+              t.contentElement && t.clearAnimate()
+            })
+          }(0, n).then(o);
+
+          function o() {
+            be.element(s[0].body).removeClass("md-dialog-is-showing"), n.contentElement && n.reverseContainerStretch(), n.cleanupElement(), n.$destroy || "keyboard" !== n.originInteraction || n.origin.focus()
+          }
+        },
+        clickOutsideToClose: !1,
+        escapeToClose: !0,
+        targetEvent: null,
+        closeTo: null,
+        openFrom: null,
+        focusOnOpen: !0,
+        disableParentScroll: !0,
+        autoWrap: !0,
+        fullscreen: !1,
+        transformTemplate: function(e, t) {
+          var n, o = c.startSymbol(),
+            r = c.endSymbol(),
+            i = o + (t.themeWatch ? "" : "::") + "theme" + r;
+          return '<div class="md-dialog-container" tabindex="-1" ' + (t.hasTheme ? 'md-theme="' + i + '"' : "") + ">" + (n = e, t.autoWrap && !/<\/md-dialog>/g.test(n) ? "<md-dialog>" + (n || "") + "</md-dialog>" : n || "") + "</div>"
+        }
+      };
+
+      function b(e, t) {
+        var n = "fixed" === f.getComputedStyle(s[0].body).position,
+          o = t.backdrop ? f.getComputedStyle(t.backdrop[0]) : null,
+          r = o ? Math.min(s[0].body.clientHeight, Math.ceil(Math.abs(parseInt(o.height, 10)))) : 0,
+          i = {
+            top: e.css("top"),
+            height: e.css("height")
+          },
+          a = Math.abs(t.parent[0].getBoundingClientRect().top);
+        return e.css({
+            top: (n ? a : 0) + "px",
+            height: r ? r + "px" : "100%"
+          }),
+          function() {
+            e.css(i)
+          }
+      }
+    }
+  }
+
+  function $e(e) {
+    return {
+      restrict: "E",
+      link: e
+    }
+  }
+
+  function Me(i) {
+    return {
+      restrict: "E",
+      require: ["^?mdFabSpeedDial", "^?mdFabToolbar"],
+      compile: function(e, t) {
+        var n, o = e.children(),
+          r = i.prefixer().hasAttribute(o, "ng-repeat");
+        n = e.find("md-button"), be.forEach(n, function(e) {
+          e.setAttribute("tabindex", -1)
+        }), r ? o.addClass("md-fab-action-item") : o.wrap('<div class="md-fab-action-item">')
+      }
+    }
+  }
+
+  function ye(t, i, a, d, r, n) {
+    var o, s = this,
+      e = 0;
+
+    function l(e) {
+      "click" == e.type && function(e) {
+        var t = e.target ? function(e) {
+          return d.getClosest(e, "button") || d.getClosest(e, "md-button")
+        }(e.target) : null;
+        t && !t.disabled && (! function(e) {
+          return d.getClosest(e, "md-fab-trigger")
+        }(e.target) || s.toggle());
+        ! function(e) {
+          return d.getClosest(e, "md-fab-actions")
+        }(e.target) || s.close()
+      }(e), "focusout" != e.type || o || (o = n(function() {
+        s.close()
+      }, 100, !1)), "focusin" == e.type && o && (n.cancel(o), o = null)
+    }
+
+    function c() {
+      s.currentActionIndex = -1
+    }
+
+    function m() {
+      0 < i[0].scrollHeight ? a.addClass(i, "_md-animations-ready").then(function() {
+        i.removeClass("md-animations-waiting")
+      }) : e < 10 && (n(m, 100), e += 1)
+    }
+
+    function u() {
+      i.off("keydown", h), be.element(document).off("click touchend", p)
+    }
+
+    function p(e) {
+      if (e.target) {
+        var t = d.getClosest(e.target, "md-fab-trigger"),
+          n = d.getClosest(e.target, "md-fab-actions");
+        t || n || s.close()
+      }
+    }
+
+    function h(e) {
+      switch (e.which) {
+        case r.KEY_CODE.ESCAPE:
+          return s.close(), e.preventDefault(), !1;
+        case r.KEY_CODE.LEFT_ARROW:
+          return function(e) {
+            "left" === s.direction ? b(e) : f(e)
+          }(e), !1;
+        case r.KEY_CODE.UP_ARROW:
+          return function(e) {
+            "down" === s.direction ? f(e) : b(e)
+          }(e), !1;
+        case r.KEY_CODE.RIGHT_ARROW:
+          return function(e) {
+            "left" === s.direction ? f(e) : b(e)
+          }(e), !1;
+        case r.KEY_CODE.DOWN_ARROW:
+          return function(e) {
+            "up" === s.direction ? f(e) : b(e)
+          }(e), !1;
+        case r.KEY_CODE.TAB:
+          return function(e) {
+            e.shiftKey ? f(e) : b(e)
+          }(e), !1
+      }
+    }
+
+    function f(e) {
+      g(e, -1)
+    }
+
+    function b(e) {
+      g(e, 1)
+    }
+
+    function g(e, t) {
+      var n = E()[0].querySelectorAll(".md-fab-action-item"),
+        o = s.currentActionIndex;
+      s.currentActionIndex = s.currentActionIndex + t, s.currentActionIndex = Math.min(n.length - 1, s.currentActionIndex), s.currentActionIndex = Math.max(0, s.currentActionIndex), e.which === r.KEY_CODE.TAB && o === s.currentActionIndex || (be.element(n[s.currentActionIndex]).children()[0].focus(), e.preventDefault(), e.stopImmediatePropagation())
+    }
+
+    function E() {
+      return i.find("md-fab-actions")
+    }
+    s.open = function() {
+      t.$evalAsync("ctrl.isOpen = true")
+    }, s.close = function() {
+      t.$evalAsync("ctrl.isOpen = false"), i.find("md-fab-trigger")[0].focus()
+    }, s.toggle = function() {
+      t.$evalAsync("ctrl.isOpen = !ctrl.isOpen")
+    }, s.$onInit = function() {
+      s.direction = s.direction || "down", s.isOpen = s.isOpen || !1, c(), i.addClass("md-animations-waiting"),
+        function() {
+          var e = ["click", "focusin", "focusout"];
+          be.forEach(e, function(e) {
+            i.on(e, l)
+          }), t.$on("$destroy", function() {
+            be.forEach(e, function(e) {
+              i.off(e, l)
+            }), u()
+          })
+        }(),
+        function() {
+          var o, r;
+          t.$watch("ctrl.direction", function(e, t) {
+            a.removeClass(i, "md-" + t), a.addClass(i, "md-" + e), c()
+          }), t.$watch("ctrl.isOpen", function(e) {
+            c(), o && r || (o = i.find("md-fab-trigger"), r = E()), e ? (i.on("keydown", h), d.nextTick(function() {
+              be.element(document).on("click touchend", p)
+            })) : u();
+            var t = e ? "md-is-open" : "",
+              n = e ? "" : "md-is-open";
+            o.attr("aria-haspopup", !0), o.attr("aria-expanded", e), r.attr("aria-hidden", !e), a.setClass(i, t, n)
+          })
+        }(), m()
+    }, 1 === be.version.major && be.version.minor <= 4 && this.$onInit()
+  }
+
+  function Ce() {
+    function o(e, t) {
+      if (t) {
+        var n = e[0],
+          o = e.controller("mdFabToolbar"),
+          r = n.querySelector(".md-fab-toolbar-background"),
+          i = n.querySelector("md-fab-trigger button"),
+          a = n.querySelector("md-toolbar"),
+          d = n.querySelector("md-fab-trigger button md-icon"),
+          s = e.find("md-fab-actions").children();
+        if (i && r) {
+          var l = L.getComputedStyle(i).getPropertyValue("background-color"),
+            c = n.offsetWidth,
+            m = (n.offsetHeight, c / i.offsetWidth * 2);
+          r.style.backgroundColor = l, r.style.borderRadius = c + "px", o.isOpen ? (a.style.pointerEvents = "inherit", r.style.width = i.offsetWidth + "px", r.style.height = i.offsetHeight + "px", r.style.transform = "scale(" + m + ")", r.style.transitionDelay = "0ms", d && (d.style.transitionDelay = ".3s"), be.forEach(s, function(e, t) {
+            e.style.transitionDelay = 25 * (s.length - t) + "ms"
+          })) : (a.style.pointerEvents = "none", r.style.transform = "scale(1)", r.style.top = "0", e.hasClass("md-right") && (r.style.left = "0", r.style.right = null), e.hasClass("md-left") && (r.style.right = "0", r.style.left = null), r.style.transitionDelay = "200ms", d && (d.style.transitionDelay = "0ms"), be.forEach(s, function(e, t) {
+            e.style.transitionDelay = 200 + 25 * t + "ms"
+          }))
+        }
+      }
+    }
+    return {
+      addClass: function(e, t, n) {
+        o(e, t), n()
+      },
+      removeClass: function(e, t, n) {
+        o(e, t), n()
+      }
+    }
+  }
+
+  function Te(u, g, E, v, $) {
+    return {
+      restrict: "E",
+      controller: Ae,
+      scope: {
+        mdOnLayout: "&"
+      },
+      link: function(n, i, p, t) {
+        i.addClass("_md"), i.attr("role", "list"), t.layoutDelegate = function(e) {
+          var o = [].filter.call(i.children(), function(e) {
+              return "MD-GRID-TILE" == e.tagName && !e.$$mdDestroyed
+            }),
+            r = {
+              tileSpans: function(e) {
+                return [].map.call(e, function(e) {
+                  var t = be.element(e).controller("mdGridTile");
+                  return {
+                    row: parseInt(v.getResponsiveAttribute(t.$attrs, "md-rowspan"), 10) || 1,
+                    col: parseInt(v.getResponsiveAttribute(t.$attrs, "md-colspan"), 10) || 1
+                  }
+                })
+              }(o),
+              colCount: function() {
+                var e = parseInt(v.getResponsiveAttribute(p, "md-cols"), 10);
+                if (isNaN(e)) throw "md-grid-list: md-cols attribute was not found, or contained a non-numeric value";
+                return e
+              }(),
+              rowMode: c(),
+              rowHeight: function() {
+                var e = v.getResponsiveAttribute(p, "md-row-height");
+                if (!e) throw "md-grid-list: md-row-height attribute was not found";
+                switch (c()) {
+                  case "fixed":
+                    return m(e);
+                  case "ratio":
+                    var t = e.split(":");
+                    return parseFloat(t[0]) / parseFloat(t[1]);
+                  case "fit":
+                    return 0
+                }
+              }(),
+              gutter: m(v.getResponsiveAttribute(p, "md-gutter") || 1)
+            };
+          if (!e && be.equals(r, a)) return;
+          var t = E(r.colCount, r.tileSpans, o).map(function(e, n) {
+            return {
+              grid: {
+                element: i,
+                style: function(e, t, n, o, r) {
+                  var i = {};
+                  switch (o) {
+                    case "fixed":
+                      i.height = b({
+                        unit: r,
+                        span: t,
+                        gutter: n
+                      }), i.paddingBottom = "";
+                      break;
+                    case "ratio":
+                      var a = h({
+                        share: 1 / r * (1 / e * 100),
+                        gutterShare: 1 === e ? 0 : (e - 1) / e,
+                        gutter: n
+                      });
+                      i.height = "", i.paddingBottom = b({
+                        unit: a,
+                        span: t,
+                        gutter: n
+                      })
+                  }
+                  return i
+                }(r.colCount, n, r.gutter, r.rowMode, r.rowHeight)
+              },
+              tiles: e.map(function(e, t) {
+                return {
+                  element: be.element(o[t]),
+                  style: function(e, t, n, o, r, i, a) {
+                    var d = 1 / n * 100,
+                      s = (n - 1) / n,
+                      l = h({
+                        share: d,
+                        gutterShare: s,
+                        gutter: r
+                      }),
+                      c = $.isRtl(p) ? {
+                        right: f({
+                          unit: l,
+                          offset: e.col,
+                          gutter: r
+                        }),
+                        width: b({
+                          unit: l,
+                          span: t.col,
+                          gutter: r
+                        }),
+                        paddingTop: "",
+                        marginTop: "",
+                        top: "",
+                        height: ""
+                      } : {
+                        left: f({
+                          unit: l,
+                          offset: e.col,
+                          gutter: r
+                        }),
+                        width: b({
+                          unit: l,
+                          span: t.col,
+                          gutter: r
+                        }),
+                        paddingTop: "",
+                        marginTop: "",
+                        top: "",
+                        height: ""
+                      };
+                    switch (i) {
+                      case "fixed":
+                        c.top = f({
+                          unit: a,
+                          offset: e.row,
+                          gutter: r
+                        }), c.height = b({
+                          unit: a,
+                          span: t.row,
+                          gutter: r
+                        });
+                        break;
+                      case "ratio":
+                        var m = d / a,
+                          u = h({
+                            share: m,
+                            gutterShare: s,
+                            gutter: r
+                          });
+                        c.paddingTop = b({
+                          unit: u,
+                          span: t.row,
+                          gutter: r
+                        }), c.marginTop = f({
+                          unit: u,
+                          offset: e.row,
+                          gutter: r
+                        });
+                        break;
+                      case "fit":
+                        u = h({
+                          share: m = 1 / o * 100,
+                          gutterShare: (o - 1) / o,
+                          gutter: r
+                        }), c.top = f({
+                          unit: u,
+                          offset: e.row,
+                          gutter: r
+                        }), c.height = b({
+                          unit: u,
+                          span: t.row,
+                          gutter: r
+                        })
+                    }
+                    return c
+                  }(e.position, e.spans, r.colCount, n, r.gutter, r.rowMode, r.rowHeight)
+                }
+              })
+            }
+          }).reflow().performance();
+          n.mdOnLayout({
+            $event: {
+              performance: t
+            }
+          }), a = r
+        };
+        var a, o = be.bind(t, t.invalidateLayout),
+          r = function() {
+            for (var e in g.MEDIA) v(e), v.getQuery(g.MEDIA[e]).addListener(o);
+            return v.watchResponsiveAttributes(["md-cols", "md-row-height", "md-gutter"], p, d)
+          }();
+
+        function d(e) {
+          null == e ? t.invalidateLayout() : v(e) && t.invalidateLayout()
+        }
+        n.$on("$destroy", function() {
+          for (var e in t.layoutDelegate = be.noop, r(), g.MEDIA) v.getQuery(g.MEDIA[e]).removeListener(o)
+        });
+        var s = u.startSymbol(),
+          l = u.endSymbol();
+
+        function e(e) {
+          return s + e + l
+        }
+        var h = u(e("share") + "% - (" + e("gutter") + " * " + e("gutterShare") + ")"),
+          f = u("calc((" + e("unit") + " + " + e("gutter") + ") * " + e("offset") + ")"),
+          b = u("calc((" + e("unit") + ") * " + e("span") + " + (" + e("span") + " - 1) * " + e("gutter") + ")");
+
+        function c() {
+          var e = v.getResponsiveAttribute(p, "md-row-height");
+          if (!e) throw "md-grid-list: md-row-height attribute was not found";
+          return "fit" == e ? "fit" : -1 !== e.indexOf(":") ? "ratio" : "fixed"
+        }
+
+        function m(e) {
+          return /\D$/.test(e) ? e : e + "px"
+        }
+      }
+    }
+  }
+
+  function Ae(e) {
+    this.layoutInvalidated = !1, this.tilesInvalidated = !1, this.$timeout_ = e.nextTick, this.layoutDelegate = be.noop
+  }
+
+  function we(s) {
+    var l = t;
+    return e.animateWith = function(e) {
+      l = be.isFunction(e) ? e : t
+    }, e;
+
+    function e(e, t) {
+      var n, o, r, i, a, d;
+      return i = s.time(function() {
+        o = function(r, e) {
+          var i = 0,
+            a = 0,
+            d = function() {
+              for (var e = [], t = 0; t < r; t++) e.push(0);
+              return e
+            }();
+          return {
+            positioning: e.map(function(e, t) {
+              return {
+                spans: e,
+                position: function(e, t) {
+                  if (e.col > r) throw "md-grid-list: Tile at position " + t + " has a colspan (" + e.col + ") that exceeds the column count (" + r + ")";
+                  var n = 0,
+                    o = 0;
+                  for (; o - n < e.col;) r <= i ? s() : -1 !== (n = d.indexOf(0, i)) && -1 !== (o = c(n + 1)) ? i = o + 1 : (n = o = 0, s());
+                  return l(n, e.col, e.row), i = n + e.col, {
+                    col: n,
+                    row: a
+                  }
+                }(e, t)
+              }
+            }),
+            rowCount: a + Math.max.apply(Math, d)
+          };
+
+          function s() {
+            a++, l(i = 0, r, -1)
+          }
+
+          function l(e, t, n) {
+            for (var o = e; o < e + t; o++) d[o] = Math.max(d[o] + n, 0)
+          }
+
+          function c(e) {
+            var t;
+            for (t = e; t < d.length; t++)
+              if (0 !== d[t]) return t;
+            if (t === d.length) return t
+          }
+        }(e, t)
+      }), n = {
+        layoutInfo: function() {
+          return o
+        },
+        map: function(t) {
+          return a = s.time(function() {
+            var e = n.layoutInfo();
+            r = t(e.positioning, e.rowCount)
+          }), n
+        },
+        reflow: function(e) {
+          return d = s.time(function() {
+            (e || l)(r.grid, r.tiles)
+          }), n
+        },
+        performance: function() {
+          return {
+            tileCount: t.length,
+            layoutTime: i,
+            mapTime: a,
+            reflowTime: d,
+            totalTime: i + a + d
+          }
+        }
+      }
+    }
+
+    function t(e, t) {
+      e.element.css(e.style), t.forEach(function(e) {
+        e.element.css(e.style)
+      })
+    }
+  }
+
+  function _e(i) {
+    return {
+      restrict: "E",
+      require: "^mdGridList",
+      template: "<figure ng-transclude></figure>",
+      transclude: !0,
+      scope: {},
+      controller: ["$attrs", function(e) {
+        this.$attrs = e
+      }],
+      link: function(e, t, n, o) {
+        t.attr("role", "listitem");
+        var r = i.watchResponsiveAttributes(["md-colspan", "md-rowspan"], n, be.bind(o, o.invalidateLayout));
+        o.invalidateTiles(), e.$on("$destroy", function() {
+          t[0].$$mdDestroyed = !0, r(), o.invalidateLayout()
+        }), be.isDefined(e.$parent.$index) && e.$watch(function() {
+          return e.$parent.$index
+        }, function(e, t) {
+          e !== t && o.invalidateTiles()
+        })
+      }
+    }
+  }
+
+  function ke() {
+    return {
+      template: "<figcaption ng-transclude></figcaption>",
+      transclude: !0
+    }
+  }
+
+  function xe(t) {
+    return {
+      restrict: "E",
+      compile: function(e) {
+        return e[0].setAttribute("role", "list"), t
+      }
+    }
+  }
+
+  function Ne(m, u, p, h) {
+    var f = ["md-checkbox", "md-switch", "md-menu"];
+    return {
+      restrict: "E",
+      controller: "MdListController",
+      compile: function(r, o) {
+        var e, i, t, n = r[0].querySelectorAll(".md-secondary"),
+          a = r;
+        if (r[0].setAttribute("role", "listitem"), o.ngClick || o.ngDblclick || o.ngHref || o.href || o.uiSref || o.ngAttrUiSref) s("button");
+        else if (!r.hasClass("md-no-proxy")) {
+          for (var d = 0; d < f.length; ++d)
+            if (null !== (i = r[0].querySelector(f[d]))) {
+              e = !0;
+              break
+            } e ? s("div") : r.addClass("md-no-proxy")
+        }
+
+        function s(e) {
+          if ("div" === e)(a = be.element('<div class="md-no-style md-list-item-inner">')).append(r.contents()), r.addClass("md-proxy-focus");
+          else {
+            a = be.element('<div class="md-button md-no-style">   <div class="md-list-item-inner"></div></div>');
+            var t = be.element('<md-button class="md-no-style"></md-button>');
+            if (l(r[0], t[0]), !t.attr("aria-label")) {
+              t.attr("aria-label", m.getText(r));
+              var n = a[0].querySelector(".md-list-item-inner");
+              n && n.setAttribute("aria-hidden", "true")
+            }
+            r.hasClass("md-no-focus") && t.addClass("md-no-focus"), a.prepend(t), a.children().eq(1).append(r.contents()), r.addClass("_md-button-wrap")
+          }
+          r[0].setAttribute("tabindex", "-1"), r.append(a)
+        }
+
+        function l(t, n, e) {
+          var o = p.prefixer(["ng-if", "ng-click", "ng-dblclick", "aria-label", "ng-disabled", "ui-sref", "href", "ng-href", "rel", "target", "ng-attr-ui-sref", "ui-sref-opts", "download"]);
+          e && (o = o.concat(p.prefixer(e))), be.forEach(o, function(e) {
+            t.hasAttribute(e) && (n.setAttribute(e, t.getAttribute(e)), t.removeAttribute(e))
+          })
+        }
+
+        function c(e) {
+          for (var t = e.attributes, n = 0; n < t.length; n++)
+            if ("ngClick" === o.$normalize(t[n].name)) return !0;
+          return !1
+        }
+        return t = be.element('<div class="md-secondary-container">'), be.forEach(n, function(e) {
+            ! function(e, t) {
+              if (e && ! function(e) {
+                  var t = e.nodeName.toUpperCase();
+                  return "MD-BUTTON" === t || "BUTTON" === t
+                }(e) && e.hasAttribute("ng-click")) {
+                m.expect(e, "aria-label");
+                var n = be.element('<md-button class="md-secondary md-icon-button">');
+                l(e, n[0], ["ng-if", "ng-hide", "ng-show"]), e.setAttribute("tabindex", "-1"), n.append(e), e = n[0]
+              }
+              e && (!c(e) || !o.ngClick && function(e) {
+                return -1 !== f.indexOf(e.nodeName.toLowerCase())
+              }(e)) && be.element(e).removeClass("md-secondary"), r.addClass("md-with-secondary"), t.append(e)
+            }(e, t)
+          }), a.append(t),
+          function() {
+            for (var e, t = ["md-switch", "md-checkbox"], n = 0; n < t.length; ++n)
+              if ((e = r.find(t[n])[0]) && !e.hasAttribute("aria-label")) {
+                var o = r.find("p")[0];
+                if (!(o = o || r.find("span")[0])) return;
+                e.setAttribute("aria-label", "Toggle " + o.textContent)
+              }
+          }(), e && "MD-MENU" === i.nodeName && function() {
+            var e = be.element(i),
+              t = e.parent().hasClass("md-secondary-container") || i.parentNode.firstElementChild !== i,
+              n = "left";
+            t && (n = "right");
+            e.attr("md-position-mode") || e.attr("md-position-mode", n + " target");
+            var o = e.children().eq(0);
+            c(o[0]) || o.attr("ng-click", "$mdMenu.open($event)");
+            o.attr("aria-label") || o.attr("aria-label", "Open List Menu")
+          }(),
+          function(e, i, t, n) {
+            i.addClass("_md");
+            var o = [],
+              r = i[0].firstElementChild,
+              a = i.hasClass("_md-button-wrap") ? r.firstElementChild : r,
+              d = a && c(a),
+              s = i.hasClass("md-no-proxy");
+            r && r.children && !d && !s && be.forEach(f, function(e) {
+              be.forEach(r.querySelectorAll(e + ":not(.md-secondary)"), function(e) {
+                o.push(e)
+              })
+            }), 1 !== o.length && !d || (i.addClass("md-clickable"), d || n.attachRipple(e, be.element(i[0].querySelector(".md-no-style")))), o.length && be.forEach(o, function(t) {
+              t = be.element(t), e.mouseActive = !1, t.on("mousedown", function() {
+                e.mouseActive = !0, h(function() {
+                  e.mouseActive = !1
+                }, 100)
+              }).on("focus", function() {
+                !1 === e.mouseActive && i.addClass("md-focused"), t.on("blur", function e() {
+                  i.removeClass("md-focused"), t.off("blur", e)
+                })
+              })
+            });
+
+            function l(e) {
+              "INPUT" === e.target.nodeName || "TEXTAREA" === e.target.nodeName || e.target.isContentEditable || (e.which || e.keyCode) === u.KEY_CODE.SPACE && a && (a.click(), e.preventDefault(), e.stopPropagation())
+            }
+            d || o.length || a && a.addEventListener("keypress", l);
+            i.off("click"), i.off("keypress"), i.off("keydown"), 1 === o.length && a && i.children().eq(0).on("click", function(t) {
+              (function(e) {
+                var t = ["md-slider"],
+                  n = p.getEventPath(e);
+                if (!n || 0 === n.length) return -1 !== t.indexOf(e.target.tagName.toLowerCase());
+                for (var o = n.indexOf(i.children()[0]), r = 0; r < o; r++)
+                  if (-1 !== t.indexOf(n[r].tagName.toLowerCase())) return !0;
+                return !1
+              })(t) || !p.getClosest(t.target, "BUTTON") && a.contains(t.target) && be.forEach(o, function(e) {
+                t.target === e || e.contains(t.target) || ("MD-MENU" === e.nodeName && (e = e.children[0]), be.element(e).triggerHandler("click"))
+              })
+            });
+            e.$on("$destroy", function() {
+              a && a.removeEventListener("keypress", l)
+            })
+          }
+      }
+    }
+  }
+
+  function Se(e, t, n) {
+    this.attachRipple = function(e, t) {
+      n.attach(e, t, {})
+    }
+  }
+
+  function De(r, t, i, a, d, o, e, n, s) {
+    var l, c, m = d.prefixer(),
+      u = this;
+    this.nestLevel = parseInt(t.mdNestLevel, 10) || 0, this.init = function(e, t) {
+      t = t || {}, l = e, (c = i[0].querySelector(m.buildSelector(["ng-click", "ng-mouseenter"]))).setAttribute("aria-expanded", "false"), this.isInMenuBar = t.isInMenuBar, this.mdMenuBarCtrl = t.mdMenuBarCtrl, this.nestedMenus = d.nodesToArray(l[0].querySelectorAll(".md-nested-menu")), l.on("$mdInterimElementRemove", function() {
+        u.isOpen = !1, d.nextTick(function() {
+          u.onIsOpenChanged(u.isOpen)
+        })
+      }), d.nextTick(function() {
+        u.onIsOpenChanged(u.isOpen)
+      });
+      var n = "menu_container_" + d.nextUid();
+      l.attr("id", n), be.element(c).attr({
+        "aria-owns": n,
+        "aria-haspopup": "true"
+      }), a.$on("$destroy", be.bind(this, function() {
+        this.disableHoverListener(), r.destroy()
+      })), l.on("$destroy", function() {
+        r.destroy()
+      })
+    };
+    var p, h, f = [];
+    this.enableHoverListener = function() {
+      f.push(e.$on("$mdMenuOpen", function(e, t) {
+        l[0].contains(t[0]) && (u.currentlyOpenMenu = t.controller("mdMenu"), u.isAlreadyOpening = !1, u.currentlyOpenMenu.registerContainerProxy(u.triggerContainerProxy.bind(u)))
+      })), f.push(e.$on("$mdMenuClose", function(e, t) {
+        l[0].contains(t[0]) && (u.currentlyOpenMenu = ge)
+      })), (h = be.element(d.nodesToArray(l[0].children[0].children))).on("mouseenter", u.handleMenuItemHover), h.on("mouseleave", u.handleMenuItemMouseLeave)
+    }, this.disableHoverListener = function() {
+      for (; f.length;) f.shift()();
+      h && h.off("mouseenter", u.handleMenuItemHover), h && h.off("mouseleave", u.handleMenuItemMouseLeave)
+    }, this.handleMenuItemHover = function(e) {
+      if (!u.isAlreadyOpening) {
+        var t = e.target.querySelector("md-menu") || d.getClosest(e.target, "MD-MENU");
+        p = o(function() {
+          if (t = t && be.element(t).controller("mdMenu"), u.currentlyOpenMenu && u.currentlyOpenMenu != t) {
+            var e = u.nestLevel + 1;
+            u.currentlyOpenMenu.close(!0, {
+              closeTo: e
+            }), u.isAlreadyOpening = !!t, t && t.open()
+          } else t && !t.isOpen && t.open && (u.isAlreadyOpening = !!t, t && t.open())
+        }, t ? 100 : 250);
+        var n = e.currentTarget.querySelector(".md-button:not([disabled])");
+        n && n.focus()
+      }
+    }, this.handleMenuItemMouseLeave = function() {
+      p && (o.cancel(p), p = ge)
+    }, this.open = function(e) {
+      e && e.stopPropagation(), e && e.preventDefault(), u.isOpen || (u.enableHoverListener(), u.isOpen = !0, d.nextTick(function() {
+        u.onIsOpenChanged(u.isOpen)
+      }), (c = c || (e ? e.target : i[0])).setAttribute("aria-expanded", "true"), a.$emit("$mdMenuOpen", i), r.show({
+        scope: a,
+        mdMenuCtrl: u,
+        nestLevel: u.nestLevel,
+        element: l,
+        target: c,
+        preserveElement: !0,
+        parent: "body"
+      }).finally(function() {
+        c.setAttribute("aria-expanded", "false"), u.disableHoverListener()
+      }))
+    }, this.onIsOpenChanged = function(e) {
+      e ? (l.attr("aria-hidden", "false"), i[0].classList.add("md-open"), be.forEach(u.nestedMenus, function(e) {
+        e.classList.remove("md-open")
+      })) : (l.attr("aria-hidden", "true"), i[0].classList.remove("md-open")), a.$mdMenuIsOpen = u.isOpen
+    }, this.focusMenuContainer = function() {
+      var e = l[0].querySelector(m.buildSelector(["md-menu-focus-target", "md-autofocus"]));
+      (e = e || l[0].querySelector(".md-button:not([disabled])")).focus()
+    }, this.registerContainerProxy = function(e) {
+      this.containerProxy = e
+    }, this.triggerContainerProxy = function(e) {
+      this.containerProxy && this.containerProxy(e)
+    }, this.destroy = function() {
+      return u.isOpen ? r.destroy() : n.when(!1)
+    }, this.close = function(e, t) {
+      if (u.isOpen) {
+        u.isOpen = !1, d.nextTick(function() {
+          u.onIsOpenChanged(u.isOpen)
+        });
+        var n = be.extend({}, t, {
+          skipFocus: e
+        });
+        if (a.$emit("$mdMenuClose", i, n), r.hide(null, t), !e) {
+          var o = u.restoreFocusTo || i.find("button")[0];
+          o instanceof be.element && (o = o[0]), o && o.focus()
+        }
+      }
+    }, this.positionMode = function() {
+      var e = (t.mdPositionMode || "target").split(" ");
+      return 1 === e.length && e.push(e[0]), {
+        left: e[0],
+        top: e[1]
+      }
+    }, this.offsets = function() {
+      var e = (t.mdOffset || "0 0").split(" ").map(parseFloat);
+      if (2 === e.length) return {
+        left: e[0],
+        top: e[1]
+      };
+      if (1 === e.length) return {
+        top: e[0],
+        left: e[0]
+      };
+      throw Error("Invalid offsets specified. Please follow format <x, y> or <n>")
+    }, a.$mdMenu = {
+      open: this.open,
+      close: this.close
+    }
+  }
+
+  function He(a) {
+    var d = "Invalid HTML for md-menu: ";
+    return {
+      restrict: "E",
+      require: ["mdMenu", "?^mdMenuBar"],
+      controller: "mdMenuCtrl",
+      scope: !0,
+      compile: function(e) {
+        e.addClass("md-menu");
+        var t = e.children()[0],
+          n = a.prefixer();
+        n.hasAttribute(t, "ng-click") || (t = t.querySelector(n.buildSelector(["ng-click", "ng-mouseenter"])) || t);
+        var o = "MD-BUTTON" === t.nodeName || "BUTTON" === t.nodeName;
+        t && o && !t.hasAttribute("type") && t.setAttribute("type", "button");
+        if (!t) throw Error(d + "Expected the menu to have a trigger element.");
+        if (2 !== e.children().length) throw Error(d + "Expected two children elements. The second element must have a `md-menu-content` element.");
+        t && t.setAttribute("aria-haspopup", "true");
+        var r = e[0].querySelectorAll("md-menu"),
+          i = parseInt(e[0].getAttribute("md-nest-level"), 10) || 0;
+        r && be.forEach(a.nodesToArray(r), function(e) {
+          e.hasAttribute("md-position-mode") || e.setAttribute("md-position-mode", "cascade"), e.classList.add("_md-nested-menu"), e.setAttribute("md-nest-level", i + 1)
+        });
+        return s
+      }
+    };
+
+    function s(e, t, n, o) {
+      var r = o[0],
+        i = !!o[1],
+        a = o[1],
+        d = be.element('<div class="_md md-open-menu-container md-whiteframe-z2"></div>'),
+        s = t.children()[1];
+      t.addClass("_md"), s.hasAttribute("role") || s.setAttribute("role", "menu"), d.append(s), t.on("$destroy", function() {
+        d.remove()
+      }), t.append(d), d[0].style.display = "none", r.init(d, {
+        isInMenuBar: i,
+        mdMenuBarCtrl: a
+      })
+    }
+  }
+
+  function Ie(e) {
+    t.$inject = ["$mdUtil", "$mdTheming", "$mdConstant", "$document", "$window", "$q", "$$rAF", "$animateCss", "$animate", "$log"];
+    var w = 8;
+    return e("$mdMenu").setDefaults({
+      methods: ["target"],
+      options: t
+    });
+
+    function t(y, e, s, C, T, o, r, i, l, c) {
+      var A = y.prefixer(),
+        m = y.dom.animator;
+      return {
+        parent: "body",
+        onShow: function(a, n, d) {
+          (function() {
+            if (!d.target) throw Error("$mdMenu.show() expected a target to animate from in options.target");
+            be.extend(d, {
+              alreadyOpen: !1,
+              isRemoved: !1,
+              target: be.element(d.target),
+              parent: be.element(d.parent),
+              menuContentEl: be.element(n[0].querySelector("md-menu-content"))
+            })
+          })(), d.menuContentEl[0] ? e.inherit(d.menuContentEl, d.target) : c.warn("$mdMenu: Menu elements should always contain a `md-menu-content` element,otherwise interactivity features will not work properly.", n);
+          return d.cleanupResizing = function() {
+              var e = function(t, n) {
+                return r.throttle(function() {
+                  if (!d.isRemoved) {
+                    var e = h(t, n);
+                    t.css(m.toCss(e))
+                  }
+                })
+              }(n, d);
+              return T.addEventListener("resize", e), T.addEventListener("orientationchange", e),
+                function() {
+                  T.removeEventListener("resize", e), T.removeEventListener("orientationchange", e)
+                }
+            }(), d.hideBackdrop = function(e, t, n) {
+              if (n.nestLevel) return be.noop;
+              n.disableParentScroll && !y.getClosest(n.target, "MD-DIALOG") ? n.restoreScroll = y.disableScrollAround(n.element, n.parent) : n.disableParentScroll = !1;
+              n.hasBackdrop && (n.backdrop = y.createBackdrop(e, "md-menu-backdrop md-click-catcher"), l.enter(n.backdrop, C[0].body));
+              return function() {
+                n.backdrop && n.backdrop.remove(), n.disableParentScroll && n.restoreScroll()
+              }
+            }(a, 0, d),
+            function() {
+              return d.parent.append(n), n[0].style.display = "", o(function(e) {
+                var t = h(n, d);
+                n.removeClass("md-leave"), i(n, {
+                  addClass: "md-active",
+                  from: m.toCss(t),
+                  to: m.toCss({
+                    transform: ""
+                  })
+                }).start().then(e)
+              })
+            }().then(function(e) {
+              return d.alreadyOpen = !0, d.cleanupInteraction = function() {
+                if (!d.menuContentEl[0]) return be.noop;
+                d.menuContentEl.on("keydown", r), d.menuContentEl[0].addEventListener("click", i, !0);
+                var e = d.menuContentEl[0].querySelector(A.buildSelector(["md-menu-focus-target", "md-autofocus"]));
+                if (!e)
+                  for (var t = d.menuContentEl[0].children.length, n = 0; n < t; n++) {
+                    var o = d.menuContentEl[0].children[n];
+                    if (e = o.querySelector(".md-button:not([disabled])")) break;
+                    if (o.firstElementChild && !o.firstElementChild.disabled && !o.firstElementChild.getAttribute("disabled")) {
+                      e = o.firstElementChild;
+                      break
+                    }
+                  }
+                return e && e.focus(),
+                  function() {
+                    d.menuContentEl.off("keydown", r), d.menuContentEl[0].removeEventListener("click", i, !0)
+                  };
+
+                function r(e) {
+                  var t;
+                  switch (e.keyCode) {
+                    case s.KEY_CODE.ESCAPE:
+                      d.nestLevel ? d.mdMenuCtrl.close() : d.mdMenuCtrl.close(!1, {
+                        closeAll: !0
+                      }), t = !0;
+                      break;
+                    case s.KEY_CODE.TAB:
+                      d.mdMenuCtrl.close(!1, {
+                        closeAll: !0
+                      }), t = !1;
+                      break;
+                    case s.KEY_CODE.UP_ARROW:
+                      u(e, d.menuContentEl, d, -1) || d.nestLevel || d.mdMenuCtrl.triggerContainerProxy(e), t = !0;
+                      break;
+                    case s.KEY_CODE.DOWN_ARROW:
+                      u(e, d.menuContentEl, d, 1) || d.nestLevel || d.mdMenuCtrl.triggerContainerProxy(e), t = !0;
+                      break;
+                    case s.KEY_CODE.LEFT_ARROW:
+                      d.nestLevel ? d.mdMenuCtrl.close() : d.mdMenuCtrl.triggerContainerProxy(e), t = !0;
+                      break;
+                    case s.KEY_CODE.RIGHT_ARROW:
+                      var n = y.getClosest(e.target, "MD-MENU");
+                      n && n != d.parent[0] ? e.target.click() : d.mdMenuCtrl.triggerContainerProxy(e), t = !0
+                  }
+                  t && (e.preventDefault(), e.stopImmediatePropagation())
+                }
+
+                function i(e) {
+                  var t = e.target;
+                  do {
+                    if (t == d.menuContentEl[0]) return;
+                    if ((o(t, ["ng-click", "ng-href", "ui-sref"]) || "BUTTON" == t.nodeName || "MD-BUTTON" == t.nodeName) && !o(t, ["md-prevent-menu-close"])) {
+                      var n = y.getClosest(t, "MD-MENU");
+                      t.hasAttribute("disabled") || n && n != d.parent[0] || a.$apply(function() {
+                        d.mdMenuCtrl.close(!0, {
+                          closeAll: !0
+                        })
+                      });
+                      break
+                    }
+                  } while (t = t.parentNode);
+
+                  function o(e, t) {
+                    if (!e) return !1;
+                    for (var n, o = 0; n = t[o]; ++o)
+                      if (A.hasAttribute(e, n)) return !0;
+                    return !1
+                  }
+                }
+              }(), d.cleanupBackdrop = d.backdrop ? (d.backdrop.on("click", t), function() {
+                d.backdrop.off("click", t)
+              }) : be.noop, n.addClass("md-clickable"), e
+            });
+
+          function t(e) {
+            e.preventDefault(), e.stopPropagation(), a.$apply(function() {
+              d.mdMenuCtrl.close(!0, {
+                closeAll: !0
+              })
+            })
+          }
+        },
+        onRemove: function(e, t, n) {
+          return n.cleanupInteraction(), n.cleanupBackdrop(), n.cleanupResizing(), n.hideBackdrop(), t.removeClass("md-clickable"), !0 === n.$destroy ? o() : function() {
+            return i(t, {
+              addClass: "md-leave"
+            }).start()
+          }().then(o);
+
+          function o() {
+            t.removeClass("md-active"),
+              function(e, t) {
+                t.preserveElement ? a(e).style.display = "none" : a(e).parentNode === a(t.parent) && a(t.parent).removeChild(a(e))
+              }(t, n), n.alreadyOpen = !1
+          }
+        },
+        hasBackdrop: !0,
+        disableParentScroll: !0,
+        skipCompile: !0,
+        preserveScope: !0,
+        multiple: !0,
+        themable: !0
+      };
+
+      function u(e, t, n, o) {
+        for (var r, i = y.getClosest(e.target, "MD-MENU-ITEM"), a = y.nodesToArray(t[0].children), d = a.indexOf(i) + o; 0 <= d && d < a.length; d += o) {
+          if (r = p(a[d].querySelector(".md-button"))) break
+        }
+        return r
+      }
+
+      function p(e) {
+        if (e && -1 != e.getAttribute("tabindex")) return e.focus(), C[0].activeElement == e
+      }
+
+      function h(e, t) {
+        var n, o = e[0],
+          r = e[0].firstElementChild,
+          i = r.getBoundingClientRect(),
+          a = C[0].body.getBoundingClientRect(),
+          d = T.getComputedStyle(r),
+          s = t.target[0].querySelector(A.buildSelector("md-menu-origin")) || t.target[0],
+          l = s.getBoundingClientRect(),
+          c = {
+            left: a.left + w,
+            top: Math.max(a.top, 0) + w,
+            bottom: Math.max(a.bottom, Math.max(a.top, 0) + a.height) - w,
+            right: a.right - w
+          },
+          m = {
+            top: 0,
+            left: 0,
+            right: 0,
+            bottom: 0
+          },
+          u = {
+            top: 0,
+            left: 0,
+            right: 0,
+            bottom: 0
+          },
+          p = t.mdMenuCtrl.positionMode();
+        "target" !== p.top && "target" !== p.left && "target-right" !== p.left || (n = function() {
+          for (var e = 0; e < r.children.length; ++e)
+            if ("none" != T.getComputedStyle(r.children[e]).display) return r.children[e]
+        }()) && (m = (n = (n = n.firstElementChild || n).querySelector(A.buildSelector("md-menu-align-target")) || n).getBoundingClientRect(), u = {
+          top: parseFloat(o.style.top || 0),
+          left: parseFloat(o.style.left || 0)
+        });
+        var h = {},
+          f = "top ";
+        switch (p.top) {
+          case "target":
+            h.top = u.top + l.top - m.top;
+            break;
+          case "cascade":
+            h.top = l.top - parseFloat(d.paddingTop) - s.style.top;
+            break;
+          case "bottom":
+            h.top = l.top + l.height;
+            break;
+          default:
+            throw new Error('Invalid target mode "' + p.top + '" specified for md-menu on Y axis.')
+        }
+        var b = y.isRtl(e);
+        switch (p.left) {
+          case "target":
+            h.left = u.left + l.left - m.left, f += b ? "right" : "left";
+            break;
+          case "target-left":
+            h.left = l.left, f += "left";
+            break;
+          case "target-right":
+            h.left = l.right - i.width + (i.right - m.right), f += "right";
+            break;
+          case "cascade":
+            var g = b ? l.left - i.width < c.left : l.right + i.width < c.right;
+            h.left = g ? l.right - s.style.left : l.left - s.style.left - i.width, f += g ? "left" : "right";
+            break;
+          case "right":
+            b ? (h.left = l.right - l.width, f += "left") : (h.left = l.right - i.width, f += "right");
+            break;
+          case "left":
+            b ? (h.left = l.right - i.width, f += "right") : (h.left = l.left, f += "left");
+            break;
+          default:
+            throw new Error('Invalid target mode "' + p.left + '" specified for md-menu on X axis.')
+        }
+        var E, v = t.mdMenuCtrl.offsets();
+        h.top += v.top, h.left += v.left, (E = h).top = Math.max(Math.min(E.top, c.bottom - o.offsetHeight), c.top), E.left = Math.max(Math.min(E.left, c.right - o.offsetWidth), c.left);
+        var $ = Math.round(100 * Math.min(l.width / o.offsetWidth, 1)) / 100,
+          M = Math.round(100 * Math.min(l.height / o.offsetHeight, 1)) / 100;
+        return {
+          top: Math.round(h.top),
+          left: Math.round(h.left),
+          transform: t.alreadyOpen ? ge : y.supplant("scale({0},{1})", [$, M]),
+          transformOrigin: f
+        }
+      }
+    }
+
+    function a(e) {
+      return e instanceof be.element && (e = e[0]), e
+    }
+  }
+
+  function Oe(n, r) {
+    return {
+      restrict: "E",
+      require: "mdMenuBar",
+      controller: "MenuBarController",
+      compile: function(e, t) {
+        return t.ariaRole || e[0].setAttribute("role", "menubar"), be.forEach(e[0].children, function(e) {
+            if ("MD-MENU" == e.nodeName) {
+              e.hasAttribute("md-position-mode") || (e.setAttribute("md-position-mode", "left bottom"), e.querySelector("button, a, md-button").setAttribute("role", "menuitem"));
+              var t = n.nodesToArray(e.querySelectorAll("md-menu-content"));
+              be.forEach(t, function(e) {
+                e.classList.add("md-menu-bar-menu"), e.classList.add("md-dense"), e.hasAttribute("width") || e.setAttribute("width", 5)
+              })
+            }
+          }), e.find("md-menu-item").addClass("md-in-menu-bar"),
+          function(e, t, n, o) {
+            t.addClass("_md"), r(e, t), o.init()
+          }
+      }
+    }
+  }
+
+  function Pe(e, t, n) {
+    this.$element = t, this.$attrs = n, this.$scope = e
+  }
+
+  function Le(c, e, m) {
+    return {
+      controller: "MenuItemController",
+      require: ["mdMenuItem", "?ngModel"],
+      priority: e.BEFORE_NG_ARIA,
+      compile: function(o, e) {
+        var t, n, r = e.type,
+          i = "md-in-menu-bar";
+        if ("checkbox" !== r && "radio" !== r || !o.hasClass(i)) l("role", "menuitem", o[0].querySelector("md-button, button, a"));
+        else {
+          var a = o[0].textContent,
+            d = be.element('<md-button type="button"></md-button>'),
+            s = '<md-icon md-svg-src="' + m.mdChecked + '"></md-icon>';
+          d.html(a), d.attr("tabindex", "0"), be.isDefined(e.mdPreventMenuClose) && d.attr("md-prevent-menu-close", e.mdPreventMenuClose), o.html(""), o.append(be.element(s)), o.append(d), o.addClass("md-indent").removeClass(i), l("role", "checkbox" === r ? "menuitemcheckbox" : "menuitemradio", d), t = "ng-disabled", n = c.prefixer(t), be.forEach(n, function(e) {
+            if (o[0].hasAttribute(e)) {
+              var t = o[0].getAttribute(e);
+              d[0].setAttribute(e, t), o[0].removeAttribute(e)
+            }
+          })
+        }
+        return function(e, t, n, o) {
+          var r = o[0],
+            i = o[1];
+          r.init(i)
+        };
+
+        function l(e, t, n) {
+          (n = n || o) instanceof be.element && (n = n[0]), n.hasAttribute(e) || n.setAttribute(e, t)
+        }
+      }
+    }
+  }
+
+  function Re(i, a, d, s) {
+    return {
+      restrict: "E",
+      transclude: !0,
+      controller: Fe,
+      controllerAs: "ctrl",
+      bindToController: !0,
+      scope: {
+        mdSelectedNavItem: "=?",
+        mdNoInkBar: "=?",
+        navBarAriaLabel: "@?"
+      },
+      template: '<div class="md-nav-bar"><nav role="navigation"><ul class="_md-nav-bar-list" ng-transclude role="tablist" ng-focus="ctrl.onFocus()" aria-label="{{ctrl.navBarAriaLabel}}"></ul></nav><md-nav-ink-bar ng-hide="ctrl.mdNoInkBar"></md-nav-ink-bar></div>',
+      link: function(e, t, n, o) {
+        function r() {
+          o.width !== d.innerWidth && (o.updateSelectedTabInkBar(), o.width = d.innerWidth, e.$digest())
+        }
+        o.width = d.innerWidth, be.element(d).on("resize", s.debounce(r, 300)), e.$on("$destroy", function() {
+          be.element(d).off("resize", r)
+        }), a(t), o.navBarAriaLabel || i.expectAsync(t, "aria-label", be.noop)
+      }
+    }
+  }
+
+  function Fe(e, t, n, o) {
+    this._$timeout = n, this._$scope = t, this._$mdConstant = o, this.mdSelectedNavItem, this.navBarAriaLabel, this._navBarEl = e[0], this._inkbar;
+    var r = this,
+      i = this._$scope.$watch(function() {
+        return r._navBarEl.querySelectorAll("._md-nav-button").length
+      }, function(e) {
+        0 < e && (r._initTabs(), i())
+      })
+  }
+
+  function Be(c, e, m, u) {
+    return {
+      restrict: "E",
+      require: ["mdNavItem", "^mdNavBar"],
+      controller: Ue,
+      bindToController: !0,
+      controllerAs: "ctrl",
+      replace: !0,
+      transclude: !0,
+      template: function(e, t) {
+        var n, o, r = t.mdNavClick,
+          i = t.mdNavHref,
+          a = t.mdNavSref,
+          d = t.srefOpts;
+        if (1 < (r ? 1 : 0) + (i ? 1 : 0) + (a ? 1 : 0)) throw Error("Please do not specify more than one of the md-nav-click, md-nav-href, or md-nav-sref attributes per nav-item directive.");
+        if (r !== ge && null !== r) n = 'ng-click="ctrl.mdNavClick()"';
+        else if (i !== ge && null !== i) n = 'ng-href="{{ctrl.mdNavHref}}"';
+        else {
+          if (a === ge || null === a) throw Error("Please specify at least one of the md-nav-click, md-nav-href, or md-nav-sref attributes per nav-item directive.");
+          n = 'ui-sref="{{ctrl.mdNavSref}}"'
+        }
+      },
+      scope: {
+        mdNavClick: "&?",
+        mdNavHref: "@?",
+        mdNavSref: "@?",
+        srefOpts: "=?",
+        name: "@",
+        navItemAriaLabel: "@?"
+      },
+      link: function(n, o, r, i) {
+        var a, d, s, l;
+        e(function() {
+          if (d = i[0], s = i[1], l = be.element(o[0].querySelector("._md-nav-button")), d.name || (d.name = be.element(o[0].querySelector("._md-nav-button-text")).text().trim()), l.on("keydown", function(e) {
+              s.onKeydown(e)
+            }), l.on("focus", function() {
+              d._focused = !0
+            }), l.on("click", function() {
+              s.mdSelectedNavItem = d.name, n.$apply()
+            }), d.disabled = m.parseAttributeBoolean(r.disabled, !1), "MutationObserver" in u) {
+            var e = o[0],
+              t = new MutationObserver(function(e) {
+                m.nextTick(function() {
+                  d.disabled = m.parseAttributeBoolean(r[e[0].attributeName], !1)
+                })
+              });
+            t.observe(e, {
+              attributes: !0,
+              attributeFilter: ["disabled"]
+            }), a = t.disconnect.bind(t)
+          } else r.$observe("disabled", function(e) {
+            d.disabled = m.parseAttributeBoolean(e, !1)
+          });
+          d.navItemAriaLabel || c.expectWithText(l, "aria-label")
+        }), n.$on("destroy", function() {
+          l.off("keydown"), l.off("focus"), l.off("click"), a()
+        })
+      }
+    }
+  }
+
+  function Ue(e) {
+    this._$element = e, this.mdNavClick, this.mdNavHref, this.mdNavSref, this.srefOpts, this.name, this.navItemAriaLabel, this._selected = !1, this.isFocused = !1
+  }
+
+  function je($, M, d, y, p, e) {
+    var C = $.requestAnimationFrame || $.webkitRequestAnimationFrame || be.noop,
+      h = $.cancelAnimationFrame || $.webkitCancelAnimationFrame || $.webkitCancelRequestAnimationFrame || be.noop,
+      f = "determinate",
+      T = "indeterminate",
+      A = "_md-progress-circular-disabled",
+      w = "md-mode-indeterminate";
+    return {
+      restrict: "E",
+      scope: {
+        value: "@",
+        mdDiameter: "@",
+        mdMode: "@"
+      },
+      template: '<svg xmlns="http://www.w3.org/2000/svg"><path fill="none"/></svg>',
+      compile: function(e, t) {
+        if (e.attr({
+            "aria-valuemin": 0,
+            "aria-valuemax": 100,
+            role: "progressbar"
+          }), be.isUndefined(t.mdMode)) {
+          var n = t.hasOwnProperty("value") ? f : T;
+          t.$set("mdMode", n)
+        } else t.$set("mdMode", t.mdMode.trim());
+        return o
+      }
+    };
+
+    function o(b, s, l) {
+      var g, e, t = s[0],
+        a = be.element(t.querySelector("svg")),
+        E = be.element(t.querySelector("path")),
+        n = M.startIndeterminate,
+        o = M.endIndeterminate,
+        r = 0,
+        v = 0;
+
+      function c(n, e, t, o, r, i) {
+        var a = ++v,
+          d = y.now(),
+          s = e - n,
+          l = N(b.mdDiameter),
+          c = S(l),
+          m = t || M.easeFn,
+          u = o || M.duration,
+          p = -90 * (r || 0),
+          h = i || 100;
+
+        function f(e) {
+          E.attr("stroke-dashoffset", k(l, c, e, h)), E.attr("transform", "rotate(" + p + " " + l / 2 + " " + l / 2 + ")")
+        }
+        e === n ? f(e) : g = C(function e() {
+          var t = $.Math.max(0, $.Math.min(y.now() - d, u));
+          f(m(t, n, s, u)), a === v && t < u && (g = C(e))
+        })
+      }
+
+      function i() {
+        c(n, o, M.easeFnIndeterminate, M.durationIndeterminate, r, 75), r = ++r % 4
+      }
+
+      function m() {
+        e || (e = p(i, M.durationIndeterminate, 0, !1), i(), s.addClass(w).removeAttr("aria-valuenow"))
+      }
+
+      function u() {
+        e && (p.cancel(e), e = null, s.removeClass(w))
+      }
+      d(s), s.toggleClass(A, l.hasOwnProperty("disabled")), b.mdMode === T && m(), b.$on("$destroy", function() {
+        u(), g && h(g)
+      }), b.$watchGroup(["value", "mdMode", function() {
+        var e = t.disabled;
+        return !0 === e || !1 === e ? e : be.isDefined(s.attr("disabled"))
+      }], function(e, t) {
+        var n = e[1],
+          o = e[2],
+          r = 0,
+          i = 0;
+        if (o !== t[2] && s.toggleClass(A, !!o), o) u();
+        else if (n !== f && n !== T && (n = T, l.$set("mdMode", n)), n === T) t[1] === f && (i = S(r = N(b.mdDiameter)), E.attr("d", _(r, i, !0)), E.attr("stroke-dasharray", D(r, i, 75))), m();
+        else {
+          var a = x(e[0]),
+            d = x(t[0]);
+          u(), t[1] === T && (i = S(r = N(b.mdDiameter)), E.attr("d", _(r, i, !1)), E.attr("stroke-dasharray", D(r, i, 100))), s.attr("aria-valuenow", a), c(d, a)
+        }
+      }), b.$watch("mdDiameter", function(e) {
+        var t = N(e),
+          n = S(t),
+          o = x(b.value),
+          r = t / 2 + "px",
+          i = {
+            width: t + "px",
+            height: t + "px"
+          };
+        a[0].setAttribute("viewBox", "0 0 " + t + " " + t), a.css(i).css("transform-origin", r + " " + r + " " + r), s.css(i), E.attr("stroke-width", n), E.attr("stroke-linecap", "square"), b.mdMode == T ? (E.attr("d", _(t, n, !0)), E.attr("stroke-dasharray", D(t, n, 75)), E.attr("stroke-dashoffset", k(t, n, 1, 75))) : (E.attr("d", _(t, n, !1)), E.attr("stroke-dasharray", D(t, n, 100)), E.attr("stroke-dashoffset", k(t, n, 0, 100)), c(o, o))
+      })
+    }
+
+    function _(e, t, n) {
+      var o = e / 2,
+        r = t / 2,
+        i = o + "," + r,
+        a = o - r;
+      return "M" + i + "A" + a + "," + a + " 0 1 1 " + (r + "," + o) + (n ? "" : "A" + a + "," + a + " 0 0 1 " + i)
+    }
+
+    function k(e, t, n, o) {
+      return r(e, t) * ((o - n) / 100)
+    }
+
+    function x(e) {
+      return $.Math.max(0, $.Math.min(e || 0, 100))
+    }
+
+    function N(e) {
+      var t = M.progressSize;
+      if (e) {
+        var n = parseFloat(e);
+        return e.lastIndexOf("%") === e.length - 1 && (n = n / 100 * t), n
+      }
+      return t
+    }
+
+    function S(e) {
+      return M.strokeWidth / 100 * e
+    }
+
+    function D(e, t, n) {
+      return r(e, t) * (n / 100)
+    }
+
+    function r(e, t) {
+      return (e - t) * $.Math.PI
+    }
+  }
+
+  function ze(m, u, e) {
+    var p = "determinate",
+      h = "indeterminate",
+      f = "buffer",
+      b = "query",
+      g = "_md-progress-linear-disabled";
+    return {
+      restrict: "E",
+      template: '<div class="md-container"><div class="md-dashed"></div><div class="md-bar md-bar1"></div><div class="md-bar md-bar2"></div></div>',
+      compile: function(e, t, n) {
+        return e.attr("aria-valuemin", 0), e.attr("aria-valuemax", 100), e.attr("role", "progressbar"), o
+      }
+    };
+
+    function o(e, n, t) {
+      var o;
+      m(n);
+      var r = t.hasOwnProperty("disabled"),
+        i = u.dom.animator.toCss,
+        a = be.element(n[0].querySelector(".md-bar1")),
+        d = be.element(n[0].querySelector(".md-bar2")),
+        s = be.element(n[0].querySelector(".md-container"));
+
+      function l() {
+        var e = (t.mdMode || "").trim();
+        if (e) switch (e) {
+          case p:
+          case h:
+          case f:
+          case b:
+            break;
+          default:
+            e = h
+        }
+        return e
+      }
+
+      function c(e, t) {
+        if (!r && l()) {
+          var n = u.supplant("translateX({0}%) scale({1},1)", [(t - 100) / 2, t / 100]),
+            o = i({
+              transform: n
+            });
+          be.element(e).css(o)
+        }
+      }
+      n.attr("md-mode", l()).toggleClass(g, r),
+        function() {
+          if (be.isUndefined(t.mdMode)) {
+            var e = be.isDefined(t.value) ? p : h;
+            n.attr("md-mode", e), t.mdMode = e
+          }
+        }(), t.$observe("value", function(e) {
+          var t = E(e);
+          n.attr("aria-valuenow", t), l() != b && c(d, t)
+        }), t.$observe("mdBufferValue", function(e) {
+          c(a, E(e))
+        }), t.$observe("disabled", function(e) {
+          r = !0 === e || !1 === e ? !!e : be.isDefined(e), n.toggleClass(g, r), s.toggleClass(o, !r)
+        }), t.$observe("mdMode", function(e) {
+          switch (o && s.removeClass(o), e) {
+            case b:
+            case f:
+            case p:
+            case h:
+              s.addClass(o = "md-mode-" + e);
+              break;
+            default:
+              s.addClass(o = "md-mode-" + h)
+          }
+        })
+    }
+
+    function E(e) {
+      return Math.max(0, Math.min(e || 0, 100))
+    }
+  }
+
+  function qe(s, l) {
+    return ["$mdUtil", "$window", function(a, d) {
+      return {
+        restrict: "A",
+        multiElement: !0,
+        link: function(o, r, t) {
+          var i = o.$on("$md-resize-enable", function() {
+            i();
+            var e = r[0],
+              n = e.nodeType === d.Node.ELEMENT_NODE ? d.getComputedStyle(e) : {};
+            o.$watch(t[s], function(e) {
+              if (!!e === l) {
+                a.nextTick(function() {
+                  o.$broadcast("$md-resize")
+                });
+                var t = {
+                  cachedTransitionStyles: n
+                };
+                a.dom.animator.waitTransitionEnd(r, t).then(function() {
+                  o.$broadcast("$md-resize")
+                })
+              }
+            })
+          })
+        }
+      }
+    }]
+  }
+
+  function Ve(o, r, i, a) {
+    var d = "SideNav '{0}' is not available! Did you use md-component-id='{0}'?",
+      s = {
+        find: function(e, t) {
+          var n = o.get(e);
+          return n || t ? n : (a.error(r.supplant(d, [e || ""])), ge)
+        },
+        waitFor: l
+      };
+    return function(e, t) {
+      if (be.isUndefined(e)) return s;
+      var n = !0 === t,
+        o = s.find(e, n);
+      return !o && n ? s.waitFor(e) : !o && be.isUndefined(t) ? function(e, t) {
+        function n() {
+          return !1
+        }
+
+        function o() {
+          return i.when(r.supplant(d, [t || ""]))
+        }
+        return be.extend({
+          isLockedOpen: n,
+          isOpen: n,
+          toggle: o,
+          open: o,
+          close: o,
+          onClose: be.noop,
+          then: function(e) {
+            return l(t).then(e || be.noop)
+          }
+        }, e)
+      }(s, e) : o
+    };
+
+    function l(e) {
+      return o.when(e).catch(a.error)
+    }
+  }
+
+  function We(o, g, E, v, $, M, e, y, C, T, A, w, _) {
+    return {
+      restrict: "E",
+      scope: {
+        isOpen: "=?mdIsOpen"
+      },
+      controller: "$mdSidenavController",
+      compile: function(e) {
+        return e.addClass("md-closed").attr("tabIndex", "-1"), t
+      }
+    };
+
+    function t(r, i, e, t) {
+      var a, d, s, l, c, m = null,
+        u = null,
+        p = T.when(!0),
+        n = y(e.mdIsLockedOpen),
+        h = be.element(w);
+
+      function f(e) {
+        return e.keyCode === E.KEY_CODE.ESCAPE ? b(e) : T.when(!0)
+      }
+
+      function b(e) {
+        return e.preventDefault(), t.close()
+      }
+      e.mdDisableScrollTarget && ((m = A[0].querySelector(e.mdDisableScrollTarget)) ? m = be.element(m) : C.warn(g.supplant('mdSidenav: couldn\'t find element matching selector "{selector}". Falling back to parent.', {
+        selector: e.mdDisableScrollTarget
+      }))), m = m || i.parent(), e.hasOwnProperty("mdDisableBackdrop") || (d = g.createBackdrop(r, "md-sidenav-backdrop md-opaque ng-enter")), e.hasOwnProperty("mdDisableCloseEvents") && (s = !0), i.addClass("_md"), v(i), d && v.inherit(d, i), i.on("$destroy", function() {
+        d && d.remove(), t.destroy()
+      }), r.$on("$destroy", function() {
+        d && d.remove()
+      }), r.$watch(function() {
+        return n(r.$parent, {
+          $mdMedia: o
+        })
+      }, function(e, t) {
+        (r.isLockedOpen = e) === t ? i.toggleClass("md-locked-open", !!e) : M[e ? "addClass" : "removeClass"](i, "md-locked-open");
+        d && d.toggleClass("md-locked-open", !!e)
+      }), r.$watch("isOpen", function(e) {
+        var t, n = g.findFocusTarget(i) || i,
+          o = i.parent();
+        s || (o[e ? "on" : "off"]("keydown", f), d && d[e ? "on" : "off"]("click", b));
+        t = function(e, t) {
+          var n = i[0],
+            o = e[0].scrollTop;
+          if (t && o) {
+            c = {
+              top: n.style.top,
+              bottom: n.style.bottom,
+              height: n.style.height
+            };
+            var r = {
+              top: o + "px",
+              bottom: "auto",
+              height: e[0].clientHeight + "px"
+            };
+            i.css(r), d.css(r)
+          }
+          if (!t && c) return function() {
+            n.style.top = c.top, n.style.bottom = c.bottom, n.style.height = c.height, d[0].style.top = null, d[0].style.bottom = null, d[0].style.height = null, c = null
+          }
+        }(o, e), e && (u = A[0].activeElement, l = $.getLastInteractionType());
+        return function(e) {
+          e && !a ? (a = m.css("overflow"), m.css("overflow", "hidden")) : be.isDefined(a) && (m.css("overflow", a), a = ge)
+        }(e), p = T.all([e && d ? M.enter(d, o) : d ? M.leave(d) : T.when(!0), M[e ? "removeClass" : "addClass"](i, "md-closed")]).then(function() {
+          r.isOpen && (_(function() {
+            h.triggerHandler("resize")
+          }), n && n.focus()), t && t()
+        })
+      }), t.$toggleOpen = function(e) {
+        return r.isOpen === e ? T.when(!0) : (r.isOpen && t.onCloseCb && t.onCloseCb(), T(function(t) {
+          r.isOpen = e, g.nextTick(function() {
+            p.then(function(e) {
+              !r.isOpen && u && "keyboard" === l && (u.focus(), u = null), t(e)
+            })
+          })
+        }))
+      }
+    }
+  }
+
+  function Ye(t, e, n, o, r) {
+    var i = this;
+    i.isOpen = function() {
+      return !!t.isOpen
+    }, i.isLockedOpen = function() {
+      return !!t.isLockedOpen
+    }, i.onClose = function(e) {
+      return i.onCloseCb = e, i
+    }, i.open = function() {
+      return i.$toggleOpen(!0)
+    }, i.close = function() {
+      return i.$toggleOpen(!1)
+    }, i.toggle = function() {
+      return i.$toggleOpen(!t.isOpen)
+    }, i.$toggleOpen = function(e) {
+      return o.when(t.isOpen = e)
+    };
+    var a = e.mdComponentId,
+      d = a && -1 < a.indexOf(r.startSymbol()),
+      s = d ? r(a)(t.$parent) : a;
+    i.destroy = n.register(i, s), d && e.$observe("mdComponentId", function(e) {
+      e && e !== i.$$mdHandle && (i.destroy(), i.destroy = n.register(i, e))
+    })
+  }
+
+  function Ke(l, c, m, d) {
+    var s = m.checkStickySupport();
+    return function(e, t, n) {
+      var o = t.controller("mdContent");
+      if (o)
+        if (s) t.css({
+          position: s,
+          top: 0,
+          "z-index": 2
+        });
+        else {
+          var r = o.$element.data("$$sticky");
+          r || (r = function(e) {
+            var o, r = e.$element,
+              i = c.throttle(t);
+            return function(e) {
+              var t, n, o = 200;
+
+              function r() {
+                +m.now() - n > o ? (t = !1, e.triggerHandler("$scrollend")) : (e.triggerHandler("$scroll"), c.throttle(r))
+              }
+              e.on("scroll touchmove", function() {
+                t || (t = !0, c.throttle(r), e.triggerHandler("$scrollstart")), e.triggerHandler("$scroll"), n = +m.now()
+              })
+            }(r), r.on("$scrollstart", i), r.on("$scroll", function e() {
+              var t = r.prop("scrollTop");
+              var n = (e.prevScrollTop || 0) < t;
+              e.prevScrollTop = t;
+              if (0 === t) return void d(null);
+              if (n) {
+                if (o.next && o.next.top <= t) return void d(o.next);
+                if (o.current && o.next && o.next.top - t <= o.next.height) return void s(o.current, t + (o.next.top - o.next.height - t))
+              }
+              if (!n) {
+                if (o.current && o.prev && t < o.current.top) return void d(o.prev);
+                if (o.next && o.current && t >= o.next.top - o.current.height) return void s(o.current, t + (o.next.top - t - o.current.height))
+              }
+              o.current && s(o.current, t)
+            }), o = {
+              prev: null,
+              current: null,
+              next: null,
+              items: [],
+              add: function(n, e) {
+                e.addClass("md-sticky-clone");
+                var t = {
+                  element: n,
+                  clone: e
+                };
+                return o.items.push(t), m.nextTick(function() {
+                    r.prepend(t.clone)
+                  }), i(),
+                  function() {
+                    o.items.forEach(function(e, t) {
+                      e.element[0] === n[0] && (o.items.splice(t, 1), e.clone.remove())
+                    }), i()
+                  }
+              },
+              refreshElements: t
+            };
+
+            function t() {
+              var e;
+              o.items.forEach(a), o.items = o.items.sort(function(e, t) {
+                return e.top < t.top ? -1 : 1
+              });
+              for (var t = r.prop("scrollTop"), n = o.items.length - 1; 0 <= n; n--)
+                if (t > o.items[n].top) {
+                  e = o.items[n];
+                  break
+                } d(e)
+            }
+
+            function a(e) {
+              var t = e.element[0];
+              for (e.top = 0, e.left = 0, e.right = 0; t && t !== r[0];) e.top += t.offsetTop, e.left += t.offsetLeft, t.offsetParent && (e.right += t.offsetParent.offsetWidth - t.offsetWidth - t.offsetLeft), t = t.offsetParent;
+              e.height = e.element.prop("offsetHeight");
+              var n = m.floatingScrollbars() ? "0" : ge;
+              m.bidi(e.clone, "margin-left", e.left, n), m.bidi(e.clone, "margin-right", n, e.right)
+            }
+
+            function d(e) {
+              if (o.current !== e) {
+                o.current && (s(o.current, null), n(o.current, null)), e && n(e, "active"), o.current = e;
+                var t = o.items.indexOf(e);
+                o.next = o.items[t + 1], o.prev = o.items[t - 1], n(o.next, "next"), n(o.prev, "prev")
+              }
+            }
+
+            function n(e, t) {
+              e && e.state !== t && (e.state && (e.clone.attr("sticky-prev-state", e.state), e.element.attr("sticky-prev-state", e.state)), e.clone.attr("sticky-state", t), e.element.attr("sticky-state", t), e.state = t)
+            }
+
+            function s(e, t) {
+              e && (null === t || t === ge ? e.translateY && (e.translateY = null, e.clone.css(l.CSS.TRANSFORM, "")) : (e.translateY = t, m.bidi(e.clone, l.CSS.TRANSFORM, "translate3d(" + e.left + "px," + t + "px,0)", "translateY(" + t + "px)")))
+            }
+          }(o), o.$element.data("$$sticky", r));
+          var i = n || d(t.clone())(e),
+            a = r.add(t, i);
+          e.$on("$destroy", a)
+        }
+    }
+  }
+
+  function Ge(d, s, l, c, m) {
+    return {
+      restrict: "E",
+      replace: !0,
+      transclude: !0,
+      template: '<div class="md-subheader _md">  <div class="md-subheader-inner">    <div class="md-subheader-content"></div>  </div></div>',
+      link: function(n, o, e, t, r) {
+        l(o), o.addClass("_md"), c.prefixer().removeAttribute(o, "ng-repeat");
+        var i = o[0].outerHTML;
+
+        function a(e) {
+          return be.element(e[0].querySelector(".md-subheader-content"))
+        }
+        e.$set("role", "heading"), m.expect(o, "aria-level", "2"), r(n, function(e) {
+          a(o).append(e)
+        }), o.hasClass("md-no-sticky") || r(n, function(e) {
+          var t = s('<div class="md-subheader-wrapper" aria-hidden="true">' + i + "</div>")(n);
+          c.nextTick(function() {
+            a(t).append(e)
+          }), d(n, o, t)
+        })
+      }
+    }
+  }
+
+  function Xe(e) {
+    t.$inject = ["$parse"];
+    var i = "md" + e,
+      a = "$md." + e.toLowerCase();
+    return t;
+
+    function t(r) {
+      return {
+        restrict: "A",
+        link: function(n, e, t) {
+          var o = r(t[i]);
+          e.on(a, function(e) {
+            var t = e.currentTarget;
+            n.$applyAsync(function() {
+              o(n, {
+                $event: e,
+                $target: {
+                  current: t
+                }
+              })
+            })
+          })
+        }
+      }
+    }
+  }
+
+  function Ze(e, m, u, p, h, f, b) {
+    var n = e[0];
+    return {
+      restrict: "E",
+      priority: u.BEFORE_NG_ARIA,
+      transclude: !0,
+      template: '<div class="md-container"><div class="md-bar"></div><div class="md-thumb-container"><div class="md-thumb" md-ink-ripple md-ink-ripple-checkbox></div></div></div><div ng-transclude class="md-label"></div>',
+      require: ["^?mdInputContainer", "?ngModel", "?^form"],
+      compile: function(e, t) {
+        var c = n.compile(e, t).post;
+        return e.addClass("md-dragging"),
+          function(t, n, e, o) {
+            o[0];
+            var r = o[1] || m.fakeNgModel(),
+              i = (o[2], null);
+            null != e.disabled ? i = function() {
+              return !0
+            } : e.ngDisabled && (i = p(e.ngDisabled));
+            var a, d = be.element(n[0].querySelector(".md-thumb-container")),
+              s = be.element(n[0].querySelector(".md-container")),
+              l = be.element(n[0].querySelector(".md-label"));
+            h(function() {
+              n.removeClass("md-dragging")
+            }), c(t, n, e, o), i && t.$watch(i, function(e) {
+              n.attr("tabindex", e ? -1 : 0)
+            }), e.$observe("mdInvert", function(e) {
+              var t = m.parseAttributeBoolean(e);
+              t ? n.prepend(l) : n.prepend(s), n.toggleClass("md-inverted", t)
+            }), f.register(s, "drag"), s.on("$md.dragstart", function(e) {
+              if (i && i(t)) return;
+              e.stopPropagation(), n.addClass("md-dragging"), a = {
+                width: d.prop("offsetWidth")
+              }
+            }).on("$md.drag", function(e) {
+              if (!a) return;
+              e.stopPropagation(), e.srcEvent && e.srcEvent.preventDefault();
+              var t = e.pointer.distanceX / a.width,
+                n = r.$viewValue ? 1 + t : t;
+              n = Math.max(0, Math.min(1, n)), d.css(u.CSS.TRANSFORM, "translate3d(" + 100 * n + "%,0,0)"), a.translate = n
+            }).on("$md.dragend", function(e) {
+              if (!a) return;
+              e.stopPropagation(), n.removeClass("md-dragging"), d.css(u.CSS.TRANSFORM, ""), (r.$viewValue ? a.translate < .5 : .5 < a.translate) && function(e) {
+                t.$apply(function() {
+                  r.$setViewValue(e), r.$render()
+                })
+              }(!r.$viewValue);
+              a = null, t.skipToggle = !0, b(function() {
+                t.skipToggle = !1
+              }, 1)
+            })
+          }
+      }
+    }
+  }
+
+  function Qe(o) {
+    return {
+      restrict: "A",
+      compile: function(e, t) {
+        var n = o(t.mdTabScroll, null, !0);
+        return function(t, e) {
+          e.on("wheel", function(e) {
+            t.$apply(function() {
+              n(t, {
+                $event: e
+              })
+            })
+          })
+        }
+      }
+    }
+  }
+
+  function Je(l, c, t, n, r, m, s, i, o, e, a, u, d) {
+    var p = this,
+      h = !1,
+      f = [],
+      b = !1,
+      g = !1;
+
+    function E(t, e) {
+      var n = i.$normalize("md-" + t);
+
+      function o(e) {
+        p[t] = "false" !== e
+      }
+      e && O(t, e, ge), i.hasOwnProperty(n) && o(i[n]), i.$observe(n, o)
+    }
+
+    function v() {
+      b = !0, be.element(t).off("resize", x)
+    }
+
+    function $() {
+      var e = D();
+      be.element(e.wrapper).toggleClass("md-stretch-tabs", function() {
+        switch (p.stretchTabs) {
+          case "always":
+            return !0;
+          case "never":
+            return !1;
+          default:
+            return !p.shouldPaginate && t.matchMedia("(max-width: 600px)").matches
+        }
+      }()), q()
+    }
+
+    function M() {
+      p.shouldCenterTabs = H()
+    }
+
+    function y(t, e) {
+      if (t !== e) {
+        var n = D();
+        be.forEach(n.tabs, function(e) {
+          e.style.maxWidth = t + "px"
+        }), be.forEach(n.dummies, function(e) {
+          e.style.maxWidth = t + "px"
+        }), m.nextTick(p.updateInkBarStyles)
+      }
+    }
+
+    function C(e, t) {
+      e !== t && (p.maxTabWidth = R(), p.shouldCenterTabs = H(), m.nextTick(function() {
+        p.maxTabWidth = R(), U(p.selectedIndex)
+      }))
+    }
+
+    function T(e) {
+      c[e ? "removeClass" : "addClass"]("md-no-tab-content")
+    }
+
+    function A(e) {
+      var t = (p.shouldCenterTabs || W() ? "" : "-") + e + "px";
+      t = t.replace("--", ""), be.element(D().paging).css(n.CSS.TRANSFORM, "translate(" + t + ", 0)"), l.$broadcast("$mdTabsPaginationChanged")
+    }
+
+    function w(e, t) {
+      e !== t && D().tabs[e] && (U(), B())
+    }
+
+    function _(e, t) {
+      e !== t && (p.selectedIndex = I(e), p.lastSelectedIndex = t, p.updateInkBarStyles(), z(), U(e), l.$broadcast("$mdTabsChanged"), p.tabs[t] && p.tabs[t].scope.deselect(), p.tabs[e] && p.tabs[e].scope.select())
+    }
+
+    function k(e, t) {
+      h || (p.focusIndex = p.selectedIndex = e), t && p.noSelectClick || m.nextTick(function() {
+        p.tabs[e].element.triggerHandler("click")
+      }, !1)
+    }
+
+    function x() {
+      p.lastSelectedIndex = p.selectedIndex, p.offsetLeft = V(p.offsetLeft), m.nextTick(function() {
+        p.updateInkBarStyles(), P()
+      })
+    }
+
+    function N(e) {
+      be.element(D().inkBar).toggleClass("ng-hide", e)
+    }
+
+    function S(e) {
+      c.toggleClass("md-dynamic-height", e)
+    }
+
+    function D() {
+      var e = {},
+        t = c[0];
+    }
+
+    function H() {
+      return p.centerTabs && !p.shouldPaginate
+    }
+
+    function I(e) {
+      if (-1 === e) return -1;
+      var t, n, o = Math.max(p.tabs.length - e, e);
+      for (t = 0; t <= o; t++) {
+        if ((n = p.tabs[e + t]) && !0 !== n.scope.disabled) return n.getIndex();
+        if ((n = p.tabs[e - t]) && !0 !== n.scope.disabled) return n.getIndex()
+      }
+      return e
+    }
+
+    function O(e, n, o) {
+      Object.defineProperty(p, e, {
+        get: function() {
+          return o
+        },
+        set: function(e) {
+          var t = o;
+          o = e, n && n(e, t)
+        }
+      })
+    }
+
+    function P() {
+      p.maxTabWidth = R(), p.shouldPaginate = function() {
+        var e;
+        if (p.noPagination || !g) return !1;
+        var t = c.prop("clientWidth");
+        return be.forEach(D().tabs, function(e) {
+          t -= e.offsetWidth
+        }), e = t < 0, m.msie && (D().paging.style.width = e ? "999999px" : ge), e
+      }()
+    }
+
+    function L(e) {
+      var t = 0;
+      return be.forEach(e, function(e) {
+        t += Math.max(e.offsetWidth, e.getBoundingClientRect().width)
+      }), Math.ceil(t)
+    }
+
+    function R() {
+      var e = D().canvas.clientWidth;
+      return Math.max(0, Math.min(e - 1, 264))
+    }
+
+    function F(e, t) {
+      var n, o = t ? "focusIndex" : "selectedIndex",
+        r = p[o];
+      for (n = r + e; p.tabs[n] && p.tabs[n].scope.disabled; n += e);
+      n = (r + e + p.tabs.length) % p.tabs.length, p.tabs[n] && (p[o] = n)
+    }
+
+    function B() {
+      p.styleTabItemFocus = "keyboard" === a.getLastInteractionType();
+      var e = D().tabs[p.focusIndex];
+      e && e.focus()
+    }
+
+    function U(e) {
+      var t = D();
+      if (be.isNumber(e) || (e = p.focusIndex), t.tabs[e] && !p.shouldCenterTabs) {
+        var n = t.tabs[e],
+          o = n.offsetLeft,
+          r = n.offsetWidth + o;
+        if (0 !== e)
+          if (W()) {
+            var i = L(Array.prototype.slice.call(t.tabs, 0, e)),
+              a = L(Array.prototype.slice.call(t.tabs, 0, e + 1));
+            p.offsetLeft = Math.min(p.offsetLeft, V(i)), p.offsetLeft = Math.max(p.offsetLeft, V(a - t.canvas.clientWidth))
+          } else p.offsetLeft = Math.max(p.offsetLeft, V(r - t.canvas.clientWidth + 32)), p.offsetLeft = Math.min(p.offsetLeft, V(o));
+        else p.offsetLeft = 0
+      }
+    }
+
+    function j() {
+      p.selectedIndex = I(p.selectedIndex), p.focusIndex = I(p.focusIndex)
+    }
+
+    function z() {
+      if (!p.dynamicHeight) return c.css("height", "");
+      if (!p.tabs.length) return f.push(z);
+      var e = D(),
+        t = e.contents[p.selectedIndex],
+        n = t ? t.offsetHeight : 0,
+        o = e.wrapper.offsetHeight,
+        r = n + o,
+        i = c.prop("clientHeight");
+      if (i !== r) {
+        "bottom" === c.attr("md-align-tabs") && (i -= o, r -= o, c.attr("md-border-bottom") !== ge && ++i), h = !0;
+        var a = {
+            height: i + "px"
+          },
+          d = {
+            height: r + "px"
+          };
+        c.css(a), s(c, {
+          from: a,
+          to: d,
+          easing: "cubic-bezier(0.35, 0, 0.25, 1)",
+          duration: .5
+        }).start().done(function() {
+          c.css({
+            transition: "none",
+            height: ""
+          }), m.nextTick(function() {
+            c.css("transition", "")
+          }), h = !1
+        })
+      }
+    }
+
+    function q(e, t) {
+      if (!p.noInkBar) {
+        var n = D();
+        if (n.tabs[p.selectedIndex])
+          if (p.tabs.length)
+            if (c.prop("offsetParent")) {
+              var o = p.selectedIndex,
+                r = n.paging.offsetWidth,
+                i = n.tabs[o],
+                a = i.offsetLeft,
+                d = r - a - i.offsetWidth;
+              if (p.shouldCenterTabs) {
+                var s = L(n.tabs);
+                s < r && e !== r && t !== s && u(q, 0, !0, r, s)
+              }! function() {
+                var e = D(),
+                  t = p.selectedIndex,
+                  n = p.lastSelectedIndex,
+                  o = be.element(e.inkBar);
+                if (!be.isNumber(n)) return;
+                o.toggleClass("md-left", t < n).toggleClass("md-right", n < t)
+              }(), be.element(n.inkBar).css({
+                left: a + "px",
+                right: d + "px"
+              })
+            } else(function e() {
+              e.watcher || (e.watcher = l.$watch(function() {
+                m.nextTick(function() {
+                  e.watcher && c.prop("offsetParent") && (e.watcher(), e.watcher = null, x())
+                }, !1)
+              }))
+            })();
+        else f.push(p.updateInkBarStyles);
+        else be.element(n.inkBar).css({
+          left: "auto",
+          right: "auto"
+        })
+      }
+    }
+
+    function V(e) {
+      var t = D();
+      if (!t.tabs.length || !p.shouldPaginate) return 0;
+      var n = t.tabs[t.tabs.length - 1],
+        o = n.offsetLeft + n.offsetWidth;
+      return e = W() ? (e = Math.min(t.paging.offsetWidth - t.canvas.clientWidth, e), Math.max(0, e)) : (e = Math.max(0, e), Math.min(o - t.canvas.clientWidth, e))
+    }
+
+    function W() {
+      return m.isRtl(i)
+    }
+    p.$onInit = function() {
+      (function(t, e) {
+        var n = i.$normalize("md-" + t);
+        e && O(t, e);
+        i.$observe(n, function(e) {
+          p[t] = e
+        })
+      })("stretchTabs", $), O("focusIndex", w, p.selectedIndex || 0), O("offsetLeft", A, 0), O("hasContent", T, !1), O("maxTabWidth", y, R()), O("shouldPaginate", C, !1), E("noInkBar", N), E("dynamicHeight", S), E("noPagination"), E("swipeContent"), E("autoselect"), E("noSelectClick"), E("centerTabs", M), E("enableDisconnect"), p.scope = l, p.parent = l.$parent, p.tabs = [], p.lastSelectedIndex = null, p.hasFocus = !1, p.styleTabItemFocus = !1, p.shouldCenterTabs = H(), p.tabContentPrefix = "tab-content-", p.navigationHint = "Use the left and right arrow keys to navigate between tabs", p.selectedIndex = p.selectedIndex || 0,
+        function() {
+          var e = i.$mdTabsTemplate,
+            t = be.element(c[0].querySelector("md-tab-data"));
+          t.html(e), o(t.contents())(p.parent), delete i.$mdTabsTemplate
+        }(), l.$watch("$mdTabsCtrl.selectedIndex", _), be.element(t).on("resize", x), l.$on("$destroy", v), e(c), m.nextTick(function() {
+          z(), U(), q(), p.tabs[p.selectedIndex] && p.tabs[p.selectedIndex].scope.select(), g = !0, P()
+        })
+    }, p.updatePagination = m.debounce(P, 100), p.redirectFocus = B, p.attachRipple = function(e, t) {
+      var n = D(),
+        o = {
+          colorElement: be.element(n.inkBar)
+        };
+      r.attach(e, t, o)
+    }, p.insertTab = function(e, t) {
+      var n = g,
+        o = {
+          getIndex: function() {
+            return p.tabs.indexOf(r)
+          },
+          isActive: function() {
+            return this.getIndex() === p.selectedIndex
+          },
+          isLeft: function() {
+            return this.getIndex() < p.selectedIndex
+          },
+          isRight: function() {
+            return this.getIndex() > p.selectedIndex
+          },
+          shouldRender: function() {
+            return p.dynamicHeight || this.isActive()
+          },
+          hasFocus: function() {
+            return p.styleTabItemFocus && p.hasFocus && this.getIndex() === p.focusIndex
+          },
+          id: m.nextUid(),
+          hasContent: !(!e.template || !e.template.trim())
+        },
+        r = be.extend(o, e);
+      be.isDefined(t) ? p.tabs.splice(t, 0, r) : p.tabs.push(r);
+      return function() {
+          f.forEach(function(e) {
+            m.nextTick(e)
+          }), f = []
+        }(),
+        function() {
+          var e, t = !1;
+          for (e = 0; e < p.tabs.length; e++)
+            if (p.tabs[e].hasContent) {
+              t = !0;
+              break
+            } p.hasContent = t
+        }(), m.nextTick(function() {
+          P(),
+            function(e) {
+              if (e.hasContent) {
+                var t = c[0].querySelectorAll('[md-tab-id="' + e.id + '"]');
+                be.element(t).attr("aria-controls", p.tabContentPrefix + e.id)
+              }
+            }(r), n && p.autoselect && m.nextTick(function() {
+              m.nextTick(function() {
+                k(p.tabs.indexOf(r))
+              })
+            })
+        }), r
+    }, p.removeTab = function(e) {
+      if (b) return;
+      var t = p.selectedIndex,
+        n = p.tabs.splice(e.getIndex(), 1)[0];
+      j(), p.selectedIndex === t && (n.scope.deselect(), p.tabs[p.selectedIndex] && p.tabs[p.selectedIndex].scope.select());
+      m.nextTick(function() {
+        P(), p.offsetLeft = V(p.offsetLeft)
+      })
+    }, p.select = k, p.scroll = function(e) {
+      if (!p.shouldPaginate) return;
+      e.preventDefault(), e.deltaY ? p.offsetLeft = V(p.offsetLeft + e.deltaY) : e.deltaX && (p.offsetLeft = V(p.offsetLeft + e.deltaX))
+    }, p.nextPage = function() {
+      if (!p.canPageForward()) return;
+      var e = d.increasePageOffset(D(), p.offsetLeft);
+      p.offsetLeft = V(e)
+    }, p.previousPage = function() {
+      if (!p.canPageBack()) return;
+      var e = d.decreasePageOffset(D(), p.offsetLeft);
+      p.offsetLeft = V(e)
+    }, p.keydown = function(e) {
+      switch (e.keyCode) {
+        case n.KEY_CODE.LEFT_ARROW:
+          e.preventDefault(), F(-1, !0);
+          break;
+        case n.KEY_CODE.RIGHT_ARROW:
+          e.preventDefault(), F(1, !0);
+          break;
+        case n.KEY_CODE.SPACE:
+        case n.KEY_CODE.ENTER:
+          e.preventDefault(), h || k(p.focusIndex);
+          break;
+        case n.KEY_CODE.TAB:
+          p.focusIndex !== p.selectedIndex && (p.focusIndex = p.selectedIndex)
+      }
+    }, p.canPageForward = function() {
+      var e = D(),
+        t = e.tabs[e.tabs.length - 1];
+      if (W()) return p.offsetLeft < e.paging.offsetWidth - e.canvas.offsetWidth;
+      return t && t.offsetLeft + t.offsetWidth > e.canvas.clientWidth + p.offsetLeft
+    }, p.canPageBack = function() {
+      return 0 < p.offsetLeft
+    }, p.refreshIndex = j, p.incrementIndex = F, p.getTabElementIndex = function(e) {
+      var t = c[0].getElementsByTagName("md-tab");
+      return Array.prototype.indexOf.call(t, e[0])
+    }, p.updateInkBarStyles = m.debounce(q, 100), p.updateTabOrder = m.debounce(function() {
+      var e = p.tabs[p.selectedIndex],
+        t = p.tabs[p.focusIndex];
+      p.tabs = p.tabs.sort(function(e, t) {
+        return e.index - t.index
+      }), p.selectedIndex = p.tabs.indexOf(e), p.focusIndex = p.tabs.indexOf(t)
+    }, 100), p.getFocusedTabId = function() {
+      var e = p.tabs[p.focusIndex];
+      return e && e.id ? "tab-item-" + e.id : null
+    }, 1 === be.version.major && be.version.minor <= 4 && this.$onInit()
+  }
+
+  function et(n) {
+    return {
+      scope: {
+        navigationHint: "@?mdNavigationHint",
+        selectedIndex: "=?mdSelected"
+      },
+      template: function(e, t) {
+      },
+      controller: "MdTabsController",
+      controllerAs: "$mdTabsCtrl",
+      bindToController: !0
+    }
+  }
+
+  function tt(s, l) {
+    return {
+      require: "^?mdTabs",
+      link: function(e, t, n, o) {
+        if (o) {
+          var r, i, a = function() {
+            o.updatePagination(), o.updateInkBarStyles()
+          };
+          if ("MutationObserver" in l) {
+            (r = new MutationObserver(a)).observe(t[0], {
+              childList: !0,
+              subtree: !0,
+              characterData: !0
+            }), i = r.disconnect.bind(r)
+          } else {
+            var d = s.debounce(a, 15, null, !1);
+            t.on("DOMSubtreeModified", d), i = t.off.bind(t, "DOMSubtreeModified", d)
+          }
+          e.$on("$destroy", function() {
+            i()
+          })
+        }
+      }
+    }
+  }
+
+  function nt(a, d) {
+    return {
+      restrict: "A",
+      link: function(e, t, n, o) {
+        if (!o) return;
+        var r = o.enableDisconnect ? e.compileScope.$new() : e.compileScope;
+        return t.html(e.template), a(t.contents())(r), d.nextTick(function() {
+          e.$watch("connected", function(e) {
+            !1 === e ? o.enableDisconnect && d.disconnectScope(r) : i()
+          }), e.$on("$destroy", i)
+        });
+
+        function i() {
+          o.enableDisconnect && d.reconnectScope(r)
+        }
+      },
+      scope: {
+        template: "=mdTabsTemplate",
+        connected: "=?mdConnectedIf",
+        compileScope: "=mdScope"
+      },
+      require: "^?mdTabs"
+    }
+  }
+
+  function ot(n) {
+    return {
+      restrict: "E",
+      link: function(e, t) {
+        t.addClass("_md"), e.$on("$destroy", function() {
+          n.destroy()
+        })
+      }
+    }
+  }
+
+  function rt(e) {
+    n.$inject = ["$mdToast", "$scope", "$log"], t.$inject = ["$animate", "$mdToast", "$mdUtil", "$mdMedia", "$document", "$q"];
+    var u, p = "ok";
+    return e("$mdToast").setDefaults({
+      methods: ["position", "hideDelay", "capsule", "parent", "position", "toastClass"],
+      options: t
+    }).addPreset("simple", {
+      argOption: "textContent",
+      methods: ["textContent", "action", "actionKey", "actionHint", "highlightAction", "highlightClass", "theme", "parent", "dismissHint"],
+      options: ["$mdToast", "$mdTheming", function(e, t) {
+        return {
+          template: '<md-toast md-theme="{{ toast.theme }}" ng-class="{\'md-capsule\': toast.capsule}">  <div class="md-toast-content" aria-live="polite" aria-relevant="all">    <span class="md-toast-text">      {{ toast.content }}    </span>    <span class="md-visually-hidden">{{ toast.dismissHint }}</span>    <span class="md-visually-hidden" ng-if="toast.action && toast.actionKey">      {{ toast.actionHint }}    </span>    <md-button class="md-action" ng-if="toast.action" ng-click="toast.resolve()"                ng-class="highlightClasses">      {{ toast.action }}    </md-button>  </div></md-toast>',
+          controller: n,
+          theme: t.defaultTheme(),
+          controllerAs: "toast",
+          bindToController: !0
+        }
+      }]
+    }).addMethod("updateTextContent", function(e) {
+      u = e
+    });
+
+    function n(t, n, o) {
+      this.$onInit = function() {
+        var e = this;
+        e.highlightAction && (n.highlightClasses = ["md-highlight", e.highlightClass]), e.action && !e.actionKey && o.warn("Toasts with actions should define an actionKey for accessibility.", "Details: https://material.angularjs.org/latest/api/service/$mdToast#mdtoast-simple"), e.actionKey && !e.actionHint && (e.actionHint = 'Press Control-"' + e.actionKey + '" to '), e.dismissHint || (e.dismissHint = "Press Escape to dismiss."), n.$watch(function() {
+          return u
+        }, function() {
+          e.content = u
+        }), this.resolve = function() {
+          t.hide(p)
+        }
+      }
+    }
+
+    function t(a, d, s, l, c, o) {
+      var m = "$md.swipeleft $md.swiperight $md.swipeup $md.swipedown";
+      return {
+        onShow: function(e, o, r) {
+          u = r.textContent;
+          var i = !l("gt-sm");
+          o = s.extractElementByName(o, "md-toast", !0), r.element = o, r.onSwipe = function(e) {
+            var t = e.type.replace("$md.", ""),
+              n = t.replace("swipe", "");
+            "down" === n && -1 !== r.position.indexOf("top") && !i || "up" === n && (-1 !== r.position.indexOf("bottom") || i) || ("left" === n || "right" === n) && i || (o.addClass("md-" + t), s.nextTick(d.cancel))
+          }, r.openClass = function(e) {
+            return l("gt-xs") ? "md-toast-open-" + (-1 < e.indexOf("top") ? "top" : "bottom") : "md-toast-open-bottom"
+          }(r.position), o.addClass(r.toastClass), r.parent.addClass(r.openClass), s.hasComputedStyle(r.parent, "position", "static") && r.parent.css("position", "relative");
+          (function(t) {
+            c.on("keydown", function(e) {
+              "Escape" === e.key && d.hide(!1), t && e.key === t && e.ctrlKey && d.hide(p)
+            })
+          })(e.toast && e.toast.actionKey ? e.toast.actionKey : ge), o.on(m, r.onSwipe);
+          var n = !1,
+            t = r.position.split(" ").map(function(e) {
+              if (e) {
+                var t = "md-" + e;
+                return "md-top" != t && "md-bottom" != t || (n = !0), t
+              }
+              return "md-bottom"
+            });
+          n || t.push("md-bottom");
+          o.addClass(i ? "md-bottom" : t.join(" ")), r.parent && r.parent.addClass("md-toast-animating");
+          return a.enter(o, r.parent).then(function() {
+            r.parent && r.parent.removeClass("md-toast-animating")
+          })
+        },
+        onRemove: function(e, t, n) {
+          e.toast && e.toast.actionKey && c.off("keydown");
+          t.off(m, n.onSwipe), n.parent && n.parent.addClass("md-toast-animating");
+          n.openClass && n.parent.removeClass(n.openClass);
+          return (!0 === n.$destroy ? o.when(t.remove()) : a.leave(t)).then(function() {
+            n.parent && n.parent.removeClass("md-toast-animating"), s.hasComputedStyle(n.parent, "position", "static") && n.parent.css("position", "")
+          })
+        },
+        toastClass: "",
+        position: "bottom left",
+        themable: !0,
+        hideDelay: 3e3,
+        autoWrap: !0,
+        transformTemplate: function(e, t) {
+          if (t.autoWrap && e && !/md-toast-content/g.test(e)) {
+            var n = document.createElement("md-template");
+            n.innerHTML = e;
+            for (var o = 0; o < n.children.length; o++)
+              if ("MD-TOAST" === n.children[o].nodeName) {
+                var r = be.element('<div class="md-toast-content">');
+                r.append(be.element(n.children[o].childNodes)), n.children[o].appendChild(r[0])
+              } return n.innerHTML
+          }
+          return e || ""
+        }
+      }
+    }
+  }
+
+  function it(f, b, g, e, E, v) {
+    var $ = be.bind(null, g.supplant, "translate3d(0,{0}px,0)");
+    return {
+      template: "",
+      restrict: "E",
+      link: function(u, p, h) {
+        p.addClass("_md"), e(p), g.nextTick(function() {
+          p.addClass("_md-toolbar-transitions")
+        }, !1), be.isDefined(h.mdScrollShrink) && function() {
+          var n, o, r = be.noop,
+            i = 0,
+            a = 0,
+            d = h.mdShrinkSpeedFactor || .5,
+            s = f.throttle(t),
+            l = g.debounce(e, 5e3);
+          u.$on("$mdContentLoaded", c), h.$observe("mdScrollShrink", function(e) {
+            var t = g.getSiblings(p, "md-content");
+            !o && t.length && c(null, t[0]);
+            !1 === (e = u.$eval(e)) ? r() : r = m()
+          }), h.ngShow && u.$watch(h.ngShow, e);
+          h.ngHide && u.$watch(h.ngHide, e);
+
+          function c(e, t) {
+            t && p.parent()[0] === t.parent()[0] && (o && o.off("scroll", s), o = t, r = m())
+          }
+
+          function t(e) {
+            var t = e ? e.target.scrollTop : a;
+            l(), i = Math.min(n / d, Math.max(0, i + t - a)), p.css(b.CSS.TRANSFORM, $([-i * d])), o.css(b.CSS.TRANSFORM, $([(n - i) * d])), a = t, g.nextTick(function() {
+              var e = p.hasClass("md-whiteframe-z1");
+              e && !i ? E.removeClass(p, "md-whiteframe-z1") : !e && i && E.addClass(p, "md-whiteframe-z1")
+            })
+          }
+
+          function m() {
+            return o ? (o.on("scroll", s), o.attr("scroll-shrink", "true"), v(e), function() {
+              o.off("scroll", s), o.attr("scroll-shrink", "false"), e()
+            }) : be.noop
+          }
+
+          function e() {
+            var e = -(n = p.prop("offsetHeight")) * d + "px";
+            o.css({
+              "margin-top": e,
+              "margin-bottom": e
+            }), t()
+          }
+          u.$on("$destroy", r)
+        }()
+      }
+    }
+  }
+
+  function at(E, v, $, M, y, C, T, A) {
+    var w = "focus touchstart mouseenter",
+      _ = "blur touchcancel mouseleave",
+      k = {
+        top: {
+          x: T.xPosition.CENTER,
+          y: T.yPosition.ABOVE
+        },
+        right: {
+          x: T.xPosition.OFFSET_END,
+          y: T.yPosition.CENTER
+        },
+        bottom: {
+          x: T.xPosition.CENTER,
+          y: T.yPosition.BELOW
+        },
+        left: {
+          x: T.xPosition.OFFSET_START,
+          y: T.yPosition.CENTER
+        }
+      };
+    return {
+      restrict: "E",
+      priority: 210,
+      scope: {
+        mdZIndex: "=?mdZIndex",
+        mdDelay: "=?mdDelay",
+        mdVisible: "=?mdVisible",
+        mdAutohide: "=?mdAutohide",
+        mdDirection: "@?mdDirection"
+      },
+      link: function(a, o, d) {
+        var r, e, i, s, l, c = "md-tooltip-" + C.nextUid(),
+          m = C.getParentWithPointerEvents(o),
+          u = $.throttle(f),
+          p = !1,
+          h = null;
+
+        function t() {
+          a.mdZIndex = a.mdZIndex || 100, a.mdDelay = a.mdDelay || 0, k[a.mdDirection] || (a.mdDirection = "bottom")
+        }
+
+        function n(e) {
+          var t = e || y(o.text().trim())(a.$parent);
+          (m.attr("aria-label") || m.attr("aria-labelledby")) && !m.attr("md-labeled-by-tooltip") || (m.attr("aria-label", t), m.attr("md-labeled-by-tooltip") || m.attr("md-labeled-by-tooltip", c))
+        }
+
+        function f() {
+          t(), s && s.panelEl && s.panelEl.removeClass(r), r = "md-origin-" + a.mdDirection, e = k[a.mdDirection], i = T.newPanelPosition().relativeTo(m).addPanelPosition(e.x, e.y), s && s.panelEl && (s.panelEl.addClass(r), s.updatePosition(i))
+        }
+
+        function b(e) {
+          b.queued && b.value === !!e || !b.queued && a.mdVisible === !!e || (b.value = !!e, b.queued || (e ? (b.queued = !0, l = E(function() {
+            a.mdVisible = b.value, b.queued = !1, l = null, a.visibleWatcher || g(a.mdVisible)
+          }, a.mdDelay)) : C.nextTick(function() {
+            a.mdVisible = !1, a.visibleWatcher || g(!1)
+          })))
+        }
+
+        function g(e) {
+          e ? function() {
+            if (!o[0].textContent.trim()) throw new Error("Text for the tooltip has not been provided. Please include text within the mdTooltip element.");
+            if (!s) {
+              var e = be.element(document.body),
+                t = T.newPanelAnimation().openFrom(m).closeTo(m).withAnimation({
+                  open: "md-show",
+                  close: "md-hide"
+                }),
+                n = {
+                  id: c,
+                  attachTo: e,
+                  contentElement: o,
+                  propagateContainerEvents: !0,
+                  panelClass: "md-tooltip",
+                  animation: t,
+                  position: i,
+                  zIndex: a.mdZIndex,
+                  focusOnOpen: !1,
+                  onDomAdded: function() {
+                    s.panelEl.addClass(r)
+                  }
+                };
+              s = T.create(n)
+            }
+            s.open().then(function() {
+              s.panelEl.attr("role", "tooltip")
+            })
+          }() : s && s.close()
+        }
+        t(), n(), o.detach(), f(),
+          function() {
+            if (m[0] && "MutationObserver" in v) {
+              var e = new MutationObserver(function(e) {
+                ! function(e) {
+                  return e.some(function(e) {
+                    return "disabled" === e.attributeName && m[0].disabled
+                  }), !1
+                }(e) || C.nextTick(function() {
+                  b(!1)
+                })
+              });
+              e.observe(m[0], {
+                attributes: !0
+              })
+            }
+
+            function t() {
+              b(!1)
+            }
+
+            function n() {
+              h = document.activeElement === m[0]
+            }
+
+            function o(e) {
+              "focus" === e.type && h ? h = !1 : a.mdVisible || (m.on(_, r), b(!0), "touchstart" === e.type && m.one("touchend", function() {
+                C.nextTick(function() {
+                  M.one("touchend", r)
+                }, !1)
+              }))
+            }
+
+            function r() {
+              ((a.hasOwnProperty("mdAutohide") ? a.mdAutohide : d.hasOwnProperty("mdAutohide")) || p || M[0].activeElement !== m[0]) && (l && (E.cancel(l), b.queued = !1, l = null), m.off(_, r), m.triggerHandler("blur"), b(!1)), p = !1
+            }
+
+            function i() {
+              p = !0
+            }
+            h = !1, A.register("scroll", t, !0), A.register("blur", n), A.register("resize", u), a.$on("$destroy", function() {
+              A.deregister("scroll", t, !0), A.deregister("blur", n), A.deregister("resize", u), m.off(w, o).off(_, r).off("mousedown", i), r(), e && e.disconnect()
+            }), m.on("mousedown", i), m.on(w, o)
+          }(),
+          function() {
+            if (o[0] && "MutationObserver" in v) {
+              var e = new MutationObserver(function(e) {
+                e.forEach(function(e) {
+                  "md-visible" !== e.attributeName || a.visibleWatcher || (a.visibleWatcher = a.$watch("mdVisible", g))
+                })
+              });
+              e.observe(o[0], {
+                attributes: !0
+              }), d.hasOwnProperty("mdVisible") && (a.visibleWatcher = a.$watch("mdVisible", g))
+            } else a.visibleWatcher = a.$watch("mdVisible", g);
+
+            function t() {
+              a.$destroy()
+            }
+            a.$watch("mdDirection", f), o.one("$destroy", t), m.one("$destroy", t), a.$on("$destroy", function() {
+              b(!1), s && s.destroy(), e && e.disconnect(), o.remove()
+            }), -1 < o.text().indexOf(y.startSymbol()) && a.$watch(function() {
+              return o.text().trim()
+            }, n)
+          }()
+      }
+    }
+  }
+
+  function dt(e) {
+    e.addClass("md-truncate")
+  }
+
+  function st(i) {
+    return {
+      link: function(e, n, o) {
+        var r = "";
+        o.$observe("mdWhiteframe", function(e) {
+          -1 != (e = parseInt(e, 10) || 4) && (24 < e || e < 1) && (i.warn("md-whiteframe attribute value is invalid. It should be a number between 1 and 24", n[0]), e = 4);
+          var t = -1 == e ? "" : "md-whiteframe-" + e + "dp";
+          o.$updateClass(t, r), r = t
+        })
+      }
+    }
+  }
+      return {
+        rgbaToHex: function(e) {
+          return ((e = e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i)) && 4 === e.length ? "#" + ("0" + parseInt(e[1], 10).toString(16)).slice(-2) + ("0" + parseInt(e[2], 10).toString(16)).slice(-2) + ("0" + parseInt(e[3], 10).toString(16)).slice(-2) : "").toUpperCase()
+        },
+        hexToRgba: function(e) {
+          var t = "#" === e[0] ? e.substr(1) : e,
+            n = t.length / 3,
+            o = t.substr(0, n),
+            r = t.substr(n, n),
+            i = t.substr(2 * n);
+          return 1 == n && (o += o, r += r, i += i), "rgba(" + parseInt(o, 16) + "," + parseInt(r, 16) + "," + parseInt(i, 16) + ",0.1)"
+        },
+        rgbToRgba: function(e) {
+          return e.replace(")", ", 0.1)").replace("(", "a(")
+        },
+        rgbaToRgb: function(e) {
+          return e ? e.replace("rgba", "rgb").replace(/,[^),]+\)/, ")") : "rgb(0,0,0)"
+        }
+      }
+    }), be.module("material.core").factory("$mdConstant", function() {
+      var o = document.createElement("div"),
+        r = function(e) {
+          var t, n, o = /^(Moz|webkit|ms)(?=[A-Z])/;
+          for (t in e.style)
+            if (n = o.exec(t)) return n[0]
+        }(o),
+        e = /webkit/i.test(r),
+        i = /([:\-_]+(.))/g;
+
+      function t(e) {
+        var t = function(e) {
+            return e.replace(i, function(e, t, n, o) {
+              return o ? n.toUpperCase() : n
+            })
+          }(r + "-" + e),
+          n = t.charAt(0).toLowerCase() + t.substring(1);
+        return a(o, e) ? e : a(o, t) ? t : a(o, n) ? n : e
+      }
+
+      function a(e, t) {
+        return be.isDefined(e.style[t])
+      }
+      var n = {
+        isInputKey: function(e) {
+          return 31 <= e.keyCode && e.keyCode <= 90
+        },
+        isNumPadKey: function(e) {
+          return 3 === e.location && 97 <= e.keyCode && e.keyCode <= 105
+        },
+        isMetaKey: function(e) {
+          return 91 <= e.keyCode && e.keyCode <= 93
+        },
+        isFnLockKey: function(e) {
+          return 112 <= e.keyCode && e.keyCode <= 145
+        },
+        isNavigationKey: function(e) {
+          var t = n.KEY_CODE;
+          return -1 != [t.SPACE, t.ENTER, t.UP_ARROW, t.DOWN_ARROW].indexOf(e.keyCode)
+        },
+        hasModifierKey: function(e) {
+          return e.ctrlKey || e.metaKey || e.altKey
+        },
+        ELEMENT_MAX_PIXELS: 1533917,
+        BEFORE_NG_ARIA: 210,
+        KEY_CODE: {
+          COMMA: 188,
+          SEMICOLON: 186,
+          ENTER: 13,
+          ESCAPE: 27,
+          SPACE: 32,
+          PAGE_UP: 33,
+          PAGE_DOWN: 34,
+          END: 35,
+          HOME: 36,
+          LEFT_ARROW: 37,
+          UP_ARROW: 38,
+          RIGHT_ARROW: 39,
+          DOWN_ARROW: 40,
+          TAB: 9,
+          BACKSPACE: 8,
+          DELETE: 46
+        },
+        CSS: {
+          TRANSITIONEND: "transitionend" + (e ? " webkitTransitionEnd" : ""),
+          ANIMATIONEND: "animationend" + (e ? " webkitAnimationEnd" : ""),
+          TRANSFORM: t("transform"),
+          TRANSFORM_ORIGIN: t("transformOrigin"),
+          TRANSITION: t("transition"),
+          TRANSITION_DURATION: t("transitionDuration"),
+          ANIMATION_PLAY_STATE: t("animationPlayState"),
+          ANIMATION_DURATION: t("animationDuration"),
+          ANIMATION_NAME: t("animationName"),
+          ANIMATION_TIMING: t("animationTimingFunction"),
+          ANIMATION_DIRECTION: t("animationDirection")
+        },
+        MEDIA: {
+          xs: "(max-width: 599px)",
+          "gt-xs": "(min-width: 600px)",
+          sm: "(min-width: 600px) and (max-width: 959px)",
+          "gt-sm": "(min-width: 960px)",
+          md: "(min-width: 960px) and (max-width: 1279px)",
+          "gt-md": "(min-width: 1280px)",
+          lg: "(min-width: 1280px) and (max-width: 1919px)",
+          "gt-lg": "(min-width: 1920px)",
+          xl: "(min-width: 1920px)",
+          landscape: "(orientation: landscape)",
+          portrait: "(orientation: portrait)",
+          print: "print"
+        },
+        MEDIA_PRIORITY: ["xl", "gt-lg", "lg", "gt-md", "md", "gt-sm", "sm", "gt-xs", "xs", "landscape", "portrait", "print"]
+      };
+      return n
+    }), be.module("material.core").config(["$provide", function(e) {
+      e.decorator("$mdUtil", ["$delegate", function(e) {
+        return e.iterator = i, e
+      }])
+    }]), a.$inject = ["$mdConstant", "$rootScope", "$window"], be.module("material.core").factory("$mdMedia", a), be.module("material.core").config(["$provide", function(e) {
+      e.decorator("$mdUtil", ["$delegate", function(e) {
+        return e.prefixer = d, e
+      }])
+    }]),
+    function() {
+      t.$inject = ["$document", "$timeout", "$compile", "$rootScope", "$$mdAnimate", "$interpolate", "$log", "$rootElement", "$window", "$$rAF"];
+      var g, E, v, $ = 0;
+      if (L.navigator) {
+        var e = L.navigator.userAgent || L.navigator.vendor || L.opera;
+        g = e.match(/ipad|iphone|ipod/i), E = e.match(/android/i), v = e.match(/(firefox|minefield)/i)
+      }
+
+      function t(s, d, n, a, e, t, i, o, l, m) {
+        var r = t.startSymbol(),
+          c = t.endSymbol(),
+          u = "{{" === r && "}}" === c;
+        document.contains || (document.contains = function(e) {
+          return document.body.contains(e)
+        });
+
+        function p(e, t, n) {
+          var o = !1;
+          if (e && e.length) {
+            var r = l.getComputedStyle(e[0]);
+            o = be.isDefined(r[t]) && (!n || r[t] == n)
+          }
+          return o
+        }
+
+        function h(e) {
+          return e ? function(e) {
+            return -1 < String(e).indexOf("px")
+          }(e) || function(e) {
+            return -1 < String(e).indexOf("%")
+          }(e) ? e : e + "px" : "0"
+        }
+        var f = {
+          dom: {},
+          isIos: g,
+          isAndroid: E,
+          now: L.performance && L.performance.now ? be.bind(L.performance, L.performance.now) : Date.now || function() {
+            return (new Date).getTime()
+          },
+          getModelOption: function(e, t) {
+            if (e.$options) {
+              var n = e.$options;
+              return n.getOption ? n.getOption(t) : n[t]
+            }
+          },
+          isRtl: function(e) {
+            switch (be.isDefined(e) && e.hasOwnProperty("dir") && e.dir) {
+              case "ltr":
+                return !1;
+              case "rtl":
+                return !0
+            }
+            return "rtl" === s[0].dir || "rtl" === s[0].body.dir
+          },
+          bidi: function(e, t, n, o) {
+            var r = !this.isRtl();
+            if (0 == arguments.length) return r ? "ltr" : "rtl";
+            var i = be.element(e);
+            r && be.isDefined(n) ? i.css(t, h(n)) : !r && be.isDefined(o) && i.css(t, h(o))
+          },
+          bidiProperty: function(e, t, n, o) {
+            var r = !this.isRtl(),
+              i = be.element(e);
+            r && be.isDefined(t) ? (i.css(t, h(o)), i.css(n, "")) : !r && be.isDefined(n) && (i.css(n, h(o)), i.css(t, ""))
+          },
+          clientRect: function(e, t, n) {
+            var o = b(e);
+            t = b(t || o.offsetParent || document.body);
+            var r = o.getBoundingClientRect(),
+              i = n ? t.getBoundingClientRect() : {
+                left: 0,
+                top: 0,
+                width: 0,
+                height: 0
+              };
+            return {
+              left: r.left - i.left,
+              top: r.top - i.top,
+              width: r.width,
+              height: r.height
+            }
+          },
+          offsetRect: function(e, t) {
+            return f.clientRect(e, t, !0)
+          },
+          nodesToArray: function(e) {
+            var t, n = [];
+            for (e = e || [], t = 0; t < e.length; ++t) n.push(e.item(t));
+            return n
+          },
+          getViewportTop: function() {
+            return f.disableScrollAround._count && f.disableScrollAround._viewPortTop ? f.disableScrollAround._viewPortTop : l.scrollY || l.pageYOffset || 0
+          },
+          findFocusTarget: function(e, t) {
+            var n = this.prefixer("md-autofocus", !0);
+            return o(e, t || n) || o(e, n);
+
+            function o(e, t) {
+              var n, o = e[0].querySelectorAll(t);
+              return o && o.length && o.length && be.forEach(o, function(e) {
+                (e = be.element(e)).hasClass("md-autofocus") && (n = e)
+              }), n
+            }
+          },
+          disableScrollAround: function(e, t, n) {
+            if (n = n || {}, f.disableScrollAround._count = Math.max(0, f.disableScrollAround._count || 0), f.disableScrollAround._count++, f.disableScrollAround._restoreScroll) return f.disableScrollAround._restoreScroll;
+            var d = s[0].body,
+              o = function() {
+                var e = s[0].documentElement,
+                  t = e.style.cssText || "",
+                  n = d.style.cssText || "",
+                  o = f.getViewportTop();
+                f.disableScrollAround._viewPortTop = o;
+                var r = d.clientWidth,
+                  i = d.scrollHeight > d.clientHeight + 1,
+                  a = 0 < e.scrollTop ? e : d;
+                i && be.element(d).css({
+                  position: "fixed",
+                  width: "100%",
+                  top: -o + "px"
+                });
+                d.clientWidth < r && (d.style.overflow = "hidden");
+                return function() {
+                  d.style.cssText = n, e.style.cssText = t, a.scrollTop = o
+                }
+              }(),
+              r = function(e, t) {
+                var n, o = be.element(e || d);
+                t.disableScrollMask ? n = o : (n = be.element('<div class="md-scroll-mask">  <div class="md-scroll-mask-bar"></div></div>'), o.append(n));
+
+                function r(e) {
+                  e.preventDefault()
+                }
+                return n.on("wheel touchmove", r),
+                  function() {
+                    n.off("wheel touchmove", r), !t.disableScrollMask && n[0].parentNode && n[0].parentNode.removeChild(n[0])
+                  }
+              }(t, n);
+            return f.disableScrollAround._restoreScroll = function() {
+              --f.disableScrollAround._count <= 0 && (delete f.disableScrollAround._viewPortTop, o(), r(), delete f.disableScrollAround._restoreScroll)
+            }
+          },
+          enableScrolling: function() {
+            var e = this.disableScrollAround._restoreScroll;
+            e && e()
+          },
+          floatingScrollbars: function() {
+            if (this.floatingScrollbars.cached === ge) {
+              var e = be.element("<div><div></div></div>").css({
+                width: "100%",
+                "z-index": -1,
+                position: "absolute",
+                height: "35px",
+                "overflow-y": "scroll"
+              });
+              e.children().css("height", "60px"), s[0].body.appendChild(e[0]), this.floatingScrollbars.cached = e[0].offsetWidth === e[0].childNodes[0].offsetWidth, e.remove()
+            }
+            return this.floatingScrollbars.cached
+          },
+          forceFocus: function(e) {
+            var n = e[0] || e;
+            document.addEventListener("click", function e(t) {
+              t.target === n && t.$focus && (n.focus(), t.stopImmediatePropagation(), t.preventDefault(), n.removeEventListener("click", e))
+            }, !0);
+            var t = document.createEvent("MouseEvents");
+            t.initMouseEvent("click", !1, !0, L, {}, 0, 0, 0, 0, !1, !1, !1, !1, 0, null), t.$material = !0, t.$focus = !0, n.dispatchEvent(t)
+          },
+          createBackdrop: function(e, t) {
+            return n(f.supplant('<md-backdrop class="{0}">', [t]))(e)
+          },
+          supplant: function(e, i, t) {
+            return t = t || /\{([^{}]*)\}/g, e.replace(t, function(t, e) {
+              var n = e.split("."),
+                o = i;
+              try {
+                for (var r in n) n.hasOwnProperty(r) && (o = o[n[r]])
+              } catch (e) {
+                o = t
+              }
+              return "string" == typeof o || "number" == typeof o ? o : t
+            })
+          },
+          fakeNgModel: function() {
+            return {
+              $fake: !0,
+              $setTouched: be.noop,
+              $setViewValue: function(e) {
+                this.$viewValue = e, this.$render(e), this.$viewChangeListeners.forEach(function(e) {
+                  e()
+                })
+              },
+              $isEmpty: function(e) {
+                return 0 === ("" + e).length
+              },
+              $parsers: [],
+              $formatters: [],
+              $viewChangeListeners: [],
+              $render: be.noop
+            }
+          },
+          debounce: function(n, o, r, i) {
+            var a;
+            return function() {
+              var e = r,
+                t = Array.prototype.slice.call(arguments);
+              d.cancel(a), a = d(function() {
+                a = ge, n.apply(e, t)
+              }, o || 10, i)
+            }
+          },
+          throttle: function(n, o) {
+            var r;
+            return function() {
+              var e = arguments,
+                t = f.now();
+              (!r || o < t - r) && (n.apply(this, e), r = t)
+            }
+          },
+          time: function(e) {
+            var t = f.now();
+            return e(), f.now() - t
+          },
+          valueOnUse: function(e, t, n) {
+            var o = null,
+              r = Array.prototype.slice.call(arguments),
+              i = 3 < r.length ? r.slice(3) : [];
+            Object.defineProperty(e, t, {
+              get: function() {
+                return null === o && (o = n.apply(e, i)), o
+              }
+            })
+          },
+          nextUid: function() {
+            return "" + $++
+          },
+          disconnectScope: function(e) {
+            if (e && e.$root !== e && !e.$$destroyed) {
+              var t = e.$parent;
+              e.$$disconnected = !0, t.$$childHead === e && (t.$$childHead = e.$$nextSibling), t.$$childTail === e && (t.$$childTail = e.$$prevSibling), e.$$prevSibling && (e.$$prevSibling.$$nextSibling = e.$$nextSibling), e.$$nextSibling && (e.$$nextSibling.$$prevSibling = e.$$prevSibling), e.$$nextSibling = e.$$prevSibling = null
+            }
+          },
+          reconnectScope: function(e) {
+            if (e && e.$root !== e && e.$$disconnected) {
+              var t = e,
+                n = t.$parent;
+              t.$$disconnected = !1, t.$$prevSibling = n.$$childTail, n.$$childHead ? (n.$$childTail.$$nextSibling = t, n.$$childTail = t) : n.$$childHead = n.$$childTail = t
+            }
+          },
+          getSiblings: function(t, e) {
+            var n = e.toUpperCase();
+            return t instanceof be.element && (t = t[0]), Array.prototype.filter.call(t.parentNode.children, function(e) {
+              return t !== e && e.tagName.toUpperCase() === n
+            }).map(function(e) {
+              return be.element(e)
+            })
+          },
+          getClosest: function(e, t, n) {
+            if (be.isString(t)) {
+              var o = t.toUpperCase();
+              t = function(e) {
+                return e.nodeName.toUpperCase() === o
+              }
+            }
+            if (e instanceof be.element && (e = e[0]), n && (e = e.parentNode), !e) return null;
+            do {
+              if (t(e)) return e
+            } while (e = e.parentNode);
+            return null
+          },
+          elementContains: function(t, n) {
+            return (L.Node && L.Node.prototype && Node.prototype.contains ? be.bind(t, t.contains) : be.bind(t, function(e) {
+              return t === n || !!(16 & this.compareDocumentPosition(e))
+            }))(n)
+          },
+          extractElementByName: function(e, o, t, n) {
+            var r = d(e);
+            return !r && n && i.warn(f.supplant("Unable to find node '{0}' in element '{1}'.", [o, e[0].outerHTML])), be.element(r || e);
+
+            function d(e) {
+              return function(e) {
+                if (e)
+                  for (var t = 0, n = e.length; t < n; t++)
+                    if (e[t].nodeName.toLowerCase() === o) return e[t];
+                return null
+              }(e) || (t ? function(e) {
+                var t;
+                if (e)
+                  for (var n = 0, o = e.length; n < o; n++) {
+                    var r = e[n];
+                    if (!t)
+                      for (var i = 0, a = r.childNodes.length; i < a; i++) t = t || d([r.childNodes[i]])
+                  }
+                return t
+              }(e) : null)
+            }
+          },
+          initOptionalProperties: function(o, r, i) {
+            i = i || {}, be.forEach(o.$$isolateBindings, function(e, t) {
+              if (e.optional && be.isUndefined(o[t])) {
+                var n = be.isDefined(r[e.attrName]);
+                o[t] = be.isDefined(i[t]) ? i[t] : n
+              }
+            })
+          },
+          nextTick: function(e, t, n) {
+            var o = f.nextTick,
+              r = o.timeout,
+              i = o.queue || [];
+            return i.push({
+              scope: n,
+              callback: e
+            }), null == t && (t = !0), o.digest = o.digest || t, o.queue = i, r || (o.timeout = d(function() {
+              var e = o.queue,
+                t = o.digest;
+              o.queue = [], o.timeout = null, o.digest = !1, e.forEach(function(e) {
+                e.scope && e.scope.$$destroyed || e.callback()
+              }), t && a.$digest()
+            }, 0, !1))
+          },
+          processTemplate: function(e) {
+            return u ? e : e && be.isString(e) ? e.replace(/\{\{/g, r).replace(/}}/g, c) : e
+          },
+          getParentWithPointerEvents: function(e) {
+            for (var t = e.parent(); p(t, "pointer-events", "none");) t = t.parent();
+            return t
+          },
+          getNearestContentElement: function(e) {
+            for (var t = e.parent()[0]; t && t !== o[0] && t !== document.body && "MD-CONTENT" !== t.nodeName.toUpperCase();) t = t.parentNode;
+            return t
+          },
+          checkStickySupport: function() {
+            var e, t = be.element("<div>");
+            s[0].body.appendChild(t[0]);
+            for (var n = ["sticky", "-webkit-sticky"], o = 0; o < n.length; ++o)
+              if (t.css({
+                  position: n[o],
+                  top: 0,
+                  "z-index": 2
+                }), t.css("position") == n[o]) {
+                e = n[o];
+                break
+              } return t.remove(), e
+          },
+          parseAttributeBoolean: function(e, t) {
+            return "" === e || !!e && (!1 === t || "false" !== e && "0" !== e)
+          },
+          hasComputedStyle: p,
+          isParentFormSubmitted: function(e) {
+            var t = f.getClosest(e, "form"),
+              n = t ? be.element(t).controller("form") : null;
+            return !!n && n.$submitted
+          },
+          animateScrollTo: function(r, i, a) {
+            var d = r.scrollTop,
+              s = i - d,
+              l = d < i,
+              c = f.now();
+            m(function e() {
+              var t = (n = a || 1e3, o = f.now() - c, function(e, t, n, o) {
+                if (o < e) return t + n;
+                var r = (e /= o) * e;
+                return t + n * (r * e * -2 + 3 * r)
+              }(o, d, s, n));
+              var n, o;
+              r.scrollTop = t;
+              (l ? t < i : i < t) && m(e)
+            })
+          },
+          uniq: function(e) {
+            if (e) return e.filter(function(e, t, n) {
+              return n.indexOf(e) === t
+            })
+          },
+          getInnerHTML: function(e) {
+            var t = new XMLSerializer;
+            return Array.prototype.map.call(e.childNodes, function(e) {
+              return t.serializeToString(e)
+            }).join("")
+          },
+          getOuterHTML: function(e) {
+            return (new XMLSerializer).serializeToString(e)
+          },
+          msie: L.document.documentMode,
+          getTouchAction: function() {
+            for (var e = document.createElement("div"), t = ["", "webkit", "Moz", "MS", "ms", "o"], n = 0; n < t.length; n++) {
+              var o = t[n],
+                r = o ? o + "TouchAction" : "touchAction";
+              if (be.isDefined(e.style[r])) return r
+            }
+          },
+          getEventPath: function(e) {
+            for (var t = [], n = e.target; n;) t.push(n), n = n.parentElement;
+            return -1 === t.indexOf(L) && -1 === t.indexOf(document) && t.push(document), -1 === t.indexOf(L) && t.push(L), t
+          },
+          sanitize: function(e) {
+            return e ? e.replace(/[\\^$*+?.()|{}[]/g, "\\$&") : e
+          },
+          isDisabled: function(e) {
+            return e.hasAttribute("disabled")
+          },
+          isVisible: function(e) {
+            return f.hasGeometry(e) && "visible" === getComputedStyle(e).visibility
+          },
+          isTabbable: function(e) {
+            var t = f.getFrameElement(f.getWindow(e));
+            if (t) {
+              if (-1 === f.getTabIndexValue(t)) return !1;
+              if (!f.isVisible(t)) return !1
+            }
+            var n = e.nodeName.toLowerCase(),
+              o = f.getTabIndexValue(e);
+            return e.hasAttribute("contenteditable") ? -1 !== o : "iframe" !== n && "object" !== n && (!(g && !f.isPotentiallyTabbableIOS(e)) && ("audio" === n ? !!e.hasAttribute("controls") && -1 !== o : "video" === n ? -1 !== o && (null !== o || (v || e.hasAttribute("controls"))) : 0 <= e.tabIndex))
+          },
+          isFocusable: function(e) {
+            return f.isPotentiallyFocusable(e) && !f.isDisabled(e) && f.isVisible(e)
+          },
+          isPotentiallyFocusable: function(e) {
+            return !f.isHiddenInput(e) && (f.isNativeFormElement(e) || f.isAnchorWithHref(e) || e.hasAttribute("contenteditable") || f.hasValidTabIndex(e))
+          },
+          isPotentiallyTabbableIOS: function(e) {
+            var t = e.nodeName.toLowerCase(),
+              n = "input" === t && e.type;
+            return "text" === n || "password" === n || "select" === t || "textarea" === t
+          },
+          getTabIndexValue: function(e) {
+            if (!f.hasValidTabIndex(e)) return null;
+            var t = parseInt(e.getAttribute("tabindex") || "", 10);
+            return isNaN(t) ? -1 : t
+          },
+          hasValidTabIndex: function(e) {
+            if (!e.hasAttribute("tabindex") || e.tabIndex === ge) return !1;
+            var t = e.getAttribute("tabindex");
+            return "-32768" != t && !(!t || isNaN(parseInt(t, 10)))
+          },
+          hasGeometry: function(e) {
+            return !!(e.offsetWidth || e.offsetHeight || "function" == typeof e.getClientRects && e.getClientRects().length)
+          },
+          getFrameElement: function(e) {
+            try {
+              return e.frameElement
+            } catch (e) {
+              return null
+            }
+          },
+          getWindow: function(e) {
+            return e.ownerDocument && e.ownerDocument.defaultView || L
+          },
+          isNativeFormElement: function(e) {
+            var t = e.nodeName.toLowerCase();
+            return "input" === t || "select" === t || "button" === t || "textarea" === t
+          },
+          isHiddenInput: function(e) {
+            return f.isInputElement(e) && "hidden" == e.type
+          },
+          isAnchorWithHref: function(e) {
+            return f.isAnchorElement(e) && e.hasAttribute("href")
+          },
+          isInputElement: function(e) {
+            return "input" == e.nodeName.toLowerCase()
+          },
+          isAnchorElement: function(e) {
+            return "a" == e.nodeName.toLowerCase()
+          },
+          getFirstTabbableElement: function(e) {
+            if (f.isFocusable(e) && f.isTabbable(e)) return e;
+            for (var t = e.children || e.childNodes, n = 0; n < t.length; n++) {
+              var o = t[n].nodeType === s[0].ELEMENT_NODE ? f.getFirstTabbableElement(t[n]) : null;
+              if (o) return o
+            }
+            return null
+          },
+          getLastTabbableElement: function(e) {
+            if (f.isFocusable(e) && f.isTabbable(e)) return e;
+            for (var t = e.children || e.childNodes, n = t.length - 1; 0 <= n; n--) {
+              var o = t[n].nodeType === s[0].ELEMENT_NODE ? f.getLastTabbableElement(t[n]) : null;
+              if (o) return o
+            }
+            return null
+          }
+        };
+        return f.dom.animator = e(f), f;
+
+        function b(e) {
+          return e[0] || e
+        }
+      }
+      be.module("material.core").factory("$mdUtil", t), be.element.prototype.focus = be.element.prototype.focus || function() {
+        return this.length && this[0].focus(), this
+      }, be.element.prototype.blur = be.element.prototype.blur || function() {
+        return this.length && this[0].blur(), this
+      }
+    }(), be.module("material.core").factory("$$mdAnimate", ["$q", "$timeout", "$mdConstant", "$animateCss", function(t, n, o, r) {
+      return function(e) {
+        return function(n, e, s, l, i) {
+          var c;
+          return c = {
+            translate3d: function(t, n, e, o) {
+              return i(t, {
+                from: n,
+                to: e,
+                addClass: o.transitionInClass,
+                removeClass: o.transitionOutClass,
+                duration: o.duration
+              }).start().then(function() {
+                return r
+              });
+
+              function r(e) {
+                return i(t, {
+                  to: e || n,
+                  addClass: o.transitionOutClass,
+                  removeClass: o.transitionInClass,
+                  duration: o.duration
+                }).start()
+              }
+            },
+            waitTransitionEnd: function(i, a) {
+              var d = 3e3;
+              return e(function(t, e) {
+                var n;
+                "0s" !== (n = (n = (a = a || {}).cachedTransitionStyles) || L.getComputedStyle(i[0])).transitionDuration && (n.transition || n.transitionProperty) || (d = 0);
+                var o = s(r, a.timeout || d);
+
+                function r(e) {
+                  e && e.target !== i[0] || (e && s.cancel(o), i.off(l.CSS.TRANSITIONEND, r), t())
+                }
+                i.on(l.CSS.TRANSITIONEND, r)
+              })
+            },
+            calculateTransformValues: function(e, t) {
+              var n, o, r = t.element,
+                i = t.bounds;
+              if (r || i) {
+                var a = r ? c.clientRect(r) || (n = e ? e.parent() : null, (o = n ? n.parent() : null) ? c.clientRect(o) : null) : c.copyRect(i),
+                  d = c.copyRect(e[0].getBoundingClientRect()),
+                  s = c.centerPointFor(d),
+                  l = c.centerPointFor(a);
+                return {
+                  centerX: l.x - s.x,
+                  centerY: l.y - s.y,
+                  scaleX: Math.round(100 * Math.min(.5, a.width / d.width)) / 100,
+                  scaleY: Math.round(100 * Math.min(.5, a.height / d.height)) / 100
+                }
+              }
+              return {
+                centerX: 0,
+                centerY: 0,
+                scaleX: .5,
+                scaleY: .5
+              }
+            },
+            calculateZoomToOrigin: function(e, t) {
+              return be.bind(null, n.supplant, "translate3d( {centerX}px, {centerY}px, 0 ) scale( {scaleX}, {scaleY} )")(c.calculateTransformValues(e, t))
+            },
+            calculateSlideToOrigin: function(e, t) {
+              return be.bind(null, n.supplant, "translate3d( {centerX}px, {centerY}px, 0 )")(c.calculateTransformValues(e, t))
+            },
+            toCss: function(e) {
+              var o = {};
+              return be.forEach(e, function(e, t) {
+                if (!be.isUndefined(e))
+                  if (0 <= "left top right bottom width height x y min-width min-height max-width max-height".indexOf(t)) o[t] = e + "px";
+                  else switch (t) {
+                    case "transition":
+                      n(0, l.CSS.TRANSITION, e);
+                      break;
+                    case "transform":
+                      n(0, l.CSS.TRANSFORM, e);
+                      break;
+                    case "transformOrigin":
+                      n(0, l.CSS.TRANSFORM_ORIGIN, e);
+                      break;
+                    case "font-size":
+                      o["font-size"] = e
+                  }
+              }), o;
+
+              function n(e, t, n) {
+                be.forEach(t.split(" "), function(e) {
+                  o[e] = n
+                })
+              }
+            },
+            toTransformCss: function(t, e, n) {
+              var o = {};
+              return be.forEach(l.CSS.TRANSFORM.split(" "), function(e) {
+                o[e] = t
+              }), e && (n = n || "all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) !important", o.transition = n), o
+            },
+            copyRect: function(t, n) {
+              return t ? (n = n || {}, be.forEach("left top right bottom width height".split(" "), function(e) {
+                n[e] = Math.round(t[e])
+              }), n.width = n.width || n.right - n.left, n.height = n.height || n.bottom - n.top, n) : null
+            },
+            clientRect: function(e) {
+              var t, n = be.element(e)[0].getBoundingClientRect();
+              return (t = n) && 0 < t.width && 0 < t.height ? c.copyRect(n) : null
+            },
+            centerPointFor: function(e) {
+              return e ? {
+                x: Math.round(e.left + e.width / 2),
+                y: Math.round(e.top + e.height / 2)
+              } : {
+                x: 0,
+                y: 0
+              }
+            }
+          }
+        }(e, t, n, o, r)
+      }
+    }]), 4 <= be.version.minor ? be.module("material.core.animate", []) : (w = be.forEach, _ = be.isDefined(document.documentElement.style.WebkitAppearance), k = _ ? "-webkit-" : "", x = (_ ? "webkitTransitionEnd " : "") + "transitionend", N = (_ ? "webkitAnimationEnd " : "") + "animationend", s = ["$q", "$$rAFMutex", function(t, n) {
+      function e(e) {
+        this.setHost(e), this._doneCallbacks = [], this._runInAnimationFrame = n(), this._state = 0
+      }
+      return e.prototype = {
+        setHost: function(e) {
+          this.host = e || {}
+        },
+        done: function(e) {
+          2 === this._state ? e() : this._doneCallbacks.push(e)
+        },
+        progress: be.noop,
+        getPromise: function() {
+          if (!this.promise) {
+            var e = this;
+            this.promise = t(function(t, n) {
+              e.done(function(e) {
+                !1 === e ? n() : t()
+              })
+            })
+          }
+          return this.promise
+        },
+        then: function(e, t) {
+          return this.getPromise().then(e, t)
+        },
+        catch: function(e) {
+          return this.getPromise().catch(e)
+        },
+        finally: function(e) {
+          return this.getPromise().finally(e)
+        },
+        pause: function() {
+          this.host.pause && this.host.pause()
+        },
+        resume: function() {
+          this.host.resume && this.host.resume()
+        },
+        end: function() {
+          this.host.end && this.host.end(), this._resolve(!0)
+        },
+        cancel: function() {
+          this.host.cancel && this.host.cancel(), this._resolve(!1)
+        },
+        complete: function(e) {
+          var t = this;
+          0 === t._state && (t._state = 1, t._runInAnimationFrame(function() {
+            t._resolve(e)
+          }))
+        },
+        _resolve: function(t) {
+          2 !== this._state && (w(this._doneCallbacks, function(e) {
+            e(t)
+          }), this._doneCallbacks.length = 0, this._state = 2)
+        }
+      }, e.all = function(t, n) {
+        var o = 0,
+          r = !0;
+
+        function i(e) {
+          r = r && e, ++o === t.length && n(r)
+        }
+        w(t, function(e) {
+          e.done(i)
+        })
+      }, e
+    }], be.module("material.core.animate", []).factory("$$forceReflow", ["$document", function(e) {
+      return function() {
+        return e[0].body.clientWidth + 1
+      }
+    }]).factory("$$AnimateRunner", s).factory("$$rAFMutex", ["$$rAF", function(n) {
+      return function() {
+        var t = !1;
+        return n(function() {
+            t = !0
+          }),
+          function(e) {
+            t ? e() : n(e)
+          }
+      }
+    }]).factory("$animateCss", ["$window", "$$rAF", "$$AnimateRunner", "$$forceReflow", "$$jqLite", "$timeout", "$animate", function(h, i, a, f, n, b, d) {
+      function g(e, t) {
+        t.addClass && (n.addClass(e, t.addClass), t.addClass = null), t.removeClass && (n.removeClass(e, t.removeClass), t.removeClass = null)
+      }
+
+      function E(e) {
+        var t = 0,
+          n = (e || "").split(/\s*,\s*/);
+        return w(n, function(e) {
+          "s" == e.charAt(e.length - 1) && (e = e.substring(0, e.length - 1)), e = parseFloat(e) || 0, t = t ? Math.max(e, t) : e
+        }), t
+      }
+      var v, $ = [];
+
+      function M(e, t) {
+        t.from && (e.css(t.from), t.from = null)
+      }
+
+      function y(e, t) {
+        t.to && (e.css(t.to), t.to = null)
+      }
+
+      function C(e) {
+        for (var t = 0; t < e.length; t++)
+          if (1 === e[t].nodeType) return e[t]
+      }
+
+      function T(e, t) {
+        var n = C(e),
+          o = A(k + "transition-delay");
+        n.style[o] = t ? "-9999s" : ""
+      }
+      return function(o, s) {
+        var l = [],
+          c = C(o),
+          e = c && d.enabled(),
+          t = !1,
+          n = !1;
+        e && (s.transitionStyle && l.push([k + "transition", s.transitionStyle]), s.keyframeStyle && l.push([k + "animation", s.keyframeStyle]), s.delay && l.push([k + "transition-delay", s.delay + "s"]), s.duration && l.push([k + "transition-duration", s.duration + "s"]), t = s.keyframeStyle || s.to && (0 < s.duration || s.transitionStyle), n = !!s.addClass || !!s.removeClass, T(o, !0));
+        var m = e && (t || n);
+        M(o, s);
+        var u, p, r = !1;
+        return {
+          close: h.close,
+          start: function() {
+            var e = new a;
+            return function(e) {
+              v && v(), $.push(e), v = i(function() {
+                v = null;
+                for (var e = f(), t = 0; t < $.length; t++) $[t](e);
+                $.length = 0
+              })
+            }(function() {
+              if (T(o, !1), !m) return d();
+              w(l, function(e) {
+                var t = e[0],
+                  n = e[1];
+                c.style[A(t)] = n
+              }), g(o, s);
+              var e = function(e) {
+                var t = C(e),
+                  n = h.getComputedStyle(t),
+                  o = E(n[l("transitionDuration")]),
+                  r = E(n[l("animationDuration")]),
+                  i = E(n[l("transitionDelay")]),
+                  a = E(n[l("animationDelay")]);
+                r *= parseInt(n[l("animationIterationCount")], 10) || 1;
+                var d = Math.max(r, o),
+                  s = Math.max(a, i);
+                return {
+                  duration: d,
+                  delay: s,
+                  animationDuration: r,
+                  transitionDuration: o,
+                  animationDelay: a,
+                  transitionDelay: i
+                };
+
+                function l(e) {
+                  return _ ? "Webkit" + e.charAt(0).toUpperCase() + e.substr(1) : e
+                }
+              }(o);
+              if (0 === e.duration) return d();
+              var t = [];
+              s.easing && (e.transitionDuration && t.push([k + "transition-timing-function", s.easing]), e.animationDuration && t.push([k + "animation-timing-function", s.easing])), s.delay && e.animationDelay && t.push([k + "animation-delay", s.delay + "s"]), s.duration && e.animationDuration && t.push([k + "animation-duration", s.duration + "s"]), w(t, function(e) {
+                var t = e[0],
+                  n = e[1];
+                c.style[A(t)] = n, l.push(e)
+              });
+              var r = 1e3 * e.delay,
+                i = e.duration,
+                n = 1e3 * i,
+                a = Date.now();
+              u = [], e.transitionDuration && u.push(x), e.animationDuration && u.push(N), u = u.join(" "), p = function(e) {
+                e.stopPropagation();
+                var t = e.originalEvent || e,
+                  n = t.timeStamp || Date.now(),
+                  o = parseFloat(t.elapsedTime.toFixed(3));
+                Math.max(n - a, 0) >= r && i <= o && d()
+              }, o.on(u, p), y(o, s), b(d, r + 1.5 * n, !1)
+            }), e;
+
+            function d() {
+              if (!r) return r = !0, u && p && o.off(u, p), g(o, s),
+                function(e, t) {
+                  M(e, t), y(e, t)
+                }(o, s), w(l, function(e) {
+                  c.style[A(e[0])] = ""
+                }), e.complete(!0), e
+            }
+          }
+        }
+      }
+    }])), S.$inject = ["$$rAF", "$log", "$window", "$interpolate"], be.module("material.core").provider("$mdAria", function() {
+      var r = {
+        showWarnings: !0
+      };
+      return {
+        disableWarnings: function() {
+          r.showWarnings = !1
+        },
+        $get: ["$$rAF", "$log", "$window", "$interpolate", function(e, t, n, o) {
+          return S.apply(r, arguments)
+        }]
+      }
+    }), be.module("material.core").provider("$mdCompiler", D), D.$inject = ["$compileProvider"],
+    function() {
+      r.$inject = ["$$MdGestureHandler", "$$rAF", "$timeout", "$mdUtil"];
+      var i, a, s = {},
+        l = 6,
+        c = !(n.$inject = ["$mdGesture", "$$MdGestureHandler", "$mdUtil"]),
+        d = !1,
+        m = null,
+        u = !1;
+
+      function e() {}
+
+      function r(o, e, n, t) {
+        var r = t.getTouchAction(),
+          i = void 0 !== L.jQuery && be.element === L.jQuery,
+          a = {
+            handler: function(e, t) {
+              var n = new o(e);
+              return be.extend(n, t), s[e] = n, a
+            },
+            register: function(e, t, n) {
+              var o = s[t.replace(/^\$md./, "")];
+              if (o) return o.registerElement(e, n);
+              throw new Error("Failed to register element with handler " + t + ". Available handlers: " + Object.keys(s).join(", "))
+            },
+            isAndroid: t.isAndroid,
+            isIos: t.isIos,
+            isHijackingClicks: (t.isIos || t.isAndroid) && !i && !c
+          };
+
+        function d(n) {
+          return function(e, t) {
+            t.distance < this.state.options.maxDistance && this.dispatchEvent(e, n, t)
+          }
+        }
+        return a.isHijackingClicks && (a.handler("click", {
+          options: {
+            maxDistance: l
+          },
+          onEnd: d("click")
+        }), a.handler("focus", {
+          options: {
+            maxDistance: l
+          },
+          onEnd: function(e, t) {
+            t.distance < this.state.options.maxDistance && E(e.target) && (this.dispatchEvent(e, "focus", t), e.target.focus())
+          }
+        }), a.handler("mouseup", {
+          options: {
+            maxDistance: l
+          },
+          onEnd: d("mouseup")
+        }), a.handler("mousedown", {
+          onStart: function(e) {
+            this.dispatchEvent(e, "mousedown")
+          }
+        })), a.handler("press", {
+          onStart: function(e, t) {
+            this.dispatchEvent(e, "$md.pressdown")
+          },
+          onEnd: function(e, t) {
+            this.dispatchEvent(e, "$md.pressup")
+          }
+        }).handler("hold", {
+          options: {
+            maxDistance: 6,
+            delay: 500
+          },
+          onCancel: function() {
+            n.cancel(this.state.timeout)
+          },
+          onStart: function(e, t) {
+            if (!this.state.registeredParent) return this.cancel();
+            this.state.pos = {
+              x: t.x,
+              y: t.y
+            }, this.state.timeout = n(be.bind(this, function() {
+              this.dispatchEvent(e, "$md.hold"), this.cancel()
+            }), this.state.options.delay, !1)
+          },
+          onMove: function(e, t) {
+            r || "touchmove" !== e.type || e.preventDefault();
+            var n = this.state.pos.x - t.x,
+              o = this.state.pos.y - t.y;
+            Math.sqrt(n * n + o * o) > this.options.maxDistance && this.cancel()
+          },
+          onEnd: function() {
+            this.onCancel()
+          }
+        }).handler("drag", {
+          options: {
+            minDistance: 6,
+            horizontal: !0,
+            cancelMultiplier: 1.5
+          },
+          onSetup: function(e, t) {
+            r && (this.oldTouchAction = e[0].style[r], e[0].style[r] = t.horizontal ? "pan-y" : "pan-x")
+          },
+          onCleanup: function(e) {
+            this.oldTouchAction ? e[0].style[r] = this.oldTouchAction : e[0].style[r] = null
+          },
+          onStart: function(e) {
+            this.state.registeredParent || this.cancel()
+          },
+          onMove: function(e, t) {
+            var n, o;
+          },
+          dispatchDragMove: e.throttle(function(e) {
+            this.state.isRunning && (b(e, this.state.dragPointer), this.dispatchEvent(e, "$md.drag", this.state.dragPointer))
+          }),
+          onEnd: function(e, t) {
+            this.state.dragPointer && (b(e, this.state.dragPointer), this.dispatchEvent(e, "$md.dragend", this.state.dragPointer))
+          }
+        }).handler("swipe", {
+          options: {
+            minVelocity: .65,
+            minDistance: 10
+          },
+          onEnd: function(e, t) {
+            var n;
+            Math.abs(t.velocityX) > this.state.options.minVelocity && Math.abs(t.distanceX) > this.state.options.minDistance ? (n = "left" == t.directionX ? "$md.swipeleft" : "$md.swiperight", this.dispatchEvent(e, n)) : Math.abs(t.velocityY) > this.state.options.minVelocity && Math.abs(t.distanceY) > this.state.options.minDistance && (n = "up" == t.directionY ? "$md.swipeup" : "$md.swipedown", this.dispatchEvent(e, n))
+          }
+        })
+      }
+
+      function t(e) {
+        this.name = e, this.state = {}
+      }
+
+      function n(e, r, n) {
+        if (!d) {
+          !u && e.isHijackingClicks && (document.addEventListener("click", function(e) {
+            var t;
+            t = n.isIos ? be.isDefined(e.webkitForce) && 0 === e.webkitForce : 0 === e.clientX && 0 === e.clientY;
+            t || e.$material || e.isIonicTap || f(e) ? (m = null, "label" === e.target.tagName.toLowerCase() && (m = {
+              x: e.x,
+              y: e.y
+            })) : (e.preventDefault(), e.stopPropagation(), m = null)
+          }, !0), document.addEventListener("mouseup", t, !0), document.addEventListener("mousedown", t, !0), document.addEventListener("focus", t, !0), u = !0);
+          be.element(document).on("mousedown touchstart pointerdown", function(e) {
+            if (i) return;
+            var t = +Date.now();
+            if (a && !h(e, a) && t - a.endTime < 1500) return;
+            i = p(e), o("start", e)
+          }).on("mousemove touchmove pointermove", function(e) {
+            if (!i || !h(e, i)) return;
+            b(e, i), o("move", e)
+          }).on("mouseup mouseleave touchend touchcancel pointerup pointercancel", function(e) {
+            if (!i || !h(e, i)) return;
+            b(e, i), i.endTime = +Date.now(), "pointercancel" !== e.type && o("end", e);
+            a = i, i = null
+          }).on("$$mdGestureReset", function() {
+            a = i = null
+          })
+        }
+
+        function t(e) {
+          !e.clientX && !e.clientY || e.$material || e.isIonicTap || f(e) || "mousedown" === e.type && (E(e.target) || E(document.activeElement)) || (e.preventDefault(), e.stopPropagation())
+        }
+
+        function o(e, t) {
+          var n;
+          for (var o in s)(n = s[o]) instanceof r && ("start" === e && n.cancel(), n[e](t, i))
+        }
+      }
+
+      function p(e) {
+        var t = g(e),
+          n = {
+            startTime: +Date.now(),
+            target: e.target,
+            type: e.type.charAt(0)
+          };
+        return n.startX = n.x = t.pageX, n.startY = n.y = t.pageY, n
+      }
+
+      function h(e, t) {
+        return e && t && e.type.charAt(0) === t.type
+      }
+
+      function f(e) {
+        return m && m.x === e.x && m.y === e.y
+      }
+
+      function b(e, t) {
+        var n = g(e),
+          o = t.x = n.pageX,
+          r = t.y = n.pageY;
+        t.distanceX = o - t.startX, t.distanceY = r - t.startY, t.distance = Math.sqrt(t.distanceX * t.distanceX + t.distanceY * t.distanceY), t.directionX = 0 < t.distanceX ? "right" : t.distanceX < 0 ? "left" : "", t.directionY = 0 < t.distanceY ? "down" : t.distanceY < 0 ? "up" : "", t.duration = +Date.now() - t.startTime, t.velocityX = t.distanceX / t.duration, t.velocityY = t.distanceY / t.duration
+      }
+
+      function g(e) {
+        return (e = e.originalEvent || e).touches && e.touches[0] || e.changedTouches && e.changedTouches[0] || e
+      }
+
+      function E(e) {
+        return !!e && "-1" !== e.getAttribute("tabindex") && !e.hasAttribute("disabled") && (e.hasAttribute("tabindex") || e.hasAttribute("href") || e.isContentEditable || -1 !== ["INPUT", "SELECT", "BUTTON", "TEXTAREA", "VIDEO", "AUDIO"].indexOf(e.nodeName))
+      }
+      be.module("material.core.gestures", []).provider("$mdGesture", e).factory("$$MdGestureHandler", function() {
+        var e = void 0 !== L.jQuery && be.element === L.jQuery;
+        return t.prototype = {
+          options: {},
+          dispatchEvent: e ? function(e, t, n) {
+            n = n || i;
+            var o = new be.element.Event(t);
+            o.$material = !0, o.pointer = n, o.srcEvent = e, be.extend(o, {
+              clientX: n.x,
+              clientY: n.y,
+              screenX: n.x,
+              screenY: n.y,
+              pageX: n.x,
+              pageY: n.y,
+              ctrlKey: e.ctrlKey,
+              altKey: e.altKey,
+              shiftKey: e.shiftKey,
+              metaKey: e.metaKey
+            }), be.element(n.target).trigger(o)
+          } : function(e, t, n) {
+            var o;
+            n = n || i, "click" === t || "mouseup" === t || "mousedown" === t ? "function" == typeof L.MouseEvent ? o = new MouseEvent(t, {
+              bubbles: !0,
+              cancelable: !0,
+              screenX: Number(e.screenX),
+              screenY: Number(e.screenY),
+              clientX: Number(n.x),
+              clientY: Number(n.y),
+              ctrlKey: e.ctrlKey,
+              altKey: e.altKey,
+              shiftKey: e.shiftKey,
+              metaKey: e.metaKey,
+              button: e.button,
+              buttons: e.buttons,
+              relatedTarget: e.relatedTarget || null
+            }) : (o = document.createEvent("MouseEvents")).initMouseEvent(t, !0, !0, L, e.detail, n.x, n.y, n.x, n.y, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget || null) : "function" == typeof L.CustomEvent ? o = new CustomEvent(t, {
+              bubbles: !0,
+              cancelable: !0,
+              detail: {}
+            }) : (o = document.createEvent("CustomEvent")).initCustomEvent(t, !0, !0, {});
+            o.$material = !0, o.pointer = n, o.srcEvent = e, n.target.dispatchEvent(o)
+          },
+          onSetup: be.noop,
+          onCleanup: be.noop,
+          onStart: be.noop,
+          onMove: be.noop,
+          onEnd: be.noop,
+          onCancel: be.noop,
+          start: function(e, t) {
+            if (!this.state.isRunning) {
+              var n = this.getNearestParent(e.target),
+                o = n && n.$mdGesture[this.name] || {};
+              this.state = {
+                isRunning: !0,
+                options: be.extend({}, this.options, o),
+                registeredParent: n
+              }, this.onStart(e, t)
+            }
+          },
+          move: function(e, t) {
+            this.state.isRunning && this.onMove(e, t)
+          },
+          end: function(e, t) {
+            this.state.isRunning && (this.state.isRunning = !1, this.onEnd(e, t))
+          },
+          cancel: function(e, t) {
+            this.onCancel(e, t), this.state = {}
+          },
+          getNearestParent: function(e) {
+            for (var t = e; t;) {
+              if ((t.$mdGesture || {})[this.name]) return t;
+              t = t.parentNode
+            }
+            return null
+          },
+          registerElement: function(e, t) {
+            var n = this;
+            return e[0].$mdGesture = e[0].$mdGesture || {}, e[0].$mdGesture[this.name] = t || {}, e.on("$destroy", o), n.onSetup(e, t || {}), o;
+
+            function o() {
+              delete e[0].$mdGesture[n.name], e.off("$destroy", o), n.onCleanup(e, t || {})
+            }
+          }
+        }, t
+      }).run(n), e.prototype = {
+        disableAll: function() {
+          d = !0
+        },
+        skipClickHijack: function() {
+          return c = !0
+        },
+        setMaxClickDistance: function(e) {
+          l = parseInt(e)
+        },
+        $get: ["$$MdGestureHandler", "$$rAF", "$timeout", "$mdUtil", function(e, t, n, o) {
+          return new r(e, t, n, o)
+        }]
+      }
+    }(), H.$inject = ["$timeout", "$mdUtil", "$rootScope"], be.module("material.core.interaction", []).service("$mdInteraction", H), H.prototype.deregister = function() {
+      this.bodyElement.off("keydown mousedown", this.inputHandler), "ontouchstart" in document.documentElement && this.bodyElement.off("touchstart", this.bufferedInputHandler), this.pointerEvent && this.bodyElement.off(this.pointerEvent, this.inputHandler)
+    }, H.prototype.initializeEvents = function() {
+      this.bodyElement.on("keydown mousedown", this.inputHandler), "ontouchstart" in document.documentElement && this.bodyElement.on("touchstart", this.bufferedInputHandler), this.pointerEvent && this.bodyElement.on(this.pointerEvent, this.inputHandler)
+    }, H.prototype.onInputEvent = function(e) {
+      if (!this.isBuffering) {
+        var t = this.inputEventMap[e.type];
+        "pointer" === t && (t = this.iePointerMap[e.pointerType] || e.pointerType), this.lastInteractionType = t, this.lastInteractionTime = this.$mdUtil.now()
+      }
+    }, H.prototype.onBufferInputEvent = function(e) {
+      this.$timeout.cancel(this.bufferTimeout), this.onInputEvent(e), this.isBuffering = !0, this.bufferTimeout = this.$timeout(function() {
+        this.isBuffering = !1
+      }.bind(this), 650, !1)
+    }, H.prototype.getLastInteractionType = function() {
+      return this.lastInteractionType
+    }, H.prototype.isUserInvoked = function(e) {
+      var t = be.isNumber(e) ? e : 15;
+      return this.lastInteractionTime >= this.$mdUtil.now() - t
+    }, be.module("material.core").provider("$$interimElement", function() {
+      return t.$inject = ["$document", "$q", "$rootScope", "$timeout", "$rootElement", "$animate", "$mdUtil", "$mdCompiler", "$mdTheming", "$injector", "$exceptionHandler"], e.$get = t, e;
+
+      function e(r) {
+        e.$inject = ["$$interimElement", "$injector"];
+        var n = ["onHide", "onShow", "onRemove"],
+          i = {},
+          l = {
+            presets: {}
+          },
+          o = {
+            setDefaults: function(e) {
+              return l.optionsFactory = e.options, l.methods = (e.methods || []).concat(n), o
+            },
+            addPreset: function(e, t) {
+              if ((t = t || {}).methods = t.methods || [], t.options = t.options || function() {
+                  return {}
+                }, /^cancel|hide|show$/.test(e)) throw new Error("Preset '" + e + "' in " + r + " is reserved!");
+              if (-1 < t.methods.indexOf("_options")) throw new Error("Method '_options' in " + r + " is reserved!");
+              return l.presets[e] = {
+                methods: t.methods.concat(n),
+                optionsFactory: t.options,
+                argOption: t.argOption
+              }, o
+            },
+            addMethod: function(e, t) {
+              return i[e] = t, o
+            },
+            $get: e
+          };
+        return o.addPreset("build", {
+          methods: ["controller", "controllerAs", "resolve", "multiple", "template", "templateUrl", "themable", "transformTemplate", "parent", "contentElement"]
+        }), o;
+
+        function e(e, o) {
+          var a, t, n = e(),
+            d = {
+              hide: n.hide,
+              cancel: n.cancel,
+              show: function(e) {
+                return (e = e || {})._options && (e = e._options), n.show(be.extend({}, t, e))
+              },
+              destroy: function(e) {
+                return n.destroy(e)
+              }
+            };
+          return a = l.methods || [], t = s(l.optionsFactory, {}), be.forEach(i, function(e, t) {
+            d[t] = e
+          }), be.forEach(l.presets, function(t, n) {
+            var o = s(t.optionsFactory, {}),
+              e = (t.methods || []).concat(a);
+
+            function r(e) {
+              this._options = be.extend({}, o, e)
+            }
+            if (be.extend(o, {
+                $type: n
+              }), be.forEach(e, function(t) {
+                r.prototype[t] = function(e) {
+                  return this._options[t] = e, this
+                }
+              }), t.argOption) {
+              var i = "show" + n.charAt(0).toUpperCase() + n.slice(1);
+              d[i] = function(e) {
+                var t = d[n](e);
+                return d.show(t)
+              }
+            }
+            d[n] = function(e) {
+              return arguments.length && t.argOption && !be.isObject(e) && !be.isArray(e) ? (new r)[t.argOption](e) : new r(e)
+            }
+          }), d;
+
+          function s(e, t) {
+            var n = {};
+            return n[r] = d, o.invoke(e || function() {
+              return t
+            }, {}, n)
+          }
+        }
+      }
+
+      function t(m, u, t, p, h, o, n, f, b, s, l) {
+        return function() {
+          var c, r = [],
+            i = [],
+            a = [];
+          return c = {
+            show: function(e) {
+              var t = new d((e = e || {}) || {}),
+                n = e.multiple ? u.resolve() : u.all(r);
+              e.multiple || (n = n.then(function() {
+                var e = i.concat(a.map(c.cancel));
+                return u.all(e)
+              }));
+              var o = n.then(function() {
+                return t.show().then(function() {
+                  a.push(t)
+                }).catch(function(e) {
+                  return e
+                }).finally(function() {
+                  r.splice(r.indexOf(o), 1)
+                })
+              });
+              return r.push(o), t.deferred.promise.catch(function(e) {
+                return e instanceof Error && l(e), e
+              }), t.deferred.promise
+            },
+            hide: e(function(n, o) {
+              return (o = o || {}).closeAll ? u.all(a.slice().reverse().map(e)) : o.closeTo !== ge ? u.all(a.slice(o.closeTo).map(e)) : e(a[a.length - 1]);
+
+              function e(e) {
+                if (!e) return u.when(n);
+                var t = e.remove(n, !1, o || {}).catch(function(e) {
+                  return e
+                }).finally(function() {
+                  i.splice(i.indexOf(t), 1)
+                });
+                return a.splice(a.indexOf(e), 1), i.push(t), e.deferred.promise
+              }
+            }),
+            cancel: e(function(e, t) {
+              var n = a.pop();
+              if (!n) return u.when(e);
+              var o = n.remove(e, !0, t || {}).catch(function(e) {
+                return e
+              }).finally(function() {
+                i.splice(i.indexOf(o), 1)
+              });
+              return i.push(o), n.deferred.promise.catch(be.noop)
+            }),
+            destroy: function(e) {
+              var t = e ? null : a.shift(),
+                n = be.element(e).length && be.element(e)[0].parentNode;
+              if (n) {
+                var o = a.filter(function(e) {
+                  return e.options.element[0] === n
+                });
+                o.length && (t = o[0], a.splice(a.indexOf(t), 1))
+              }
+              return t ? t.remove(!1, !1, {
+                $destroy: !0
+              }) : u.when(!1)
+            },
+            $injector_: s
+          };
+
+          function e(t) {
+            return function() {
+              var e = arguments;
+              return a.length ? t.apply(c, e) : r.length ? r[0].finally(function() {
+                return t.apply(c, e)
+              }) : u.when("No interim elements currently showing up.")
+            }
+          }
+
+          function d(i) {
+            var a, d, s = u.when(!0);
+            return i = function(e) {
+              return (e = e || {}).template && (e.template = n.processTemplate(e.template)), be.extend({
+                preserveScope: !1,
+                cancelAutoHide: be.noop,
+                scope: e.scope || t.$new(e.isolateScope),
+                onShow: function(e, t, n) {
+                  return o.enter(t, n.parent)
+                },
+                onRemove: function(e, t) {
+                  return t && o.leave(t) || u.when()
+                }
+              }, e)
+            }(i), a = {
+              options: i,
+              deferred: u.defer(),
+              show: function() {
+                return u(function(t, n) {
+                  function o(e) {
+                    a.deferred.reject(e), n(e)
+                  }
+                  i.onCompiling && i.onCompiling(i),
+                    function(t) {
+                      return (t.skipCompile ? null : f.compile(t)) || u(function(e) {
+                        e({
+                          locals: {},
+                          link: function() {
+                            return t.element
+                          }
+                        })
+                      })
+                    }(i).then(function(e) {
+                      d = function(e, t) {
+                        be.extend(e.locals, t);
+                        var n = e.link(t.scope);
+                        return t.element = n, t.parent = function(e, t) {
+                          var n, o = t.parent;
+                          return ((o = be.isFunction(o) ? o(t.scope, e, t) : be.isString(o) ? be.element(m[0].querySelector(o)) : be.element(o)) || {}).length ? o : (h[0] && h[0].querySelector && (n = h[0].querySelector(":not(svg) > body")), "#comment" === (n = n || h[0]).nodeName && (n = m[0].body), be.element(n))
+                        }(n, t), t.themable && b(n), n
+                      }(e, i), i.cleanupElement = e.cleanup, s = function(n, o, e) {
+                        var t = o.onShowing || be.noop,
+                          r = o.onComplete || be.noop;
+                        try {
+                          t(o.scope, n, o, e)
+                        } catch (e) {
+                          return u.reject(e)
+                        }
+                        return u(function(e, t) {
+                          try {
+                            u.when(o.onShow(o.scope, n, o)).then(function() {
+                              r(o.scope, n, o),
+                                function() {
+                                  var e, t = be.noop;
+                                  i.hideDelay && (e = p(c.hide, i.hideDelay), t = function() {
+                                    p.cancel(e)
+                                  }), i.cancelAutoHide = function() {
+                                    t(), i.cancelAutoHide = ge
+                                  }
+                                }(), e(n)
+                            }, t)
+                          } catch (e) {
+                            t(e.message)
+                          }
+                        })
+                      }(d, i, e.controller).then(t, o)
+                    }).catch(o)
+                })
+              },
+              remove: function(e, t, n) {
+                return d ? ((i = be.extend(i || {}, n || {})).cancelAutoHide && i.cancelAutoHide(), i.element.triggerHandler("$mdInterimElementRemove"), !0 === i.$destroy ? l(i.element, i).then(function() {
+                  t && r(e) || o(e)
+                }) : (u.when(s).finally(function() {
+                  l(i.element, i).then(function() {
+                    t ? r(e) : o(e)
+                  }, r)
+                }), a.deferred.promise)) : u.when(!1);
+
+                function o(e) {
+                  a.deferred.resolve(e)
+                }
+
+                function r(e) {
+                  a.deferred.reject(e)
+                }
+              }
+            };
+
+            function l(o, r) {
+              var i = r.onRemoving || be.noop;
+              return u(function(e, t) {
+                try {
+                  var n = u.when(r.onRemove(r.scope, o, r) || !0);
+                  i(o, n), r.$destroy ? (e(o), !r.preserveScope && r.scope && n.then(function() {
+                    r.scope.$destroy()
+                  })) : n.then(function() {
+                    !r.preserveScope && r.scope && r.scope.$destroy(), e(o)
+                  }, t)
+                } catch (e) {
+                  t(e.message)
+                }
+              })
+            }
+          }
+        }
+      }
+    }), E = /(-gt)?-(sm|md|lg|print)/g, v = /\s+/g, $ = ["grow", "initial", "auto", "none", "noshrink", "nogrow"], M = ["row", "column"], y = ["", "start", "center", "end", "stretch", "space-around", "space-between"], C = ["", "start", "center", "end", "stretch"], T = {
+      enabled: !0,
+      breakpoints: []
+    }, p = be.module("material.core.layout", ["ng"]), h = /^((?:x|data)[:\-_])/i, f = /([:\-_]+(.))/g, b = ["layout", "flex", "flex-order", "flex-offset", "layout-align"], g = ["show", "hide", "layout-padding", "layout-margin"], be.forEach(["", "xs", "gt-xs", "sm", "gt-sm", "md", "gt-md", "lg", "gt-lg", "xl", "print"], function(n) {
+      be.forEach(b, function(e) {
+        var t = n ? e + "-" + n : e;
+        p.directive(I(t), function(i) {
+          return ["$mdUtil", "$interpolate", "$log", function(e, t, n) {
+            return l = e, c = t, m = n, {
+              restrict: "A",
+              compile: function(e, t) {
+                var n;
+                return T.enabled && (F(i, 0, e, m), B(i, z(i, t, ""), U(0, i, t)), n = o), n || be.noop
+              }
+            }
+          }];
+
+          function o(e, t, n) {
+            var o = function(n, o) {
+                var r;
+                return function(e) {
+                  var t = B(o, e || "");
+                  be.isDefined(t) && (r && n.removeClass(r), r = t ? o + "-" + t.trim().replace(v, "-") : o, n.addClass(r))
+                }
+              }(t, i),
+              r = n.$observe(n.$normalize(i), o);
+            o(z(i, n, "")), e.$on("$destroy", function() {
+              r()
+            })
+          }
+        }(t))
+      }), be.forEach(g, function(e) {
+        var t = n ? e + "-" + n : e;
+        p.directive(I(t), R(t))
+      })
+    }), p.provider("$$mdLayout", function() {
+      return {
+        $get: be.noop,
+        validateAttributeValue: B,
+        validateAttributeUsage: F,
+        disableLayouts: function(e) {
+          T.enabled = !0 !== e
+        }
+      }
+    }).directive("mdLayoutCss", P).directive("ngCloak", (u = "ng-cloak", ["$timeout", function(n) {
+      return {
+        restrict: "A",
+        priority: -10,
+        compile: function(e) {
+          return T.enabled ? (e.addClass(u), function(e, t) {
+            n(function() {
+              t.removeClass(u)
+            }, 10, !1)
+          }) : be.noop
+        }
+      }
+    }])).directive("layoutWrap", R("layout-wrap")).directive("layoutNowrap", R("layout-nowrap")).directive("layoutNoWrap", R("layout-no-wrap")).directive("layoutFill", R("layout-fill")).config(O), V.$inject = ["$timeout"], be.module("material.core").service("$mdLiveAnnouncer", V), V.prototype.announce = function(e, t) {
+      t = t || "polite";
+      var n = this;
+      n._liveElement.textContent = "", n._liveElement.setAttribute("aria-live", t), n._$timeout(function() {
+        n._liveElement.textContent = e
+      }, n._announceTimeout, !1)
+    }, V.prototype._createLiveElement = function() {
+      var e = document.createElement("div");
+      return e.classList.add("md-visually-hidden"), e.setAttribute("role", "status"), e.setAttribute("aria-atomic", "true"), e.setAttribute("aria-live", "polite"), document.body.appendChild(e), e
+    }, be.module("material.core.meta", []).provider("$$mdMeta", function() {
+      var o = be.element(document.head),
+        r = {};
+
+      function i(e) {
+        if (r[e]) return !0;
+        var t = document.getElementsByName(e)[0];
+        return !!t && (r[e] = be.element(t), !0)
+      }
+      var e = {
+        setMeta: function(e, t) {
+          if (i(e), r[e]) r[e].attr("content", t);
+          else {
+            var n = be.element('<meta name="' + e + '" content="' + t + '"/>');
+            o.append(n), r[e] = n
+          }
+          return function() {
+            r[e].attr("content", ""), r[e].remove(), delete r[e]
+          }
+        },
+        getMeta: function(e) {
+          if (!i(e)) throw Error("$$mdMeta: could not find a meta tag with the name '" + e + "'");
+          return r[e].attr("content")
+        }
+      };
+      return be.extend({}, e, {
+        $get: function() {
+          return e
+        }
+      })
+    }), W.$inject = ["$log", "$q"], be.module("material.core").factory("$mdComponentRegistry", W), Y.$inject = ["$mdInkRipple"], be.module("material.core").factory("$mdButtonInkRipple", Y), K.$inject = ["$mdInkRipple"], be.module("material.core").factory("$mdCheckboxInkRipple", K), G.$inject = ["$mdInkRipple"], be.module("material.core").factory("$mdListInkRipple", G),
+    function() {
+      i.$inject = ["$scope", "$element", "rippleOptions", "$window", "$timeout", "$mdUtil", "$mdColorUtil"], e.$inject = ["$mdButtonInkRipple", "$mdCheckboxInkRipple"], be.module("material.core").provider("$mdInkRipple", function() {
+        var r = !1;
+        return {
+          disableInkRipple: function() {
+            r = !0
+          },
+          $get: ["$injector", function(o) {
+            return {
+              attach: function(e, t, n) {
+                return r || t.controller("mdNoInk") ? be.noop : o.instantiate(i, {
+                  $scope: e,
+                  $element: t,
+                  rippleOptions: n
+                })
+              }
+            }
+          }]
+        }
+      }).directive("mdInkRipple", e).directive("mdNoInk", n).directive("mdNoBar", n).directive("mdNoStretch", n);
+
+      function e(o, r) {
+        return {
+          controller: be.noop,
+          link: function(e, t, n) {
+            n.hasOwnProperty("mdInkRippleCheckbox") ? r.attach(e, t) : o.attach(e, t)
+          }
+        }
+      }
+
+      function i(e, t, n, o, r, i, a) {
+        this.$window = o, this.$timeout = r, this.$mdUtil = i, this.$mdColorUtil = a, this.$scope = e, this.$element = t, this.options = n, this.mousedown = !1, this.ripples = [], this.timeout = null, this.lastRipple = null, i.valueOnUse(this, "container", this.createContainer), this.$element.addClass("md-ink-ripple"), (t.controller("mdInkRipple") || {}).createRipple = be.bind(this, this.createRipple), (t.controller("mdInkRipple") || {}).setColor = be.bind(this, this.color), this.bindEvents()
+      }
+
+      function t(e, t) {
+        (e.mousedown || e.lastRipple) && (e.mousedown = !1, e.$mdUtil.nextTick(be.bind(e, t), !1))
+      }
+
+      function n() {
+        return {
+          controller: be.noop
+        }
+      }
+      i.prototype.color = function(e) {
+        var t, n, o = this;
+        return be.isDefined(e) && (o._color = o._parseColor(e)), o._color || o._parseColor(o.inkRipple()) || o._parseColor((t = o.options && o.options.colorElement ? o.options.colorElement : [], (n = t.length ? t[0] : o.$element[0]) ? o.$window.getComputedStyle(n).color : "rgb(0,0,0)"))
+      }, i.prototype.calculateColor = function() {
+        return this.color()
+      }, i.prototype._parseColor = function(e, t) {
+        t = t || 1;
+        var n = this.$mdColorUtil;
+        if (e) return 0 === e.indexOf("rgba") ? e.replace(/\d?\.?\d*\s*\)\s*$/, (.1 * t).toString() + ")") : 0 === e.indexOf("rgb") ? n.rgbToRgba(e) : 0 === e.indexOf("#") ? n.hexToRgba(e) : void 0
+      }, i.prototype.bindEvents = function() {
+        this.$element.on("mousedown", be.bind(this, this.handleMousedown)), this.$element.on("mouseup touchend", be.bind(this, this.handleMouseup)), this.$element.on("mouseleave", be.bind(this, this.handleMouseup)), this.$element.on("touchmove", be.bind(this, this.handleTouchmove))
+      }, i.prototype.handleMousedown = function(e) {
+        if (!this.mousedown)
+          if (e.hasOwnProperty("originalEvent") && (e = e.originalEvent), this.mousedown = !0, this.options.center) this.createRipple(this.container.prop("clientWidth") / 2, this.container.prop("clientWidth") / 2);
+          else if (e.srcElement !== this.$element[0]) {
+          var t = this.$element[0].getBoundingClientRect(),
+            n = e.clientX - t.left,
+            o = e.clientY - t.top;
+          this.createRipple(n, o)
+        } else this.createRipple(e.offsetX, e.offsetY)
+      }, i.prototype.handleMouseup = function() {
+        this.$timeout(function() {
+          t(this, this.clearRipples)
+        }.bind(this))
+      }, i.prototype.handleTouchmove = function() {
+        t(this, this.deleteRipples)
+      }, i.prototype.deleteRipples = function() {
+        for (var e = 0; e < this.ripples.length; e++) this.ripples[e].remove()
+      }, i.prototype.clearRipples = function() {
+        for (var e = 0; e < this.ripples.length; e++) this.fadeInComplete(this.ripples[e])
+      }, i.prototype.createContainer = function() {
+        var e = be.element('<div class="md-ripple-container"></div>');
+        return this.$element.append(e), e
+      }, i.prototype.clearTimeout = function() {
+        this.timeout && (this.$timeout.cancel(this.timeout), this.timeout = null)
+      }, i.prototype.isRippleAllowed = function() {
+        var e = this.$element[0];
+        do {
+          if (!e.tagName || "BODY" === e.tagName) break;
+          if (e && be.isFunction(e.hasAttribute)) {
+            if (e.hasAttribute("disabled")) return !1;
+            if ("false" === this.inkRipple() || "0" === this.inkRipple()) return !1
+          }
+        } while (e = e.parentNode);
+        return !0
+      }, i.prototype.inkRipple = function() {
+        return this.$element.attr("md-ink-ripple")
+      }, i.prototype.createRipple = function(e, t) {
+        if (this.isRippleAllowed()) {
+          var n, o, r, i = this,
+            a = i.$mdColorUtil,
+            d = be.element('<div class="md-ripple"></div>'),
+            s = this.$element.prop("clientWidth"),
+            l = this.$element.prop("clientHeight"),
+            c = 2 * Math.max(Math.abs(s - e), e),
+            m = 2 * Math.max(Math.abs(l - t), t),
+            u = (n = this.options.fitRipple, o = c, r = m, n ? Math.max(o, r) : Math.sqrt(Math.pow(o, 2) + Math.pow(r, 2))),
+            p = this.calculateColor();
+          d.css({
+            left: e + "px",
+            top: t + "px",
+            background: "black",
+            width: u + "px",
+            height: u + "px",
+            backgroundColor: a.rgbaToRgb(p),
+            borderColor: a.rgbaToRgb(p)
+          }), this.lastRipple = d, this.clearTimeout(), this.timeout = this.$timeout(function() {
+            i.clearTimeout(), i.mousedown || i.fadeInComplete(d)
+          }, 157.5, !1), this.options.dimBackground && this.container.css({
+            backgroundColor: p
+          }), this.container.append(d), this.ripples.push(d), d.addClass("md-ripple-placed"), this.$mdUtil.nextTick(function() {
+            d.addClass("md-ripple-scaled md-ripple-active"), i.$timeout(function() {
+              i.clearRipples()
+            }, 450, !1)
+          }, !1)
+        }
+      }, i.prototype.fadeInComplete = function(e) {
+        this.lastRipple === e && (this.timeout || this.mousedown) || this.removeRipple(e)
+      }, i.prototype.removeRipple = function(e) {
+        var t = this;
+        this.ripples.indexOf(e) < 0 || (this.ripples.splice(this.ripples.indexOf(e), 1), e.removeClass("md-ripple-active"), e.addClass("md-ripple-remove"), 0 === this.ripples.length && this.container.css({
+          backgroundColor: ""
+        }), this.$timeout(function() {
+          t.fadeOutComplete(e)
+        }, 450, !1))
+      }, i.prototype.fadeOutComplete = function(e) {
+        e.remove(), this.lastRipple = null
+      }
+    }(), X.$inject = ["$mdInkRipple"], be.module("material.core").factory("$mdTabInkRipple", X), be.module("material.core.theming.palette", []).constant("$mdColorPalette", {
+      red: {
+        50: "#ffebee",
+        100: "#ffcdd2",
+        200: "#ef9a9a",
+        300: "#e57373",
+        400: "#ef5350",
+        500: "#f44336",
+        600: "#e53935",
+        700: "#d32f2f",
+        800: "#c62828",
+        900: "#b71c1c",
+        A100: "#ff8a80",
+        A200: "#ff5252",
+        A400: "#ff1744",
+        A700: "#d50000",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 400 500 600 A100 A200 A400",
+        contrastStrongLightColors: "700 800 900 A700"
+      },
+      pink: {
+        50: "#fce4ec",
+        100: "#f8bbd0",
+        200: "#f48fb1",
+        300: "#f06292",
+        400: "#ec407a",
+        500: "#e91e63",
+        600: "#d81b60",
+        700: "#c2185b",
+        800: "#ad1457",
+        900: "#880e4f",
+        A100: "#ff80ab",
+        A200: "#ff4081",
+        A400: "#f50057",
+        A700: "#c51162",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 400 A100 A200 A400",
+        contrastStrongLightColors: "500 600 700 800 900 A700"
+      },
+      purple: {
+        50: "#f3e5f5",
+        100: "#e1bee7",
+        200: "#ce93d8",
+        300: "#ba68c8",
+        400: "#ab47bc",
+        500: "#9c27b0",
+        600: "#8e24aa",
+        700: "#7b1fa2",
+        800: "#6a1b9a",
+        900: "#4a148c",
+        A100: "#ea80fc",
+        A200: "#e040fb",
+        A400: "#d500f9",
+        A700: "#aa00ff",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 A100 A200 A400",
+        contrastStrongLightColors: "400 500 600 700 800 900 A700"
+      },
+      "deep-purple": {
+        50: "#ede7f6",
+        100: "#d1c4e9",
+        200: "#b39ddb",
+        300: "#9575cd",
+        400: "#7e57c2",
+        500: "#673ab7",
+        600: "#5e35b1",
+        700: "#512da8",
+        800: "#4527a0",
+        900: "#311b92",
+        A100: "#b388ff",
+        A200: "#7c4dff",
+        A400: "#651fff",
+        A700: "#6200ea",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 A100",
+        contrastStrongLightColors: "400 500 600 700 800 900 A200 A400 A700"
+      },
+      indigo: {
+        50: "#e8eaf6",
+        100: "#c5cae9",
+        200: "#9fa8da",
+        300: "#7986cb",
+        400: "#5c6bc0",
+        500: "#3f51b5",
+        600: "#3949ab",
+        700: "#303f9f",
+        800: "#283593",
+        900: "#1a237e",
+        A100: "#8c9eff",
+        A200: "#536dfe",
+        A400: "#3d5afe",
+        A700: "#304ffe",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 A100 A200",
+        contrastStrongLightColors: "400 500 600 700 800 900 A400 A700"
+      },
+      blue: {
+        50: "#e3f2fd",
+        100: "#bbdefb",
+        200: "#90caf9",
+        300: "#64b5f6",
+        400: "#42a5f5",
+        500: "#2196f3",
+        600: "#1e88e5",
+        700: "#1976d2",
+        800: "#1565c0",
+        900: "#0d47a1",
+        A100: "#82b1ff",
+        A200: "#448aff",
+        A400: "#2979ff",
+        A700: "#2962ff",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 400 500 600 A100 A200",
+        contrastStrongLightColors: "700 800 900 A400 A700"
+      },
+      "light-blue": {
+        50: "#e1f5fe",
+        100: "#b3e5fc",
+        200: "#81d4fa",
+        300: "#4fc3f7",
+        400: "#29b6f6",
+        500: "#03a9f4",
+        600: "#039be5",
+        700: "#0288d1",
+        800: "#0277bd",
+        900: "#01579b",
+        A100: "#80d8ff",
+        A200: "#40c4ff",
+        A400: "#00b0ff",
+        A700: "#0091ea",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "800 900 A700"
+      },
+      cyan: {
+        50: "#e0f7fa",
+        100: "#b2ebf2",
+        200: "#80deea",
+        300: "#4dd0e1",
+        400: "#26c6da",
+        500: "#00bcd4",
+        600: "#00acc1",
+        700: "#0097a7",
+        800: "#00838f",
+        900: "#006064",
+        A100: "#84ffff",
+        A200: "#18ffff",
+        A400: "#00e5ff",
+        A700: "#00b8d4",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "800 900"
+      },
+      teal: {
+        50: "#e0f2f1",
+        100: "#b2dfdb",
+        200: "#80cbc4",
+        300: "#4db6ac",
+        400: "#26a69a",
+        500: "#009688",
+        600: "#00897b",
+        700: "#00796b",
+        800: "#00695c",
+        900: "#004d40",
+        A100: "#a7ffeb",
+        A200: "#64ffda",
+        A400: "#1de9b6",
+        A700: "#00bfa5",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "600 700 800 900"
+      },
+      green: {
+        50: "#e8f5e9",
+        100: "#c8e6c9",
+        200: "#a5d6a7",
+        300: "#81c784",
+        400: "#66bb6a",
+        500: "#4caf50",
+        600: "#43a047",
+        700: "#388e3c",
+        800: "#2e7d32",
+        900: "#1b5e20",
+        A100: "#b9f6ca",
+        A200: "#69f0ae",
+        A400: "#00e676",
+        A700: "#00c853",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "700 800 900"
+      },
+      "light-green": {
+        50: "#f1f8e9",
+        100: "#dcedc8",
+        200: "#c5e1a5",
+        300: "#aed581",
+        400: "#9ccc65",
+        500: "#8bc34a",
+        600: "#7cb342",
+        700: "#689f38",
+        800: "#558b2f",
+        900: "#33691e",
+        A100: "#ccff90",
+        A200: "#b2ff59",
+        A400: "#76ff03",
+        A700: "#64dd17",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "800 900"
+      },
+      lime: {
+        50: "#f9fbe7",
+        100: "#f0f4c3",
+        200: "#e6ee9c",
+        300: "#dce775",
+        400: "#d4e157",
+        500: "#cddc39",
+        600: "#c0ca33",
+        700: "#afb42b",
+        800: "#9e9d24",
+        900: "#827717",
+        A100: "#f4ff81",
+        A200: "#eeff41",
+        A400: "#c6ff00",
+        A700: "#aeea00",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "900"
+      },
+      yellow: {
+        50: "#fffde7",
+        100: "#fff9c4",
+        200: "#fff59d",
+        300: "#fff176",
+        400: "#ffee58",
+        500: "#ffeb3b",
+        600: "#fdd835",
+        700: "#fbc02d",
+        800: "#f9a825",
+        900: "#f57f17",
+        A100: "#ffff8d",
+        A200: "#ffff00",
+        A400: "#ffea00",
+        A700: "#ffd600",
+        contrastDefaultColor: "dark"
+      },
+      amber: {
+        50: "#fff8e1",
+        100: "#ffecb3",
+        200: "#ffe082",
+        300: "#ffd54f",
+        400: "#ffca28",
+        500: "#ffc107",
+        600: "#ffb300",
+        700: "#ffa000",
+        800: "#ff8f00",
+        900: "#ff6f00",
+        A100: "#ffe57f",
+        A200: "#ffd740",
+        A400: "#ffc400",
+        A700: "#ffab00",
+        contrastDefaultColor: "dark"
+      },
+      orange: {
+        50: "#fff3e0",
+        100: "#ffe0b2",
+        200: "#ffcc80",
+        300: "#ffb74d",
+        400: "#ffa726",
+        500: "#ff9800",
+        600: "#fb8c00",
+        700: "#f57c00",
+        800: "#ef6c00",
+        900: "#e65100",
+        A100: "#ffd180",
+        A200: "#ffab40",
+        A400: "#ff9100",
+        A700: "#ff6d00",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "900"
+      },
+      "deep-orange": {
+        50: "#fbe9e7",
+        100: "#ffccbc",
+        200: "#ffab91",
+        300: "#ff8a65",
+        400: "#ff7043",
+        500: "#ff5722",
+        600: "#f4511e",
+        700: "#e64a19",
+        800: "#d84315",
+        900: "#bf360c",
+        A100: "#ff9e80",
+        A200: "#ff6e40",
+        A400: "#ff3d00",
+        A700: "#dd2c00",
+        contrastDefaultColor: "dark",
+        contrastStrongLightColors: "800 900 A400 A700"
+      },
+      brown: {
+        50: "#efebe9",
+        100: "#d7ccc8",
+        200: "#bcaaa4",
+        300: "#a1887f",
+        400: "#8d6e63",
+        500: "#795548",
+        600: "#6d4c41",
+        700: "#5d4037",
+        800: "#4e342e",
+        900: "#3e2723",
+        A100: "#d7ccc8",
+        A200: "#bcaaa4",
+        A400: "#8d6e63",
+        A700: "#5d4037",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 A100 A200",
+        contrastStrongLightColors: "400 500 600 700 800 900 A400 A700"
+      },
+      grey: {
+        50: "#fafafa",
+        100: "#f5f5f5",
+        200: "#eeeeee",
+        300: "#e0e0e0",
+        400: "#bdbdbd",
+        500: "#9e9e9e",
+        600: "#757575",
+        700: "#616161",
+        800: "#424242",
+        900: "#212121",
+        A100: "#ffffff",
+        A200: "#000000",
+        A400: "#303030",
+        A700: "#616161",
+        contrastDefaultColor: "dark",
+        contrastLightColors: "700 800 900 A200 A400 A700",
+        contrastStrongLightColors: "600"
+      },
+      "blue-grey": {
+        50: "#eceff1",
+        100: "#cfd8dc",
+        200: "#b0bec5",
+        300: "#90a4ae",
+        400: "#78909c",
+        500: "#607d8b",
+        600: "#546e7a",
+        700: "#455a64",
+        800: "#37474f",
+        900: "#263238",
+        A100: "#cfd8dc",
+        A200: "#b0bec5",
+        A400: "#78909c",
+        A700: "#455a64",
+        contrastDefaultColor: "light",
+        contrastDarkColors: "50 100 200 300 400 A100 A200 A400",
+        contrastStrongLightColors: "500 600 700 800 900 A700"
+      }
+    }),
+    function(v) {
+      function e(e) {
+        var t = !!document.querySelector("[md-themes-disabled]");
+        e.disableTheming(t)
+      }
+      e.$inject = ["$mdThemingProvider"], n.$inject = ["$mdTheming", "$interpolate", "$parse", "$mdUtil", "$q", "$log"], o.$inject = ["$mdTheming"], t.$inject = ["$mdColorPalette", "$$mdMetaProvider"], r.$inject = ["$injector", "$mdTheming"], v.module("material.core.theming", ["material.core.theming.palette", "material.core.meta"]).directive("mdTheme", n).directive("mdThemable", o).directive("mdThemesDisabled", function() {
+        return A.disableTheming = !0, {
+          restrict: "A",
+          priority: "900"
+        }
+      }).provider("$mdTheming", t).config(e).run(r);
+      var p, s = {},
+        l = {
+          name: "dark"
+        },
+        c = {
+          name: "light"
+        },
+        h = "1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)",
+        f = "",
+        m = x("rgba(0,0,0,0.87)"),
+        u = x("rgba(255,255,255,0.87)"),
+        b = x("rgb(255,255,255)"),
+        g = ["primary", "accent", "warn", "background"],
+        a = "primary",
+        E = {
+          accent: {
+            default: "A200",
+            "hue-1": "A100",
+            "hue-2": "A400",
+            "hue-3": "A700"
+          },
+          background: {
+            default: "50",
+            "hue-1": "A100",
+            "hue-2": "100",
+            "hue-3": "300"
+          }
+        },
+        $ = {
+          background: {
+            default: "A400",
+            "hue-1": "800",
+            "hue-2": "900",
+            "hue-3": "A200"
+          }
+        },
+        M = {
+          icon: .54,
+          secondary: .54,
+          disabled: .38,
+          hint: .38,
+          divider: .12
+        },
+        y = {
+          icon: .87,
+          secondary: .7,
+          disabled: .5,
+          hint: .5,
+          divider: .12
+        },
+        C = {
+          icon: 1,
+          secondary: .7,
+          disabled: .5,
+          hint: .5,
+          divider: .12
+        };
+      g.forEach(function(e) {
+        var t = {
+          default: "500",
+          "hue-1": "300",
+          "hue-2": "800",
+          "hue-3": "A100"
+        };
+        E[e] || (E[e] = t), $[e] || ($[e] = t)
+      });
+      var T = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900", "A100", "A200", "A400", "A700"],
+        A = {
+          disableTheming: !1,
+          generateOnDemand: !1,
+          registeredStyles: [],
+          nonce: null
+        };
+
+      function t(e, i) {
+        s.$inject = ["$rootScope", "$mdUtil", "$q", "$log"];
+        var n, a = {},
+          m = !(p = {}),
+          u = "default";
+        v.extend(p, e);
+        var t = function(e) {
+          var t = (e = v.isObject(e) ? e : {}).theme || "default",
+            n = e.hue || "800",
+            o = p[e.palette] || p[a[t].colors[e.palette || "primary"].name],
+            r = v.isObject(o[n]) ? o[n].hex : o[n];
+          return "#" !== r.substr(0, 1) && (r = "#" + r),
+            function(e) {
+              var t = i.setMeta("theme-color", e),
+                n = i.setMeta("msapplication-navbutton-color", e);
+              return function() {
+                t(), n()
+              }
+            }(r)
+        };
+        return n = {
+          definePalette: function(e, t) {
+            return t = t || {}, p[e] = o(e, t), n
+          },
+          extendPalette: function(e, t) {
+            return o(e, v.extend({}, p[e] || {}, t))
+          },
+          theme: d,
+          configuration: function() {
+            return v.extend({}, A, {
+              defaultTheme: u,
+              alwaysWatchTheme: m,
+              registeredStyles: [].concat(A.registeredStyles)
+            })
+          },
+          disableTheming: function(e) {
+            A.disableTheming = v.isUndefined(e) || !!e
+          },
+          registerStyles: function(e) {
+            A.registeredStyles.push(e)
+          },
+          setNonce: function(e) {
+            A.nonce = e
+          },
+          generateThemesOnDemand: function(e) {
+            A.generateOnDemand = e
+          },
+          setDefaultTheme: function(e) {
+            u = e
+          },
+          alwaysWatchTheme: function(e) {
+            m = e
+          },
+          enableBrowserColor: t,
+          $get: s,
+          _LIGHT_DEFAULT_HUES: E,
+          _DARK_DEFAULT_HUES: $,
+          _PALETTES: p,
+          _THEMES: a,
+          _parseRules: w,
+          _rgba: N
+        };
+
+        function o(e, t) {
+          var n = T.filter(function(e) {
+            return !t[e]
+          });
+          if (n.length) throw new Error("Missing colors %1 in palette %2!".replace("%1", n.join(", ")).replace("%2", e));
+          return t
+        }
+
+        function d(e, t) {
+          if (a[e]) return a[e];
+          var n = "string" == typeof(t = t || "default") ? a[t] : t,
+            o = new r(e);
+          return n && v.forEach(n.colors, function(e, t) {
+            o.colors[t] = {
+              name: e.name,
+              hues: v.extend({}, e.hues)
+            }
+          }), a[e] = o
+        }
+
+        function r(e) {
+          var a = this;
+
+          function t(e) {
+            if ((e = 0 === arguments.length || !!e) !== a.isDark) {
+              a.isDark = e, a.foregroundPalette = a.isDark ? c : l, a.foregroundShadow = a.isDark ? h : f;
+              var t = a.isDark ? $ : E,
+                i = a.isDark ? E : $;
+              return v.forEach(t, function(e, t) {
+                var n = a.colors[t],
+                  o = i[t];
+                if (n)
+                  for (var r in n.hues) n.hues[r] === o[r] && (n.hues[r] = e[r])
+              }), a
+            }
+          }
+          a.name = e, a.colors = {}, (a.dark = t)(!1), g.forEach(function(o) {
+            var r = (a.isDark ? $ : E)[o];
+            a[o + "Palette"] = function(t, e) {
+              var n = a.colors[o] = {
+                name: t,
+                hues: v.extend({}, r, e)
+              };
+              return Object.keys(n.hues).forEach(function(e) {
+                if (!r[e]) throw new Error("Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4".replace("%1", e).replace("%2", a.name).replace("%3", t).replace("%4", Object.keys(r).join(", ")))
+              }), Object.keys(n.hues).map(function(e) {
+                return n.hues[e]
+              }).forEach(function(e) {
+                if (-1 === T.indexOf(e)) throw new Error("Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5".replace("%1", e).replace("%2", a.name).replace("%3", o).replace("%4", t).replace("%5", T.join(", ")))
+              }), a
+            }
+          })
+        }
+
+        function s(n, s, o, l) {
+          var r = function(e, t) {
+            t === ge && (t = e, e = ge), e === ge && (e = n), r.inherit(t, t)
+          };
+          return Object.defineProperty(r, "THEMES", {
+            get: function() {
+              return v.extend({}, a)
+            }
+          }), Object.defineProperty(r, "PALETTES", {
+            get: function() {
+              return v.extend({}, p)
+            }
+          }), Object.defineProperty(r, "ALWAYS_WATCH", {
+            get: function() {
+              return m
+            }
+          }), r.inherit = function(n, e) {
+            var o = e.controller("mdTheme") || n.data("$mdThemeController"),
+              t = n.scope();
+            if (d(o && o.$mdTheme || ("default" === u ? "" : u)), o) {
+              var r = m || o.$shouldWatch || s.parseAttributeBoolean(n.attr("md-theme-watch"));
+              if (r || o.isAsyncTheme) {
+                var i = function() {
+                    a && (a(), a = ge)
+                  },
+                  a = o.registerChanges(function(e) {
+                    d(e), r || i()
+                  });
+                t ? t.$on("$destroy", i) : n.on("$destroy", i)
+              }
+            }
+
+            function d(e) {
+              if (e) {
+                c(e) || l.warn("Attempted to use unregistered theme '" + e + "'. Register it with $mdThemingProvider.theme().");
+                var t = n.data("$mdThemeName");
+                t && n.removeClass("md-" + t + "-theme"), n.addClass("md-" + e + "-theme"), n.data("$mdThemeName", e), o && n.data("$mdThemeController", o)
+              }
+            }
+          }, r.registered = c, r.defaultTheme = function() {
+            return u
+          }, r.generateTheme = function(e) {
+            k(a[e], e, A.nonce)
+          }, r.defineTheme = function(e, t) {
+            t = t || {};
+            var n = d(e);
+            return t.primary && n.primaryPalette(t.primary, t.primaryHues), t.accent && n.accentPalette(t.accent, t.accentHues), t.warn && n.warnPalette(t.warn, t.warnHues), t.background && n.backgroundPalette(t.background, t.backgroundHues), t.dark && n.dark(), this.generateTheme(e), o.resolve(e)
+          }, r.setBrowserColor = t, r;
+
+          function c(e) {
+            return e === ge || "" === e || r.THEMES[e] !== ge
+          }
+        }
+      }
+
+      function n(p, h, f, b, g, E) {
+        return {
+          priority: 101,
+          link: {
+            pre: function(t, e, n) {
+              function o() {
+                var e = h(n.mdTheme)(t);
+                return f(e)(t) || e
+              }
+              var r = [],
+                i = h.startSymbol(),
+                a = h.endSymbol(),
+                d = n.mdTheme.trim(),
+                s = d.substr(0, i.length) === i && d.lastIndexOf(a) === d.length - a.length,
+                l = "::" === n.mdTheme.split(i).join("").split(a).join("").trim().substr(0, "::".length),
+                c = {
+                  isAsyncTheme: v.isFunction(o()) || v.isFunction(o().then),
+                  registerChanges: function(t, e) {
+                    return e && (t = v.bind(e, t)), r.push(t),
+                      function() {
+                        var e = r.indexOf(t); - 1 < e && r.splice(e, 1)
+                      }
+                  },
+                  $setTheme: function(e) {
+                    p.registered(e) || E.warn("attempted to use unregistered theme '" + e + "'"), c.$mdTheme = e;
+                    for (var t = r.length; t--;) r[t](e)
+                  },
+                  $shouldWatch: b.parseAttributeBoolean(e.attr("md-theme-watch")) || p.ALWAYS_WATCH || s && !l
+                };
+
+              function m(e) {
+                if ("string" == typeof e) return c.$setTheme(e);
+                g.when(v.isFunction(e) ? e() : e).then(function(e) {
+                  c.$setTheme(e)
+                })
+              }
+              e.data("$mdThemeController", c), m(o());
+              var u = t.$watch(o, function(e) {
+                e && (m(e), c.$shouldWatch || u())
+              })
+            }
+          }
+        }
+      }
+
+      function o(e) {
+        return e
+      }
+
+      function w(c, e, t) {
+        ! function(e, t) {
+          if (!p[(e.colors[t] || {}).name]) throw new Error("You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3".replace("%1", e.name).replace("%2", t).replace("%3", Object.keys(p).join(", ")))
+        }(c, e), t = t.replace(/THEME_NAME/g, c.name);
+        var n = new RegExp("\\.md-" + c.name + "-theme", "g"),
+          o = new RegExp("(['\"])?{{\\s*([a-zA-Z]+)-?(color|default)?-?(contrast)?-?((?:\\d\\.?\\d*)|(?:[a-zA-Z]+))?\\s*}}([\"'])?", "g"),
+          r = c.colors.background.hues.default,
+          d = p[c.colors.background.name][r].contrastType;
+        t = t.replace(/'?"?{{\s*([a-zA-Z]+)-(A?\d+|hue-[0-3]|shadow|default)-?(contrast)?-?((?:\d\.?\d*)|(?:[a-zA-Z]+))?\s*}}'?"?/g, function(e, t, n, o, r) {
+          var i = t;
+          if ("foreground" === t) {
+            if ("shadow" === n) return c.foregroundShadow;
+            if (c.foregroundPalette[n]) return N(x(c.foregroundPalette[n]));
+            if (c.foregroundPalette[1]) return N(x(c.foregroundPalette[1]));
+            if (t = "background", o = "contrast", !r && n) switch (n) {
+              case "2":
+                r = "secondary";
+                break;
+              case "3":
+                r = "disabled";
+                break;
+              case "4":
+                r = "divider"
+            }
+            n = "default"
+          }
+          0 !== n.indexOf("hue") && "default" !== n || (n = c.colors[t].hues[n]);
+          var a = p[c.colors[t].name][n] || "";
+          if ("background" === t && o && "foreground" !== i && a.contrastType === d) switch (r) {
+            case "secondary":
+            case "icon":
+              if (c.foregroundPalette[2]) return N(x(c.foregroundPalette[2]));
+              break;
+            case "disabled":
+            case "hint":
+              if (c.foregroundPalette[3]) return N(x(c.foregroundPalette[3]));
+              break;
+            case "divider":
+              if (c.foregroundPalette[4]) return N(x(c.foregroundPalette[4]));
+              break;
+            default:
+              if (c.foregroundPalette[1]) return N(x(c.foregroundPalette[1]))
+          }
+          return o && r && (r = a.opacity[r] || r), N(a[o ? "contrast" : "value"], r)
+        });
+        var i = [];
+        return v.forEach(["default", "hue-1", "hue-2", "hue-3"], function(l) {
+          var e = t.replace(o, function(e, t, n, o, r, i) {
+            var a = c.colors[n],
+              d = p[a.name],
+              s = a.hues[l];
+            return r && i && (i = d[s].opacity[i] || i), N(d[s]["color" === o ? "value" : "contrast"], i)
+          });
+          "default" !== l && (e = e.replace(n, ".md-" + c.name + "-theme.md-" + l)), "default" === c.name && (e = e.replace(/((?:\s|>|\.|\w|-|:|\(|\)|\[|]|"|'|=)*)\.md-default-theme((?:\s|>|\.|\w|-|:|\(|\)|\[|]|"|'|=)*)/g, function(e, t, n) {
+            return e + ", " + t + n
+          })), i.push(e)
+        }), i
+      }
+      var _ = {};
+
+      function r(e, t) {
+        var n = document.head,
+          o = n ? n.firstElementChild : null,
+          r = !A.disableTheming && e.has("$MD_THEME_CSS") ? e.get("$MD_THEME_CSS") : "";
+        if (r += A.registeredStyles.join(""), o && 0 !== r.length) {
+          v.forEach(p, function(r) {
+            var i = r.contrastDefaultColor,
+              a = r.contrastLightColors || [],
+              d = r.contrastStrongLightColors || [],
+              s = r.contrastDarkColors || [];
+            "string" == typeof a && (a = a.split(" ")), "string" == typeof d && (d = d.split(" ")), "string" == typeof s && (s = s.split(" ")), delete r.contrastDefaultColor, delete r.contrastLightColors, delete r.contrastStrongLightColors, delete r.contrastDarkColors, v.forEach(r, function(e, t) {
+              if (!v.isObject(e)) {
+                var n = x(e);
+                if (!n) throw new Error("Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.".replace("%1", e).replace("%2", r.name).replace("%3", t));
+                var o = function(e) {
+                  return ("light" === i ? -1 !== s.indexOf(e) : -1 === a.indexOf(e) && -1 === d.indexOf(e)) ? "dark" : -1 !== d.indexOf(e) ? "strongLight" : "light"
+                }(t);
+                r[t] = {
+                  hex: r[t],
+                  value: n,
+                  contrastType: o,
+                  contrast: function(e) {
+                    switch (e) {
+                      default:
+                      case "strongLight":
+                        return b;
+                      case "light":
+                        return u;
+                      case "dark":
+                        return m
+                    }
+                  }(o),
+                  opacity: function(e) {
+                    switch (e) {
+                      default:
+                      case "strongLight":
+                        return C;
+                      case "light":
+                        return y;
+                      case "dark":
+                        return M
+                    }
+                  }(o)
+                }
+              }
+            })
+          });
+          var i = function(e) {
+            for (var t = [], n = "", o = 0, r = 0, i = 0; i < e.length; i++) {
+              var a = e.charAt(i);
+              if ("'" === a || '"' === a) {
+                var d = e.substring(i, e.indexOf(a, i + 1));
+                n += d, i += d.length
+              } else n += a, "}" === a ? ++r === o && (o = r = 0, t.push(n), n = "") : "{" === a && o++
+            }
+            return "" !== n && t.push(n), t
+          }(r).map(function(e) {
+            return e.trim()
+          });
+          g.forEach(function(e) {
+            _[e] = ""
+          }), i.forEach(function(e) {
+            for (var t, n = 0; t = g[n]; n++)
+              if (-1 < e.indexOf(".md-" + t)) return _[t] += e;
+            for (n = 0; t = g[n]; n++)
+              if (-1 < e.indexOf(t)) return _[t] += e;
+            return _[a] += e
+          }), A.generateOnDemand || v.forEach(t.THEMES, function(e) {
+            s[e.name] || "default" !== t.defaultTheme() && "default" === e.name || k(e, e.name, A.nonce)
+          })
+        }
+      }
+
+      function k(r, e, i) {
+        var a = document.head,
+          d = a ? a.firstElementChild : null;
+        s[e] || (g.forEach(function(e) {
+          for (var t = w(r, e, _[e]); t.length;) {
+            var n = t.shift();
+            if (n) {
+              var o = document.createElement("style");
+              o.setAttribute("md-theme-style", ""), i && o.setAttribute("nonce", i), o.appendChild(document.createTextNode(n)), a.insertBefore(o, d)
+            }
+          }
+        }), s[r.name] = !0)
+      }
+
+      function x(e) {
+        if (v.isArray(e) && 3 === e.length) return e;
+        if (/^rgb/.test(e)) return e.replace(/(^\s*rgba?\(|\)\s*$)/g, "").split(",").map(function(e, t) {
+          return 3 === t ? parseFloat(e) : parseInt(e, 10)
+        });
+        if ("#" === e.charAt(0) && (e = e.substring(1)), /^([a-fA-F0-9]{3}){1,2}$/g.test(e)) {
+          var t = e.length / 3,
+            n = e.substr(0, t),
+            o = e.substr(t, t),
+            r = e.substr(2 * t);
+          return 1 == t && (n += n, o += o, r += r), [parseInt(n, 16), parseInt(o, 16), parseInt(r, 16)]
+        }
+      }
+
+      function N(e, t) {
+        return e ? (4 === e.length && (e = v.copy(e), t ? e.pop() : t = e.pop()), t && ("number" == typeof t || "string" == typeof t && t.length) ? "rgba(" + e.join(",") + "," + t + ")" : "rgb(" + e.join(",") + ")") : "rgb('0,0,0')"
+      }
+    }(L.angular), be.module("material.components.autocomplete", ["material.core", "material.components.icon", "material.components.virtualRepeat"]),
+    function() {
+      e.$inject = ["$scope", "$element", "$mdUtil", "$mdConstant", "$mdTheming", "$window", "$animate", "$rootElement", "$attrs", "$q", "$log", "$mdLiveAnnouncer"], be.module("material.components.autocomplete").controller("MdAutocompleteCtrl", e);
+      var ce = 48,
+        me = 5,
+        ue = 8,
+        pe = 2,
+        he = "standard",
+        fe = "virtual";
+
+      function e(p, h, f, t, e, n, o, r, b, a, i, d) {
+        var s, l, c, m = this,
+          u = p.itemsExpr.split(/ in /i),
+          g = u[1],
+          E = null,
+          v = {},
+          $ = !1,
+          M = [],
+          y = !1,
+          C = 0,
+          T = null,
+          A = null,
+          w = f.debounce(function() {
+            m.hidden || S()
+          }),
+          _ = fe;
+        m.documentElement = be.element(document.documentElement), s = "hidden", l = function(e, t) {
+          var n;
+          E && (n = be.element(E.scrollContainer));
+          !e && t ? (S(), oe(!0, x.Count | x.Selected), E && (f.disableScrollAround(E.scrollContainer), T = function(e) {
+            var t = be.element(e);
+            return t.on("wheel touchmove", O),
+              function() {
+                t.off("wheel touchmove", O)
+              }
+          }(E.wrap), f.isIos && (m.documentElement.on("touchend", L), n && n.on("touchstart touchmove touchend", P)), m.index = V(), f.nextTick(function() {
+            H(), re()
+          }))) : e && !t && (f.isIos && (m.documentElement.off("touchend", L), n && n.off("touchstart touchmove touchend", P)), f.enableScrolling(), T && (T(), T = null))
+        }, c = !0, Object.defineProperty(m, s, {
+          get: function() {
+            return c
+          },
+          set: function(e) {
+            var t = c;
+            l(c = e, t)
+          }
+        }), m.scope = p, m.parent = p.$parent, m.itemName = u[0], m.matches = [], m.loading = !1, m.hidden = !0, m.index = -1, m.activeOption = null, m.id = f.nextUid(), m.isDisabled = null, m.isRequired = null, m.isReadonly = null, m.hasNotFound = !1, m.selectedMessage = p.selectedMessage || "selected", m.noMatchMessage = p.noMatchMessage || "There are no matches available.", m.singleMatchMessage = p.singleMatchMessage || "There is 1 match available.", m.multipleMatchStartMessage = p.multipleMatchStartMessage || "There are ", m.multipleMatchEndMessage = p.multipleMatchEndMessage || " matches available.", m.defaultEscapeOptions = "clear", m.keydown = function(e) {
+          switch (e.keyCode) {
+            case t.KEY_CODE.DOWN_ARROW:
+              if (m.loading || Z()) return;
+              e.stopPropagation(), e.preventDefault(), m.index = m.index + 1 > m.matches.length - 1 ? 0 : Math.min(m.index + 1, m.matches.length - 1), f.nextTick(H), re();
+              break;
+            case t.KEY_CODE.UP_ARROW:
+              if (m.loading || Z()) return;
+              e.stopPropagation(), e.preventDefault(), m.index = m.index - 1 < 0 ? m.matches.length - 1 : Math.max(0, m.index - 1), f.nextTick(H), re();
+              break;
+            case t.KEY_CODE.TAB:
+              if (R(), m.hidden || m.loading || m.index < 0 || m.matches.length < 1) return;
+              ee(m.index);
+              break;
+            case t.KEY_CODE.ENTER:
+              if (m.hidden || m.loading || m.index < 0 || m.matches.length < 1) return;
+              if (Z()) return;
+              e.stopImmediatePropagation(), e.preventDefault(), ee(m.index);
+              break;
+            case t.KEY_CODE.ESCAPE:
+              if (e.preventDefault(), !(G("blur") || !m.hidden || m.loading || G("clear") && p.searchText)) return;
+              e.stopPropagation(), te(), p.searchText && G("clear") && ne(), m.hidden = !0, G("blur") && U(!0)
+          }
+        }, m.blur = function(e) {
+          y = !1, $ ? be.isObject(e) && e.stopImmediatePropagation() : (m.hidden = Y(), le("ngBlur", {
+            $event: e
+          }))
+        }, m.focus = function(e) {
+          y = !0, K() && J() && de();
+          m.hidden = Y(), le("ngFocus", {
+            $event: e
+          })
+        }, m.clear = function(e) {
+          e && e.stopPropagation();
+          te(), ne()
+        }, m.select = ee, m.listEnter = function() {
+          $ = !0
+        }, m.listLeave = R, m.focusInput = D, m.getCurrentDisplayValue = Q, m.registerSelectedItemWatcher = function(e) {
+          -1 === M.indexOf(e) && M.push(e)
+        }, m.unregisterSelectedItemWatcher = function(e) {
+          var t = M.indexOf(e); - 1 !== t && M.splice(t, 1)
+        }, m.notFoundVisible = ae, m.loadingIsVisible = function() {
+          return m.loading && !Z()
+        }, m.positionDropdown = S;
+        var k, x = {
+          Count: 1,
+          Selected: 2
+        };
+        return f.initOptionalProperties(p, b, {
+          searchText: "",
+          selectedItem: null,
+          clearButton: !1,
+          disableVirtualRepeat: !1
+        }), e(h), k = parseInt(p.delay, 10) || 0, b.$observe("disabled", function(e) {
+          m.isDisabled = f.parseAttributeBoolean(e, !1)
+        }), b.$observe("required", function(e) {
+          m.isRequired = f.parseAttributeBoolean(e, !1)
+        }), b.$observe("readonly", function(e) {
+          m.isReadonly = f.parseAttributeBoolean(e, !1)
+        }), p.$watch("searchText", k ? f.debounce(B, k) : B), p.$watch("selectedItem", F), be.element(n).on("resize", w), void p.$on("$destroy", I), void f.nextTick(function() {
+          ! function() {
+            var e = function() {
+              var e, t;
+              for (e = h; e.length && (t = e.attr("md-autocomplete-snap"), !be.isDefined(t)); e = e.parent());
+              if (e.length) return {
+                snap: e[0],
+                wrap: "width" === t.toLowerCase() ? e[0] : h.find("md-autocomplete-wrap")[0]
+              };
+              var n = h.find("md-autocomplete-wrap")[0];
+              return {
+                snap: n,
+                wrap: n
+              }
+            }();
+            (E = {
+              main: h[0],
+              scrollContainer: h[0].querySelector(".md-virtual-repeat-container, .md-standard-list-container"),
+              scroller: h[0].querySelector(".md-virtual-repeat-scroller, .md-standard-list-scroller"),
+              ul: h.find("ul")[0],
+              input: h.find("input")[0],
+              wrap: e.wrap,
+              snap: e.snap,
+              root: document.body
+            }).li = E.ul.getElementsByTagName("li"), E.$ = function(e) {
+              var t = {};
+              for (var n in e) e.hasOwnProperty(n) && (t[n] = be.element(e[n]));
+              return t
+            }(E), _ = E.scrollContainer.classList.contains("md-standard-list-container") ? he : fe, A = E.$.input.controller("ngModel")
+        });
+
+        function N() {
+          p.requireMatch && A && A.$setValidity("md-require-match", !!p.selectedItem || !p.searchText)
+        }
+
+        function S() {
+          if (!E) return f.nextTick(S, !1, p);
+          var e, t = (p.dropdownItems || me) * ce,
+            n = E.wrap.getBoundingClientRect(),
+            o = E.snap.getBoundingClientRect(),
+            r = E.root.getBoundingClientRect(),
+            i = o.bottom - r.top,
+            a = r.bottom - o.top,
+            d = n.left - r.left,
+            s = n.width,
+            l = function() {
+              var e = 0,
+                t = h.find("md-input-container");
+              if (t.length) {
+                var n = t.find("input");
+                e = t.prop("offsetHeight"), e -= n.prop("offsetTop"), e -= n.prop("offsetHeight"), e += t.prop("offsetTop")
+              }
+              return e
+            }(),
+            c = p.dropdownPosition,
+            m = r.bottom - o.bottom - ue + f.getViewportTop(),
+            u = o.top - ue;
+          c = c || (t < m ? "bottom" : t < u ? "top" : m < u ? "top" : "bottom"), b.mdFloatingLabel && (d += pe, s -= 2 * pe), e = {
+            left: d + "px",
+            minWidth: s + "px",
+            maxWidth: Math.max(n.right - r.left, r.right - n.left) - ue + "px"
+          }, "top" === c ? (e.top = "auto", e.bottom = a + "px", e.maxHeight = Math.min(t, u) + "px") : (m = r.bottom - n.bottom - ue + f.getViewportTop(), e.top = i - l + "px", e.bottom = "auto", e.maxHeight = Math.min(t, m) + "px"), E.$.scrollContainer.css(e), f.nextTick(function() {
+            var e = E.scrollContainer.getBoundingClientRect(),
+              t = {};
+            e.right > r.right && (t.left = n.right - e.width + "px");
+            E.$.scrollContainer.css(t)
+          }, !1, p)
+        }
+
+        function D() {
+          E.input.focus()
+        }
+
+        function H() {
+          var e = E.scroller.querySelector(".selected");
+          m.activeOption = e ? e.id : null
+        }
+
+        function I() {
+          if (m.hidden || f.enableScrolling(), be.element(n).off("resize", w), E) {
+            be.forEach(["ul", "scroller", "scrollContainer", "input"], function(e) {
+              E.$[e].remove()
+            })
+          }
+        }
+
+        function O(e) {
+          e.preventDefault()
+        }
+
+        function P(e) {
+          e.stopPropagation()
+        }
+
+        function L(e) {
+          U(m.hidden = !0)
+        }
+
+        function R() {
+          y || m.hidden || E.input.focus(), $ = !1, m.hidden = Y()
+        }
+
+        function F(t, n) {
+          N(), t ? z(t).then(function(e) {
+            p.searchText = e,
+              function(t, n) {
+                M.forEach(function(e) {
+                  e(t, n)
+                })
+              }(t, n)
+          }) : n && p.searchText && z(n).then(function(e) {
+            be.isString(p.searchText) && e.toString().toLowerCase() === p.searchText.toLowerCase() && (p.searchText = "")
+          }), t !== n && be.isFunction(p.itemChange) && p.itemChange(q(p.selectedItem))
+        }
+
+        function B(t, n) {
+          m.index = V(), t !== n && (N(), z(p.selectedItem).then(function(e) {
+            t !== e && (p.selectedItem = null, t !== n && be.isFunction(p.textChange) && p.textChange(), J() ? de() : (W(!(m.matches = [])), oe(!0, x.Count)))
+          }))
+        }
+
+        function U(e) {
+          e && (y = $ = !1), E.input.blur()
+        }
+
+        function j() {
+          return be.isNumber(p.minLength) ? p.minLength : 1
+        }
+
+        function z(e) {
+          return a.when(((t = e) && p.itemText ? p.itemText(q(t)) : null) || e).then(function(e) {
+            return e && !be.isString(e) && i.warn("md-autocomplete: Could not resolve display value to a string. Please check the `md-item-text` attribute."), e
+          });
+          var t
+        }
+
+        function q(e) {
+          if (!e) return ge;
+          var t = {};
+          return m.itemName && (t[m.itemName] = e), t
+        }
+
+        function V() {
+          return p.autoselect ? 0 : -1
+        }
+
+        function W(e) {
+          m.loading !== e && (m.loading = e), m.hidden = Y()
+        }
+
+        function Y() {
+          return ! function() {
+            {
+              if (m.isReadonly) return !1;
+              if (!K()) return !1
+            }
+            return J() && X() || ae()
+          }()
+        }
+
+        function K() {
+          return !(m.loading && !X()) && (!Z() && !!y)
+        }
+
+        function G(e) {
+          return be.isString(p.escapeOptions) ? -1 !== p.escapeOptions.toLowerCase().indexOf(e) : -1 !== m.defaultEscapeOptions.indexOf(e)
+        }
+
+        function X() {
+          return !!m.matches.length
+        }
+
+        function Z() {
+          return !!m.scope.selectedItem
+        }
+
+        function Q() {
+          return z(m.matches[m.index])
+        }
+
+        function J() {
+          return (p.searchText || "").length >= j()
+        }
+
+        function ee(e) {
+          f.nextTick(function() {
+            z(m.matches[e]).then(function(e) {
+              var t = E.$.input.controller("ngModel");
+              d.announce(e + " " + m.selectedMessage, "assertive"), t.$setViewValue(e), t.$render()
+            }).finally(function() {
+              p.selectedItem = m.matches[e], W(!1)
+            })
+          }, !1)
+        }
+
+        function te() {
+          m.index = -1, f.nextTick(H), m.matches = []
+        }
+
+        function ne() {
+          W(!0), p.searchText = "";
+          var e = document.createEvent("CustomEvent");
+          e.initCustomEvent("change", !0, !0, {
+            value: ""
+          }), E.input.dispatchEvent(e), E.input.blur(), p.searchText = "", E.input.focus()
+        }
+
+        function oe(e, t) {
+          var n = e ? "polite" : "assertive",
+            o = [];
+          t & x.Selected && -1 !== m.index && o.push(Q()), t & x.Count && o.push(a.resolve(function() {
+            switch (m.matches.length) {
+              case 0:
+                return m.noMatchMessage;
+              case 1:
+                return m.singleMatchMessage;
+              default:
+                return m.multipleMatchStartMessage + m.matches.length + m.multipleMatchEndMessage
+            }
+          }())), a.all(o).then(function(e) {
+            d.announce(e.join(" "), n)
+          })
+        }
+
+        function re() {
+          E.li[0] && (_ === he ? function() {
+            var e = E.li[Math.max(0, m.index)],
+              t = E.scrollContainer.offsetHeight,
+              n = e && e.offsetTop || 0,
+              o = n + e.clientHeight,
+              r = E.scrollContainer.scrollTop;
+            n < r ? ie(n) : r + t < o && ie(o - t)
+          }() : function() {
+            var e = E.li[0].offsetHeight,
+              t = e * Math.max(0, m.index),
+              n = t + e,
+              o = E.scroller.clientHeight,
+              r = E.scroller.scrollTop;
+            t < r ? ie(t) : r + o < n && ie(n - o)
+          }())
+        }
+
+        function ie(e) {
+          _ === he ? E.scrollContainer.scrollTop = e : E.$.scrollContainer.controller("mdVirtualRepeatContainer").scrollTo(e)
+        }
+
+        function ae() {
+          var e = (m.scope.searchText || "").length;
+          return m.hasNotFound && !X() && (!m.loading || 0 !== C) && e >= j() && (y || $) && !Z()
+        }
+
+        function de() {
+          var e = p.searchText || "",
+            t = e.toLowerCase();
+          !p.noCache && v[t] ? se(v[t]) : function(t) {
+            var e = p.$parent.$eval(g),
+              n = t.toLowerCase(),
+              o = be.isArray(e),
+              r = !!e.then;
+
+            function i(e) {
+              v[n] = e, (t || "") === (p.searchText || "") && se(e)
+            }
+            o ? i(e) : r && function(e) {
+              if (!e) return;
+              e = a.when(e), C++, W(!0), f.nextTick(function() {
+                e.then(i).finally(function() {
+                  0 == --C && W(!1)
+                })
+              }, !0, p)
+            }(e)
+          }(e), m.hidden = Y()
+        }
+
+        function se(e) {
+          m.matches = e, m.hidden = Y(), m.loading && W(!1), p.selectOnMatch && function() {
+            var n = p.searchText,
+              e = m.matches,
+              t = e[0];
+            1 === e.length && z(t).then(function(e) {
+              var t = n === e;
+              p.matchInsensitive && !t && (t = n.toLowerCase() === e.toLowerCase()), t && ee(0)
+            })
+          }(), S(), oe(!0, x.Count)
+        }
+
+        function le(e, t) {
+          b[e] && p.$parent.$eval(b[e], t || {})
+        }
+      }
+    }(), Z.$inject = ["$$mdSvgRegistry"], be.module("material.components.autocomplete").directive("mdAutocomplete", Z), Q.$inject = ["$compile", "$mdUtil"], be.module("material.components.autocomplete").directive("mdAutocompleteParentScope", Q), J.$inject = ["$scope", "$element", "$attrs", "$mdUtil"], be.module("material.components.autocomplete").controller("MdHighlightCtrl", J), J.prototype.init = function(t, n) {
+      this.flags = this.$attrs.mdHighlightFlags || "", this.unregisterFn = this.$scope.$watch(function(e) {
+        return {
+          term: t(e),
+          contentText: n(e)
+        }
+      }.bind(this), this.onRender.bind(this), !0), this.$element.on("$destroy", this.unregisterFn)
+    }, J.prototype.onRender = function(e, t) {
+      var n = e.contentText;
+      null !== this.regex && e.term === t.term || (this.regex = this.createRegex(e.term, this.flags)), e.term ? this.applyRegex(n) : this.$element.text(n)
+    }, J.prototype.applyRegex = function(e) {
+      var t = this.resolveTokens(e);
+      this.$element.empty(), t.forEach(function(e) {
+        if (e.isMatch) {
+          var t = be.element('<span class="highlight">').text(e.text);
+          this.$element.append(t)
+        } else this.$element.append(document.createTextNode(e))
+      }.bind(this))
+    }, J.prototype.resolveTokens = function(o) {
+      var r = [],
+        n = 0;
+      return o.replace(this.regex, function(e, t) {
+        i(n, t), r.push({
+          text: e,
+          isMatch: !0
+        }), n = t + e.length
+      }), i(n), r;
+
+      function i(e, t) {
+        var n = o.slice(e, t);
+        n && r.push(n)
+      }
+    }, J.prototype.createRegex = function(e, t) {
+      var n = "",
+        o = "",
+        r = this.$mdUtil.sanitize(e);
+      return 0 <= t.indexOf("^") && (n = "^"), 0 <= t.indexOf("$") && (o = "$"), new RegExp(n + r + o, t.replace(/[$^]/g, ""))
+    }, ee.$inject = ["$interpolate", "$parse"], be.module("material.components.autocomplete").directive("mdHighlightText", ee), be.module("material.components.backdrop", ["material.core"]).directive("mdBackdrop", ["$mdTheming", "$mdUtil", "$animate", "$rootElement", "$window", "$log", "$$rAF", "$document", function(a, d, t, s, l, c, m, u) {
+      return {
+        restrict: "E",
+        link: function(n, o, e) {
+          var r;
+
+          function i() {
+            var e = parseInt(r.height, 10) + Math.abs(parseInt(r.top, 10));
+            o.css("height", e + "px")
+          }
+          t.pin && t.pin(o, s), m(function() {
+            if ("fixed" === (r = l.getComputedStyle(u[0].body)).position) {
+              var e = d.debounce(function() {
+                r = l.getComputedStyle(u[0].body), i()
+              }, 60, null, !1);
+              i(), be.element(l).on("resize", e), n.$on("$destroy", function() {
+                be.element(l).off("resize", e)
+              })
+            }
+            var t = o.parent();
+            t.length && ("BODY" === t[0].nodeName && o.css("position", "fixed"), "static" === l.getComputedStyle(t[0]).position && c.warn("<md-backdrop> may not work properly in a scrolled, static-positioned parent container."), a.inherit(o, t))
+          })
+        }
+      }
+      this.parentController = e, this.enableChipEdit = this.parentController.enableChipEdit, this.enableChipEdit && (this.$element.on("keydown", this.chipKeyDown.bind(this)), this.$element.on("dblclick", this.chipMouseDoubleClick.bind(this)), this.getChipContent().addClass("_md-chip-content-edit-is-enabled"))
+    }, de.prototype.getChipContent = function() {
+      var e = this.$element[0].getElementsByClassName("md-chip-content");
+      return be.element(e[0])
+    }, de.prototype.getContentElement = function() {
+      var e = be.element(this.getChipContent().children()[0]);
+      return e && 0 !== e.length || (e = be.element(this.getChipContent().contents()[0])), e
+    }, de.prototype.getChipIndex = function() {
+      return parseInt(this.$element.attr("index"))
+    }, de.prototype.goOutOfEditMode = function() {
+      if (this.isEditing) {
+        this.isEditing = !1, this.$element.removeClass("_md-chip-editing"), this.getChipContent()[0].contentEditable = "false";
+        var e = this.getChipIndex(),
+          t = this.getContentElement().text();
+        t ? (this.parentController.updateChipContents(e, t), this.$mdUtil.nextTick(function() {
+          this.parentController.selectedChip === e && this.parentController.focusChip(e)
+        }.bind(this))) : this.parentController.removeChipAndFocusInput(e)
+      }
+    }, de.prototype.selectNodeContents = function(e) {
+      var t, n;
+      document.body.createTextRange ? ((t = document.body.createTextRange()).moveToElementText(e), t.select()) : L.getSelection && (n = L.getSelection(), (t = document.createRange()).selectNodeContents(e), n.removeAllRanges(), n.addRange(t))
+    }, de.prototype.goInEditMode = function() {
+      this.isEditing = !0, this.$element.addClass("_md-chip-editing"), this.getChipContent()[0].contentEditable = "true", this.getChipContent().on("blur", function() {
+        this.goOutOfEditMode()
+      }.bind(this)), this.selectNodeContents(this.getChipContent()[0])
+    }, de.prototype.chipKeyDown = function(e) {
+      this.isEditing || e.keyCode !== this.$mdConstant.KEY_CODE.ENTER && e.keyCode !== this.$mdConstant.KEY_CODE.SPACE ? this.isEditing && e.keyCode === this.$mdConstant.KEY_CODE.ENTER && (e.preventDefault(), this.goOutOfEditMode()) : (e.preventDefault(), this.goInEditMode())
+    }, de.prototype.chipMouseDoubleClick = function() {
+      this.enableChipEdit && !this.isEditing && this.goInEditMode()
+    }, se.$inject = ["$mdTheming", "$mdUtil", "$compile", "$timeout"], be.module("material.components.chips").directive("mdChip", se), le.$inject = ["$timeout"], be.module("material.components.chips").directive("mdChipRemove", le), ce.$inject = ["$compile"], be.module("material.components.chips").directive("mdChipTransclude", ce),
+    function() {
+      e.$inject = ["$scope", "$attrs", "$mdConstant", "$log", "$element", "$timeout", "$mdUtil", "$mdLiveAnnouncer", "$exceptionHandler"];
+      var l = 300;
+
+      function e(e, t, n, o, r, i, a, d, s) {
+        this.$timeout = i, this.$mdConstant = n, this.$scope = e, this.parent = e.$parent, this.$mdUtil = a, this.$log = o, this.$mdLiveAnnouncer = d, this.$exceptionHandler = s, this.$element = r, this.$attrs = t, this.ngModelCtrl = null, this.userInputNgModelCtrl = null, this.autocompleteCtrl = null, this.userInputElement = null, this.items = [], this.selectedChip = -1, this.enableChipEdit = a.parseAttributeBoolean(t.mdEnableChipEdit), this.addOnBlur = a.parseAttributeBoolean(t.mdAddOnBlur), this.inputClass = "", this.inputAriaLabel = "Chips input.", this.containerHint = "Chips container. Use arrow keys to select chips.", this.containerEmptyHint = "Chips container. Enter the text area, then type text, and press enter to add a chip.", this.deleteHint = "Press delete to remove this chip.", this.deleteButtonLabel = "Remove", this.chipBuffer = "", this.useTransformChip = !1, this.useOnAdd = !1, this.useOnRemove = !1, this.wrapperId = "", this.contentIds = [], this.ariaTabIndex = null, this.chipAppendDelay = l, this.deRegister = [], this.addedMessage = "added", this.removedMessage = "removed", this.init()
+      }
+      be.module("material.components.chips").controller("MdChipsCtrl", e), e.prototype.init = function() {
+        var t = this;
+        this.wrapperId = "_md-chips-wrapper-" + this.$mdUtil.nextUid(), this.$element.attr("ng-model") || this.setupStaticChips(), this.deRegister.push(this.$scope.$watchCollection("$mdChipsCtrl.items", function() {
+          t.setupInputAria(), t.setupWrapperAria()
+        })), this.deRegister.push(this.$attrs.$observe("mdChipAppendDelay", function(e) {
+          t.chipAppendDelay = parseInt(e) || l
+        }))
+      }, e.prototype.$onDestroy = function() {
+        for (var e; e = this.deRegister.pop();) e.call(this)
+      }, e.prototype.setupInputAria = function() {
+        var e = this.$element.find("input");
+        e && (e.attr("role", "textbox"), e.attr("aria-multiline", !0), this.inputAriaDescribedBy && e.attr("aria-describedby", this.inputAriaDescribedBy), this.inputAriaLabelledBy ? (e.attr("aria-labelledby", this.inputAriaLabelledBy), e.removeAttr("aria-label")) : e.attr("aria-label", this.inputAriaLabel))
+      }, e.prototype.setupWrapperAria = function() {
+        var e = this,
+          t = this.$element.find("md-chips-wrap");
+        this.items && this.items.length ? (t.attr("role", "listbox"), this.contentIds = this.items.map(function() {
+          return e.wrapperId + "-chip-" + e.$mdUtil.nextUid()
+        }), t.attr("aria-owns", this.contentIds.join(" ")), t.attr("aria-label", this.containerHint)) : (t.removeAttr("role"), t.removeAttr("aria-owns"), t.attr("aria-label", this.containerEmptyHint))
+      }, e.prototype.setupStaticChips = function() {
+        var e, t, n = this,
+          o = this.$element.find("md-chips-wrap");
+        this.$timeout(function() {
+          for (o.attr("role", "list"), t = o[0].children, e = 0; e < t.length; e++) t[e].setAttribute("role", "listitem"), t[e].setAttribute("aria-setsize", t.length);
+          n.inputAriaDescribedBy && o.attr("aria-describedby", n.inputAriaDescribedBy), n.inputAriaLabelledBy ? (o.attr("aria-labelledby", n.inputAriaLabelledBy), o.removeAttr("aria-label")) : o.attr("aria-label", n.inputAriaLabel)
+        }, 10)
+      }, e.prototype.inputKeydown = function(e) {
+        var t = this.getChipBuffer();
+        if (!(this.autocompleteCtrl && e.isDefaultPrevented && e.isDefaultPrevented())) {
+          if (e.keyCode === this.$mdConstant.KEY_CODE.BACKSPACE) {
+            if (0 !== this.getCursorPosition(e.target)) return;
+            return e.preventDefault(), e.stopPropagation(), void(this.items.length && this.selectAndFocusChipSafe(this.items.length - 1))
+          }
+          if ((!this.separatorKeys || this.separatorKeys.length < 1) && (this.separatorKeys = [this.$mdConstant.KEY_CODE.ENTER]), -1 !== this.separatorKeys.indexOf(e.keyCode)) {
+            if (this.autocompleteCtrl && this.requireMatch || !t) return;
+            if (e.preventDefault(), this.hasMaxChipsReached()) return;
+            return this.appendChip(t.trim()), this.resetChipBuffer(), !1
+          }
+        }
+      }, e.prototype.getCursorPosition = function(t) {
+        try {
+          if (t.selectionStart === t.selectionEnd) return t.selectionStart
+        } catch (e) {
+          if (!t.value) return 0
+        }
+      }, e.prototype.updateChipContents = function(e, t) {
+        0 <= e && e < this.items.length && (this.items[e] = t, this.updateNgModel(!0))
+      }, e.prototype.isEditingChip = function() {
+        return !!this.$element[0].querySelector("._md-chip-editing")
+      }, e.prototype._isChipObject = function(e) {
+        return be.isObject(e)
+      }, e.prototype.isRemovable = function() {
+        return !!this.ngModelCtrl && (this.readonly ? this.removable : !be.isDefined(this.removable) || this.removable)
+      }, e.prototype.chipKeydown = function(e) {
+        if (!this.getChipBuffer() && !this.isEditingChip()) switch (e.keyCode) {
+          case this.$mdConstant.KEY_CODE.BACKSPACE:
+          case this.$mdConstant.KEY_CODE.DELETE:
+            if (this.selectedChip < 0) return;
+            if (e.preventDefault(), !this.isRemovable()) return;
+            this.removeAndSelectAdjacentChip(this.selectedChip, e);
+            break;
+          case this.$mdConstant.KEY_CODE.LEFT_ARROW:
+            e.preventDefault(), (this.selectedChip < 0 || this.readonly && 0 === this.selectedChip) && (this.selectedChip = this.items.length), this.items.length && this.selectAndFocusChipSafe(this.selectedChip - 1);
+            break;
+          case this.$mdConstant.KEY_CODE.RIGHT_ARROW:
+            e.preventDefault(), this.selectAndFocusChipSafe(this.selectedChip + 1);
+            break;
+          case this.$mdConstant.KEY_CODE.ESCAPE:
+          case this.$mdConstant.KEY_CODE.TAB:
+            if (this.selectedChip < 0) return;
+            e.preventDefault(), this.onFocus()
+        }
+      }, e.prototype.getPlaceholder = function() {
+        return this.items && this.items.length && ("" === this.secondaryPlaceholder || this.secondaryPlaceholder) ? this.secondaryPlaceholder : this.placeholder
+      }, e.prototype.removeAndSelectAdjacentChip = function(e, t) {
+        var n = this,
+          o = n.getAdjacentChipIndex(e);
+        this.$element[0].querySelector("md-chips-wrap"), this.$element[0].querySelector('md-chip[index="' + e + '"]');
+        n.removeChip(e, t), n.$timeout(function() {
+          n.$timeout(function() {
+            n.selectAndFocusChipSafe(o)
+          })
+        })
+      }, e.prototype.resetSelectedChip = function() {
+        this.selectedChip = -1, this.ariaTabIndex = null
+      }, e.prototype.getAdjacentChipIndex = function(e) {
+        var t = this.items.length - 1;
+        return 0 == t ? -1 : e === t ? e - 1 : e
+      }, e.prototype.appendChip = function(t) {
+        if (this.shouldFocusLastChip = !this.addOnBlur, this.useTransformChip && this.transformChip) {
+          var e = this.transformChip({
+            $chip: t
+          });
+          be.isDefined(e) && (t = e)
+        }
+        if (be.isObject(t) && this.items.some(function(e) {
+            return be.equals(t, e)
+          })) return;
+        if (!(null == t || this.items.indexOf(t) + 1)) {
+          var n = this.items.push(t) - 1;
+          this.updateNgModel();
+          var o = be.isObject(t) ? "" : t;
+          this.$mdLiveAnnouncer.announce(o + " " + this.addedMessage, "assertive"), this.useOnAdd && this.onAdd && this.onAdd({
+            $chip: t,
+            $index: n
+          })
+        }
+      }, e.prototype.useTransformChipExpression = function() {
+        this.useTransformChip = !0
+      }, e.prototype.useOnAddExpression = function() {
+        this.useOnAdd = !0
+      }, e.prototype.useOnRemoveExpression = function() {
+        this.useOnRemove = !0
+      }, e.prototype.useOnSelectExpression = function() {
+        this.useOnSelect = !0
+      }, e.prototype.getChipBuffer = function() {
+        var e = this.userInputElement ? this.userInputNgModelCtrl ? this.userInputNgModelCtrl.$viewValue : this.userInputElement[0].value : this.chipBuffer;
+        return be.isString(e) ? e : ""
+      }, e.prototype.resetChipBuffer = function() {
+        this.userInputElement ? this.userInputNgModelCtrl ? (this.userInputNgModelCtrl.$setViewValue(""), this.userInputNgModelCtrl.$render()) : this.userInputElement[0].value = "" : this.chipBuffer = ""
+      }, e.prototype.hasMaxChipsReached = function() {
+        return be.isString(this.maxChips) && (this.maxChips = parseInt(this.maxChips, 10) || 0), 0 < this.maxChips && this.items.length >= this.maxChips
+      }, e.prototype.validateModel = function() {
+        this.ngModelCtrl.$setValidity("md-max-chips", !this.hasMaxChipsReached()), this.ngModelCtrl.$validate()
+      }, e.prototype.updateNgModel = function(e) {
+        e || this.validateModel(), be.forEach(this.ngModelCtrl.$viewChangeListeners, function(e) {
+          try {
+            e()
+          } catch (e) {
+            this.$exceptionHandler(e)
+          }
+        })
+      }, e.prototype.removeChip = function(e, t) {
+        var n = this.items.splice(e, 1);
+        this.updateNgModel(), this.ngModelCtrl.$setDirty();
+        var o = be.isObject(n[0]) ? "" : n[0];
+        this.$mdLiveAnnouncer.announce(o + " " + this.removedMessage, "assertive"), n && n.length && this.useOnRemove && this.onRemove && this.onRemove({
+          $chip: n[0],
+          $index: e,
+          $event: t
+        })
+      }, e.prototype.removeChipAndFocusInput = function(e, t) {
+        this.removeChip(e, t), this.autocompleteCtrl ? (this.autocompleteCtrl.hidden = !0, this.$mdUtil.nextTick(this.onFocus.bind(this))) : this.onFocus()
+      }, e.prototype.selectAndFocusChipSafe = function(e) {
+        if (!this.items.length || -1 === e) return this.focusInput();
+        if (e >= this.items.length) {
+          if (!this.readonly) return this.onFocus();
+          e = 0
+        }
+        e = Math.max(e, 0), e = Math.min(e, this.items.length - 1), this.selectChip(e), this.focusChip(e)
+      }, e.prototype.focusLastChipThenInput = function() {
+        var e = this;
+        e.shouldFocusLastChip = !1, e.focusChip(this.items.length - 1), e.$timeout(function() {
+          e.focusInput()
+        }, e.chipAppendDelay)
+      }, e.prototype.focusInput = function() {
+        this.selectChip(-1), this.onFocus()
+      }, e.prototype.selectChip = function(e) {
+        -1 <= e && e <= this.items.length ? (this.selectedChip = e, this.useOnSelect && this.onSelect && this.onSelect({
+          $chip: this.items[e]
+        })) : this.$log.warn("Selected Chip index out of bounds; ignoring.")
+      }, e.prototype.focusChip = function(e) {
+        var t = this.$element[0].querySelector('md-chip[index="' + e + '"] .md-chip-content');
+        this.ariaTabIndex = e, t.focus()
+      }, e.prototype.configureNgModel = function(e) {
+        this.ngModelCtrl = e;
+        var t = this;
+        e.$isEmpty = function(e) {
+          return !e || 0 === e.length
+        }, e.$render = function() {
+          t.items = t.ngModelCtrl.$viewValue
+        }
+      }, e.prototype.onFocus = function() {
+        var e = this.$element[0].querySelector("input");
+        e && e.focus(), this.resetSelectedChip()
+      }, e.prototype.onInputFocus = function() {
+        this.inputHasFocus = !0, this.setupInputAria(), this.resetSelectedChip()
+      }, e.prototype.onInputBlur = function() {
+        this.inputHasFocus = !1, this.shouldAddOnBlur() && (this.appendChip(this.getChipBuffer().trim()), this.resetChipBuffer())
+      }, e.prototype.configureInput = function(e) {
+        var t = e.controller("ngModel"),
+          n = this;
+        t && (this.deRegister.push(this.$scope.$watch(function() {
+          return t.$touched
+        }, function(e) {
+          e && n.ngModelCtrl.$setTouched()
+        })), this.deRegister.push(this.$scope.$watch(function() {
+          return t.$dirty
+        }, function(e) {
+          e && n.ngModelCtrl.$setDirty()
+        })))
+      }, e.prototype.configureUserInput = function(e) {
+        var t = (this.userInputElement = e).controller("ngModel");
+        t !== this.ngModelCtrl && (this.userInputNgModelCtrl = t);
+
+        function n(e, t) {
+          o.$evalAsync(be.bind(r, t, e))
+        }
+        var o = this.$scope,
+          r = this;
+        e.attr({
+          tabindex: 0
+        }).on("keydown", function(e) {
+          n(e, r.inputKeydown)
+        }).on("focus", function(e) {
+          n(e, r.onInputFocus)
+        }).on("blur", function(e) {
+          n(e, r.onInputBlur)
+        })
+      }, e.prototype.configureAutocomplete = function(e) {
+        e && (this.autocompleteCtrl = e, this.$element.attr("container-empty-hint") || (this.containerEmptyHint = "Chips container with autocompletion. Enter the text area, type text to search, and then use the up and down arrow keys to select an option. Press enter to add the selected option as a chip.", this.setupWrapperAria()), e.registerSelectedItemWatcher(be.bind(this, function(e) {
+          if (e) {
+            if (this.hasMaxChipsReached()) return;
+            this.appendChip(e), this.resetChipBuffer()
+          }
+        })), this.$element.find("input").on("focus", be.bind(this, this.onInputFocus)).on("blur", be.bind(this, this.onInputBlur)))
+      }, e.prototype.shouldAddOnBlur = function() {
+        this.validateModel();
+        var e = this.getChipBuffer().trim(),
+          t = this.ngModelCtrl.$isEmpty(this.ngModelCtrl.$modelValue) || this.ngModelCtrl.$valid,
+          n = this.autocompleteCtrl && !this.autocompleteCtrl.hidden;
+        return this.userInputNgModelCtrl && (t = t && this.userInputNgModelCtrl.$valid), this.addOnBlur && !this.requireMatch && e && t && !n
+      }, e.prototype.hasFocus = function() {
+        return this.inputHasFocus || 0 <= this.selectedChip
+      }, e.prototype.contentIdFor = function(e) {
+        return this.contentIds[e]
+      }
+    }(),
+    function() {
+      o.$inject = ["$mdTheming", "$mdUtil", "$compile", "$log", "$timeout", "$$mdSvgRegistry"], be.module("material.components.chips").directive("mdChips", o);
+      var e = '      <md-chips-wrap          id="{{$mdChipsCtrl.wrapperId}}"          tabindex="{{$mdChipsCtrl.readonly ? 0 : -1}}"          ng-keydown="$mdChipsCtrl.chipKeydown($event)"          ng-class="{ \'md-focused\': $mdChipsCtrl.hasFocus(),                       \'md-readonly\': !$mdChipsCtrl.ngModelCtrl || $mdChipsCtrl.readonly,                      \'md-removable\': $mdChipsCtrl.isRemovable() }"          class="md-chips">        <md-chip ng-repeat="$chip in $mdChipsCtrl.items"            index="{{$index}}"             ng-class="{\'md-focused\': $mdChipsCtrl.selectedChip == $index, \'md-readonly\': !$mdChipsCtrl.ngModelCtrl || $mdChipsCtrl.readonly}">          <div class="md-chip-content"              tabindex="{{$mdChipsCtrl.ariaTabIndex === $index ? 0 : -1}}"              id="{{$mdChipsCtrl.contentIdFor($index)}}"              role="option"              aria-selected="{{$mdChipsCtrl.selectedChip === $index}}"              aria-setsize="{{$mdChipsCtrl.items.length}}"              aria-posinset="{{$index+1}}"              ng-click="!$mdChipsCtrl.readonly && $mdChipsCtrl.focusChip($index)"              aria-label="{{$mdChipsCtrl._isChipObject($chip) ? \'\' : $chip + \'. \'}}{{$mdChipsCtrl.isRemovable() ? \'\' + $mdChipsCtrl.deleteHint : \'\'}}"               ng-focus="!$mdChipsCtrl.readonly && $mdChipsCtrl.selectChip($index)"              md-chip-transclude="$mdChipsCtrl.chipContentsTemplate"></div>          <div ng-if="$mdChipsCtrl.isRemovable()"               class="md-chip-remove-container"               tabindex="-1"               md-chip-transclude="$mdChipsCtrl.chipRemoveTemplate"></div>        </md-chip>        <div class="md-chip-input-container" ng-if="!$mdChipsCtrl.readonly && $mdChipsCtrl.ngModelCtrl">          <div md-chip-transclude="$mdChipsCtrl.chipInputTemplate"></div>        </div>      </md-chips-wrap>',
+        t = '        <input            class="md-input{{ $mdChipsCtrl.inputClass ? \' \' + $mdChipsCtrl.inputClass: \'\'}}"            tabindex="0"            aria-label="{{$mdChipsCtrl.inputAriaLabel}}"            placeholder="{{$mdChipsCtrl.getPlaceholder()}}"            ng-model="$mdChipsCtrl.chipBuffer"            ng-focus="$mdChipsCtrl.onInputFocus()"            ng-blur="$mdChipsCtrl.onInputBlur()"            ng-keydown="$mdChipsCtrl.inputKeydown($event)">',
+        n = "      <span>{{$chip}}</span>",
+        r = '      <button          class="md-chip-remove"          ng-if="$mdChipsCtrl.isRemovable()"          ng-click="$mdChipsCtrl.removeChipAndFocusInput($$replacedScope.$index, $event)"          type="button"          tabindex="-1"          aria-label="{{$mdChipsCtrl.deleteButtonLabel}}{{$mdChipsCtrl._isChipObject($chip) ? \'\' : \' \' + $chip}}">        <md-icon md-svg-src="{{$mdChipsCtrl.mdCloseIcon}}" aria-hidden="true"></md-icon>      </button>';
+
+      function o(u, p, h, o, f, b) {
+        var g = {
+          chips: p.processTemplate(e),
+          input: p.processTemplate(t),
+          default: p.processTemplate(n),
+          remove: p.processTemplate(r)
+        };
+        return {
+          template: function(e, t) {
+            return t.$mdUserTemplate = e.clone(), g.chips
+          },
+          require: ["mdChips"],
+          restrict: "E",
+          controller: "MdChipsCtrl",
+          controllerAs: "$mdChipsCtrl",
+          bindToController: !0,
+          compile: function(e, a) {
+            var n = a.$mdUserTemplate;
+            a.$mdUserTemplate = null;
+            var d = t("md-chips>md-chip-template"),
+              s = t(p.prefixer().buildList("md-chip-remove").map(function(e) {
+                return "md-chips>*[" + e + "]"
+              }).join(",")) || g.remove,
+              l = d || g.default,
+              c = t("md-chips>md-autocomplete") || t("md-chips>input") || g.input,
+              m = n.find("md-chip");
+            n[0].querySelector("md-chip-template>*[md-chip-remove]") && o.warn("invalid placement of md-chip-remove within md-chip-template.");
+
+            function t(e) {
+              if (a.ngModel) {
+                var t = n[0].querySelector(e);
+                return t && t.outerHTML
+              }
+            }
+            return function(e, t, n, o) {
+              p.initOptionalProperties(e, a), u(t);
+              var r = o[0];
+              if (d && (r.enableChipEdit = !1), r.chipContentsTemplate = l, r.chipRemoveTemplate = s, r.chipInputTemplate = c, r.mdCloseIcon = b.mdCancel, t.attr({
+                  tabindex: -1
+                }).on("focus", function() {
+                  r.onFocus()
+                }).on("click", function() {
+                  r.readonly || -1 !== r.selectedChip || r.onFocus()
+                }), a.ngModel && (r.configureNgModel(t.controller("ngModel")), n.mdTransformChip && r.useTransformChipExpression(), n.mdOnAdd && r.useOnAddExpression(), n.mdOnRemove && r.useOnRemoveExpression(), n.mdOnSelect && r.useOnSelectExpression(), c !== g.input && e.$watch("$mdChipsCtrl.readonly", function(e) {
+                  e || p.nextTick(function() {
+                    if (0 === c.indexOf("<md-autocomplete")) {
+                      var e = t.find("md-autocomplete");
+                      r.configureAutocomplete(e.controller("mdAutocomplete"))
+                    }
+                    r.configureUserInput(t.find("input"))
+                  })
+                }), p.nextTick(function() {
+                  var e = t.find("input");
+                  e && (r.configureInput(e), e.toggleClass("md-input", !0))
+                })), 0 < m.length) {
+                var i = h(m.clone())(e.$parent);
+                f(function() {
+                  t.find("md-chips-wrap").prepend(i)
+                })
+              }
+            }
+          },
+          scope: {
+            readonly: "=?readonly",
+            removable: "=?mdRemovable",
+            placeholder: "@?",
+            secondaryPlaceholder: "@?",
+            maxChips: "@?mdMaxChips",
+            transformChip: "&mdTransformChip",
+            onAdd: "&?mdOnAdd",
+            onRemove: "&?mdOnRemove",
+            addedMessage: "@?mdAddedMessage",
+            removedMessage: "@?mdRemovedMessage",
+            onSelect: "&?mdOnSelect",
+            inputClass: "@?mdInputClass",
+            inputAriaDescribedBy: "@?inputAriaDescribedby",
+            inputAriaLabelledBy: "@?inputAriaLabelledby",
+            inputAriaLabel: "@?",
+            containerHint: "@?",
+            containerEmptyHint: "@?",
+            deleteHint: "@?",
+            deleteButtonLabel: "@?",
+            separatorKeys: "=?mdSeparatorKeys",
+            requireMatch: "=?mdRequireMatch",
+            chipAppendDelayString: "@?mdChipAppendDelay",
+            ngChange: "&?"
+          }
+        }
+      }
+    }(), me.$inject = ["$attrs", "$element", "$timeout"], be.module("material.components.chips").controller("MdContactChipsCtrl", me), me.prototype.init = function() {
+      var e = this,
+        t = this.deRegister,
+        n = this.$element;
+      this.$timeout(function() {
+        t.push(n.find("md-chips").controller("mdChips").$scope.$watchCollection("$mdChipsCtrl.items", function() {
+          e.setupChipsAria(), e.setupAutocompleteAria()
+        }))
+      })
+    }, me.prototype.setupChipsAria = function() {
+      var e = this.$element.find("md-chips"),
+        t = e.controller("mdChips");
+      this.removedMessage && (t.removedMessage = this.removedMessage), this.containerHint && (t.containerHint = this.containerHint), this.containerEmptyHint && (e.attr("container-empty-hint", this.containerEmptyHint), t.containerEmptyHint = this.containerEmptyHint), this.deleteHint && (t.deleteHint = this.deleteHint), this.inputAriaLabel && (t.inputAriaLabel = this.inputAriaLabel), this.inputClass && (t.inputClass = this.inputClass)
+    }, me.prototype.setupAutocompleteAria = function() {
+      var e = this.$element.find("md-chips-wrap").find("md-autocomplete").find("input");
+      this.inputAriaDescribedBy && e.attr("aria-describedby", this.inputAriaDescribedBy), this.inputAriaLabelledBy && (e.removeAttr("aria-label"), e.attr("aria-labelledby", this.inputAriaLabelledBy))
+    }, me.prototype.queryContact = function(e) {
+      return this.contactQuery({
+        $query: e
+      })
+    }, me.prototype.inputKeydown = function(e) {
+      if (this.separatorKeys && !(this.separatorKeys.indexOf(e.keyCode) < 0)) {
+        e.stopPropagation(), e.preventDefault();
+        var t = be.element(e.target).controller("mdAutocomplete");
+        t.select(t.index)
+      }
+    }, me.prototype.itemName = function(e) {
+      return e[this.contactName]
+    }, me.prototype.$onDestroy = function() {
+      for (var e; e = this.deRegister.pop();) e.call(this)
+    },
+    function() {
+      e.$inject = ["$mdTheming", "$mdUtil"], be.module("material.components.chips").directive("mdContactChips", e);
+      var n = '      <md-chips class="md-contact-chips"          ng-model="$mdContactChipsCtrl.contacts"          ng-change="$mdContactChipsCtrl.ngChange($mdContactChipsCtrl.contacts)"          md-require-match="$mdContactChipsCtrl.requireMatch"          md-max-chips="{{$mdContactChipsCtrl.maxChips}}"          md-chip-append-delay="{{$mdContactChipsCtrl.chipAppendDelay}}"          md-separator-keys="$mdContactChipsCtrl.separatorKeys"          md-autocomplete-snap>          <md-autocomplete              md-menu-class="md-contact-chips-suggestions"              md-selected-item="$mdContactChipsCtrl.selectedItem"              md-search-text="$mdContactChipsCtrl.searchText"              md-items="item in $mdContactChipsCtrl.queryContact($mdContactChipsCtrl.searchText)"              md-item-text="$mdContactChipsCtrl.itemName(item)"              md-no-cache="true"              md-min-length="$mdContactChipsCtrl.minLength"              md-autoselect              ng-attr-md-input-class="{{$mdContactChipsCtrl.inputClass}}"              ng-keydown="$mdContactChipsCtrl.inputKeydown($event)"              placeholder="{{$mdContactChipsCtrl.contacts.length === 0 ?                  $mdContactChipsCtrl.placeholder : $mdContactChipsCtrl.secondaryPlaceholder}}">            <div class="md-contact-suggestion">              <img                   ng-src="{{item[$mdContactChipsCtrl.contactImage]}}"                  alt="{{item[$mdContactChipsCtrl.contactName]}}"                  ng-if="item[$mdContactChipsCtrl.contactImage]" />              <span class="md-contact-name" md-highlight-text="$mdContactChipsCtrl.searchText"                    md-highlight-flags="{{$mdContactChipsCtrl.highlightFlags}}">                {{item[$mdContactChipsCtrl.contactName]}}              </span>              <span class="md-contact-email" >{{item[$mdContactChipsCtrl.contactEmail]}}</span>            </div>          </md-autocomplete>          <md-chip-template>            <div class="md-contact-avatar">              <img                   ng-src="{{$chip[$mdContactChipsCtrl.contactImage]}}"                  alt="{{$chip[$mdContactChipsCtrl.contactName]}}"                  ng-if="$chip[$mdContactChipsCtrl.contactImage]" />            </div>            <div class="md-contact-name">              {{$chip[$mdContactChipsCtrl.contactName]}}            </div>          </md-chip-template>      </md-chips>';
+
+      function e(a, d) {
+        return {
+          template: function(e, t) {
+            return n
+          },
+          restrict: "E",
+          controller: "MdContactChipsCtrl",
+          controllerAs: "$mdContactChipsCtrl",
+          bindToController: !0,
+          compile: function(e, i) {
+            return function(e, t, n, o) {
+              var r = o;
+              d.initOptionalProperties(e, i), a(t), t.attr("tabindex", "-1"), n.$observe("mdChipAppendDelay", function(e) {
+                r.chipAppendDelay = e
+              })
+            }
+          },
+          scope: {
+            contactQuery: "&mdContacts",
+            placeholder: "@?",
+            secondaryPlaceholder: "@?",
+            contactName: "@mdContactName",
+            contactImage: "@mdContactImage",
+            contactEmail: "@mdContactEmail",
+            contacts: "=ngModel",
+            ngChange: "&?",
+            requireMatch: "=?mdRequireMatch",
+            minLength: "=?mdMinLength",
+            maxChips: "=?mdMaxChips",
+            highlightFlags: "@?mdHighlightFlags",
+            chipAppendDelay: "@?mdChipAppendDelay",
+            separatorKeys: "=?mdSeparatorKeys",
+            removedMessage: "@?mdRemovedMessage",
+            inputClass: "@?mdInputClass",
+            inputAriaDescribedBy: "@?inputAriaDescribedby",
+            inputAriaLabelledBy: "@?inputAriaLabelledby",
+            inputAriaLabel: "@?",
+            containerHint: "@?",
+            containerEmptyHint: "@?",
+            deleteHint: "@?"
+          }
+        }
+      }
+    }(),
+    function() {
+      t.$inject = ["$mdColors", "$mdUtil", "$log", "$parse"], e.$inject = ["$mdTheming", "$mdUtil", "$log"];
+      var a = /^{((\s|,)*?["'a-zA-Z-]+?\s*?:\s*?(['"])[a-zA-Z0-9-.]*(['"]))+\s*}$/,
+        l = null;
+
+      function e(i, a, n) {
+        return l = l || Object.keys(i.PALETTES), {
+          applyThemeColors: function(e, t) {
+            try {
+              t && e.css(function(e) {
+                var r = {},
+                  i = e.hasOwnProperty("color");
+                return be.forEach(e, function(e, t) {
+                  var n = s(e),
+                    o = -1 < t.indexOf("background");
+                  r[t] = d(n), o && !i && (r.color = d(n, !0))
+                }), r
+              }(t))
+            } catch (e) {
+              n.error(e.message)
+            }
+          },
+          getThemeColor: function(e) {
+            return d(s(e))
+          },
+          hasTheme: function(e) {
+            return be.isDefined(i.THEMES[e.split("-")[0]])
+          }
+        };
+
+        function d(e, t) {
+          t = t || !1;
+          var n = i.PALETTES[e.palette][e.hue];
+          return n = t ? n.contrast : n.value, a.supplant("rgba({0}, {1}, {2}, {3})", [n[0], n[1], n[2], n[3] || e.opacity])
+        }
+
+        function s(e) {
+          var t = e.split("-"),
+            n = be.isDefined(i.THEMES[t[0]]) ? t.splice(0, 1)[0] : i.defaultTheme();
+          return {
+            theme: n,
+            palette: function(e, t) {
+              var n = 1 < e.length && -1 !== l.indexOf(e[1]),
+                o = e[0].replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
+              if (n && (o = e[0] + "-" + e.splice(1, 1)), -1 === l.indexOf(o)) {
+                var r = i.THEMES[t].colors[o];
+                if (!r) throw new Error(a.supplant("mdColors: couldn't find '{palette}' in the palettes.", {
+                  palette: o
+                }));
+                o = r.name
+              }
+              return o
+            }(t, n),
+            hue: function(e, t) {
+              var n = i.THEMES[t].colors;
+              if ("hue" !== e[1]) return e[1] || n[e[0] in n ? e[0] : "primary"].hues.default;
+              var o = parseInt(e.splice(2, 1)[0], 10);
+              if (o < 1 || 3 < o) throw new Error(a.supplant("mdColors: 'hue-{hueNumber}' is not a valid hue, can be only 'hue-1', 'hue-2' and 'hue-3'", {
+                hueNumber: o
+              }));
+              if (e[1] = "hue-" + o, e[0] in n) return n[e[0]].hues[e[1]];
+              throw new Error(a.supplant("mdColors: 'hue-x' can only be used with [{availableThemes}], but was used with '{usedTheme}'", {
+                availableThemes: Object.keys(n).join(", "),
+                usedTheme: e[0]
+              }))
+            }(t, n),
+            opacity: t[2] || 1
+          }
+        }
+      }
+
+      function t(c, i, m, u) {
+        return {
+          restrict: "A",
+          require: ["^?mdTheme"],
+          compile: function(e, r) {
+            var l = function() {
+              var e = r.mdColors,
+                t = -1 < e.indexOf("::"),
+                n = t || a.test(r.mdColors);
+              r.mdColors = e.replace("::", "");
+              var o = be.isDefined(r.mdColorsWatch);
+              return !t && !n && (!o || i.parseAttributeBoolean(r.mdColorsWatch))
+            }();
+            return function(e, n, t, o) {
+              function r(n) {
+                "string" != typeof n && (n = ""), t.mdColors || (t.mdColors = "{}");
+                var o = u(t.mdColors)(e);
+                return i && Object.keys(o).forEach(function(e) {
+                  var t = o[e];
+                  c.hasTheme(t) || (o[e] = (n || i.$mdTheme) + "-" + t)
+                }), d(o), o
+              }
+              var i = o[0],
+                a = {},
+                d = function(e) {
+                  if (!be.equals(e, a)) {
+                    var t = Object.keys(a);
+                    a.background && !t.color && t.push("color"), t.forEach(function(e) {
+                      n.css(e, "")
+                    })
+                  }
+                  a = e
+                },
+                s = be.noop;
+              i && (s = i.registerChanges(function(e) {
+                c.applyThemeColors(n, r(e))
+              })), e.$on("$destroy", function() {
+                s()
+              });
+              try {
+                l ? e.$watch(r, be.bind(this, c.applyThemeColors, n), !0) : c.applyThemeColors(n, r())
+              } catch (e) {
+                m.error(e.message)
+              }
+            }
+          }
+        }
+      }
+      be.module("material.components.colors", ["material.core"]).directive("mdColors", t).service("$mdColors", e)
+    }(), ue.$inject = ["$mdTheming"], be.module("material.components.content", ["material.core"]).directive("mdContent", ue), be.module("material.components.datepicker", ["material.core", "material.components.icon", "material.components.virtualRepeat"]),
+    function() {
+      function e(i) {
+        return {
+          template: function(e, t) {
+            return '<div ng-switch="calendarCtrl.currentView" ' + (t.hasOwnProperty("ngIf") ? "" : 'ng-if="calendarCtrl.isInitialized"') + '><md-calendar-year ng-switch-when="year"></md-calendar-year><md-calendar-month ng-switch-default></md-calendar-month></div>'
+          },
+          scope: {
+            minDate: "=mdMinDate",
+            maxDate: "=mdMaxDate",
+            dateFilter: "=mdDateFilter",
+            monthFilter: "=mdMonthFilter",
+            _mode: "@mdMode",
+            _currentView: "@mdCurrentView"
+          },
+          require: ["ngModel", "mdCalendar"],
+          controller: n,
+          controllerAs: "calendarCtrl",
+          bindToController: !0,
+          link: function(e, t, n, o) {
+            var r = o[0];
+            o[1].configureNgModel(r, i)
+          }
+        }
+      }
+      n.$inject = ["$element", "$scope", "$$mdDateUtil", "$mdUtil", "$mdConstant", "$mdTheming", "$$rAF", "$attrs", "$mdDateLocale", "$filter", "$document"], e.$inject = ["inputDirective"], be.module("material.components.datepicker").directive("mdCalendar", e);
+      var p = 0,
+        t = {
+          day: "month",
+          month: "year"
+        };
+
+      function n(e, t, n, o, r, i, a, d, s, l, c) {
+        i(e), this.$element = e, this.$scope = t, this.$attrs = d, this.dateUtil = n, this.$mdUtil = o, this.keyCode = r.KEY_CODE, this.$$rAF = a, this.$mdDateLocale = s, this.ngDateFilter = l("date"), this.today = this.dateUtil.createDateAtMidnight(), this.ngModelCtrl = ge, this.SELECTED_DATE_CLASS = "md-calendar-selected-date", this.TODAY_CLASS = "md-calendar-date-today", this.FOCUSED_DATE_CLASS = "md-focus", this.id = p++, this.displayDate = null, this.mode = null, this.selectedDate = null, this.firstRenderableDate = null, this.lastRenderableDate = null, this.isInitialized = !1, this.width = 0, this.scrollbarWidth = 0, this.standaloneMode = !1, d.tabindex || e.attr("tabindex", "-1");
+        var m, u = be.bind(this, this.handleKeyEvent);
+        (m = e.parent().hasClass("md-datepicker-calendar") ? be.element(c[0].body) : (this.standaloneMode = !0, e)).on("keydown", u), t.$on("$destroy", function() {
+          m.off("keydown", u)
+        }), 1 === be.version.major && be.version.minor <= 4 && this.$onInit()
+      }
+      n.prototype.$onInit = function() {
+        this._mode && t.hasOwnProperty(this._mode) ? (this.currentView = t[this._mode], this.mode = this._mode) : (this.currentView = this._currentView || "month", this.mode = null), this.minDate && this.minDate > this.$mdDateLocale.firstRenderableDate ? this.firstRenderableDate = this.minDate : this.firstRenderableDate = this.$mdDateLocale.firstRenderableDate, this.maxDate && this.maxDate < this.$mdDateLocale.lastRenderableDate ? this.lastRenderableDate = this.maxDate : this.lastRenderableDate = this.$mdDateLocale.lastRenderableDate
+      }, n.prototype.configureNgModel = function(e, t) {
+        var n = this;
+        n.ngModelCtrl = e, this.$attrs.$set("type", "date"), t[0].link.pre(this.$scope, {
+          on: be.noop,
+          val: be.noop,
+          0: {}
+        }, this.$attrs, [e]), e.$render = function() {
+          var e, t = this.$viewValue;
+          n.dateUtil.isValidDate(t) || (e = n.dateUtil.removeLocalTzAndReparseDate(new Date(t)), n.dateUtil.isValidDate(e) && (t = e)), n.$scope.$broadcast("md-calendar-parent-changed", t), n.selectedDate || (n.selectedDate = t), n.displayDate || (n.displayDate = n.selectedDate || n.today)
+        }, n.$mdUtil.nextTick(function() {
+          n.isInitialized = !0
+        })
+      }, n.prototype.setNgModelValue = function(e) {
+        var t = this.$mdUtil.getModelOption(this.ngModelCtrl, "timezone"),
+          n = this.dateUtil.createDateAtMidnight(e);
+        return this.focusDate(n), this.$scope.$emit("md-calendar-change", n), null == t || n.getTimezoneOffset() < 0 ? this.ngModelCtrl.$setViewValue(this.ngDateFilter(n, "yyyy-MM-dd"), "default") : this.ngModelCtrl.$setViewValue(this.ngDateFilter(n, "yyyy-MM-dd", t), "default"), this.ngModelCtrl.$render(), n
+      }, n.prototype.setCurrentView = function(e, t) {
+        var n = this;
+        n.$mdUtil.nextTick(function() {
+          n.currentView = e, t && (n.displayDate = be.isDate(t) ? t : new Date(t))
+        })
+      }, n.prototype.focusDate = function(e) {
+        if (this.dateUtil.isValidDate(e)) {
+          var t = this.$element[0].querySelector("." + this.FOCUSED_DATE_CLASS);
+          t && t.classList.remove(this.FOCUSED_DATE_CLASS);
+          var n = this.getDateId(e, this.currentView),
+            o = document.getElementById(n);
+          o && (o.classList.add(this.FOCUSED_DATE_CLASS), o.focus(), this.displayDate = e)
+        } else {
+          var r = this.$element[0].querySelector("[ng-switch]");
+          r && r.focus()
+        }
+      }, n.prototype.changeSelectedDate = function(e) {
+        var t = this.SELECTED_DATE_CLASS,
+          n = this.$element[0].querySelector("." + t);
+        if (n && (n.classList.remove(t), n.setAttribute("aria-selected", "false")), e) {
+          var o = document.getElementById(this.getDateId(e, this.currentView));
+          o && (o.classList.add(t), o.setAttribute("aria-selected", "true"))
+        }
+        this.selectedDate = e
+      }, n.prototype.getActionFromKeyEvent = function(e) {
+        var t = this.keyCode;
+        switch (e.which) {
+          case t.ENTER:
+            return "select";
+          case t.RIGHT_ARROW:
+            return "move-right";
+          case t.LEFT_ARROW:
+            return "move-left";
+          case t.DOWN_ARROW:
+            return e.metaKey ? "move-page-down" : "move-row-down";
+          case t.UP_ARROW:
+            return e.metaKey ? "move-page-up" : "move-row-up";
+          case t.PAGE_DOWN:
+            return "move-page-down";
+          case t.PAGE_UP:
+            return "move-page-up";
+          case t.HOME:
+            return "start";
+          case t.END:
+            return "end";
+          default:
+            return null
+        }
+      }, n.prototype.handleKeyEvent = function(t) {
+        var n = this;
+        this.$scope.$apply(function() {
+          if (t.which === n.keyCode.ESCAPE || t.which === n.keyCode.TAB && !n.standaloneMode) return n.$scope.$emit("md-calendar-close"), void(t.which === n.keyCode.TAB && t.preventDefault());
+          if (t.which !== n.keyCode.TAB || !n.standaloneMode) {
+            var e = n.getActionFromKeyEvent(t);
+            e && (t.preventDefault(), t.stopPropagation(), n.$scope.$broadcast("md-calendar-parent-action", e))
+          }
+        })
+      }, n.prototype.hideVerticalScrollbar = function(o) {
+        var r = this,
+          t = o.$element[0],
+          i = t.querySelector(".md-calendar-scroll-mask");
+
+        function n() {
+          var e = r.width || 340,
+            t = r.scrollbarWidth,
+            n = o.calendarScroller;
+          i.style.width = e + "px", n.style.width = e + t + "px", n.style.paddingRight = t + "px"
+        }
+        0 < r.width ? n() : r.$$rAF(function() {
+          var e = o.calendarScroller;
+          r.scrollbarWidth = e.offsetWidth - e.clientWidth, r.width = t.querySelector("table").offsetWidth, n()
+        })
+      }, n.prototype.getDateId = function(e, t) {
+        if (!t) throw new Error("A namespace for the date id has to be specified.");
+        return ["md", this.id, t, e.getFullYear(), e.getMonth(), e.getDate()].join("-")
+      }, n.prototype.updateVirtualRepeat = function() {
+        var e = this.$scope,
+          t = e.$on("$md-resize-enable", function() {
+            e.$$phase || e.$apply(), t()
+          })
+      }
+    }(),
+    function() {
+      t.$inject = ["$element", "$scope", "$animate", "$q", "$$mdDateUtil", "$mdDateLocale"], be.module("material.components.datepicker").directive("mdCalendarMonth", function() {
+        return {
+          require: ["^^mdCalendar", "mdCalendarMonth"],
+          controller: t,
+          controllerAs: "monthCtrl",
+          bindToController: !0,
+          link: function(e, t, n, o) {
+            var r = o[0];
+            o[1].initialize(r)
+          }
+        }
+      });
+      var n = 265,
+        e = 45;
+
+      function t(e, t, n, o, r, i) {
+        this.$element = e, this.$scope = t, this.$animate = n, this.$q = o, this.dateUtil = r, this.dateLocale = i, this.calendarScroller = e[0].querySelector(".md-virtual-repeat-scroller"), this.isInitialized = !1, this.isMonthTransitionInProgress = !1;
+        var a = this;
+        this.cellClickHandler = function() {
+          var e = r.getTimestampFromNode(this);
+          a.$scope.$apply(function() {
+            a.calendarCtrl.setNgModelValue(new Date(e))
+          })
+        }, this.headerClickHandler = function() {
+          a.calendarCtrl.setCurrentView("year", r.getTimestampFromNode(this))
+        }
+      }
+      t.prototype.initialize = function(e) {
+        this.items = {
+          length: this.dateUtil.getMonthDistance(e.firstRenderableDate, e.lastRenderableDate) + 2
+        }, this.calendarCtrl = e, this.attachScopeListeners(), e.updateVirtualRepeat(), e.ngModelCtrl && e.ngModelCtrl.$render()
+      }, t.prototype.getSelectedMonthIndex = function() {
+        var e = this.calendarCtrl;
+        return this.dateUtil.getMonthDistance(e.firstRenderableDate, e.displayDate || e.selectedDate || e.today)
+      }, t.prototype.changeDisplayDate = function(e) {
+        if (!this.isInitialized) return this.buildWeekHeader(), this.calendarCtrl.hideVerticalScrollbar(this), this.isInitialized = !0, this.$q.when();
+        if (!this.dateUtil.isValidDate(e) || this.isMonthTransitionInProgress) return this.$q.when();
+        this.isMonthTransitionInProgress = !0;
+        var t = this.animateDateChange(e);
+        this.calendarCtrl.displayDate = e;
+        var n = this;
+        return t.then(function() {
+          n.isMonthTransitionInProgress = !1
+        }), t
+      }, t.prototype.animateDateChange = function(e) {
+        if (this.dateUtil.isValidDate(e)) {
+          var t = this.dateUtil.getMonthDistance(this.calendarCtrl.firstRenderableDate, e);
+          this.calendarScroller.scrollTop = t * n
+        }
+        return this.$q.when()
+      }, t.prototype.buildWeekHeader = function() {
+        for (var e = this.dateLocale.firstDayOfWeek, t = this.dateLocale.shortDays, n = document.createElement("tr"), o = 0; o < 7; o++) {
+          var r = document.createElement("th");
+          r.textContent = t[(o + e) % 7], n.appendChild(r)
+        }
+        this.$element.find("thead").append(n)
+      }, t.prototype.attachScopeListeners = function() {
+        var n = this;
+        n.$scope.$on("md-calendar-parent-changed", function(e, t) {
+          n.calendarCtrl.changeSelectedDate(t), n.changeDisplayDate(t)
+        }), n.$scope.$on("md-calendar-parent-action", be.bind(this, this.handleKeyEvent))
+      }, t.prototype.handleKeyEvent = function(e, t) {
+        var n = this.calendarCtrl,
+          o = n.displayDate;
+        if ("select" === t) n.setNgModelValue(o);
+        else {
+          var r = null,
+            i = this.dateUtil;
+          switch (t) {
+            case "move-right":
+              r = i.incrementDays(o, 1);
+              break;
+            case "move-left":
+              r = i.incrementDays(o, -1);
+              break;
+            case "move-page-down":
+              r = i.incrementMonths(o, 1);
+              break;
+            case "move-page-up":
+              r = i.incrementMonths(o, -1);
+              break;
+            case "move-row-down":
+              r = i.incrementDays(o, 7);
+              break;
+            case "move-row-up":
+              r = i.incrementDays(o, -7);
+              break;
+            case "start":
+              r = i.getFirstDateOfMonth(o);
+              break;
+            case "end":
+              r = i.getLastDateOfMonth(o)
+          }
+          r && (r = this.dateUtil.clampDate(r, n.minDate, n.maxDate), this.changeDisplayDate(r).then(function() {
+            n.focusDate(r)
+          }))
+        }
+      }
+    }(), pe.$inject = ["$compile", "$$mdSvgRegistry"], he.$inject = ["$element", "$$mdDateUtil", "$mdDateLocale"], be.module("material.components.datepicker").directive("mdCalendarMonthBody", pe), he.prototype.generateContent = function() {
+      var e = this.dateUtil.incrementMonths(this.calendarCtrl.firstRenderableDate, this.offset);
+      this.$element.empty().append(this.buildCalendarForMonth(e)), this.focusAfterAppend && (this.focusAfterAppend.classList.add(this.calendarCtrl.FOCUSED_DATE_CLASS), this.focusAfterAppend = null)
+    }, he.prototype.buildDateCell = function(e) {
+      var t = this.monthCtrl,
+        n = this.calendarCtrl,
+        o = document.createElement("td");
+      if (o.tabIndex = -1, o.classList.add("md-calendar-date"), o.setAttribute("role", "gridcell"), e) {
+        o.setAttribute("tabindex", "-1"), o.setAttribute("aria-label", this.dateLocale.longDateFormatter(e)), o.id = n.getDateId(e, "month"), o.setAttribute("data-timestamp", e.getTime()), this.dateUtil.isSameDay(e, n.today) && o.classList.add(n.TODAY_CLASS), this.dateUtil.isValidDate(n.selectedDate) && this.dateUtil.isSameDay(e, n.selectedDate) && (o.classList.add(n.SELECTED_DATE_CLASS), o.setAttribute("aria-selected", "true"));
+        var r = this.dateLocale.dates[e.getDate()];
+        if (this.isDateEnabled(e)) {
+          var i = document.createElement("span");
+          i.classList.add("md-calendar-date-selection-indicator"), i.textContent = r, o.appendChild(i), o.addEventListener("click", t.cellClickHandler), n.displayDate && this.dateUtil.isSameDay(e, n.displayDate) && (this.focusAfterAppend = o)
+        } else o.classList.add("md-calendar-date-disabled"), o.textContent = r
+      }
+      return o
+    }, he.prototype.isDateEnabled = function(e) {
+      return this.dateUtil.isDateWithinRange(e, this.calendarCtrl.minDate, this.calendarCtrl.maxDate) && (!be.isFunction(this.calendarCtrl.dateFilter) || this.calendarCtrl.dateFilter(e))
+    }, he.prototype.buildDateRow = function(e) {
+      var t = document.createElement("tr");
+      return t.setAttribute("role", "row"), t.setAttribute("aria-label", this.dateLocale.weekNumberFormatter(e)), t
+    }, he.prototype.buildCalendarForMonth = function(e) {
+      var t = this.dateUtil.isValidDate(e) ? e : new Date,
+        n = this.dateUtil.getFirstDateOfMonth(t),
+        o = this.getLocaleDay_(n),
+        r = this.dateUtil.getNumberOfDaysInMonth(t),
+        i = document.createDocumentFragment(),
+        a = 1,
+        d = this.buildDateRow(a);
+      i.appendChild(d);
+      var s = this.offset === this.monthCtrl.items.length - 1,
+        l = 0,
+        c = document.createElement("td"),
+        m = document.createElement("span"),
+        u = this.calendarCtrl;
+        c.setAttribute("colspan", "7");
+        var p = this.buildDateRow();
+        if (p.appendChild(c), i.insertBefore(p, d), s) return i
+      } else l = 3, c.setAttribute("colspan", "3"), d.appendChild(c);
+      for (var h = l; h < o; h++) d.appendChild(this.buildDateCell());
+      for (var f = o, b = n, g = 1; g <= r; g++) {
+        if (7 === f) {
+          if (s) return i;
+          f = 0, a++, d = this.buildDateRow(a), i.appendChild(d)
+        }
+        b.setDate(g);
+        var E = this.buildDateCell(b);
+        d.appendChild(E), f++
+      }
+      for (; d.childNodes.length < 7;) d.appendChild(this.buildDateCell());
+      for (; i.childNodes.length < 6;) {
+        for (var v = this.buildDateRow(), $ = 0; $ < 7; $++) v.appendChild(this.buildDateCell());
+        i.appendChild(v)
+      }
+      return i
+    }, he.prototype.getLocaleDay_ = function(e) {
+      return (e.getDay() + (7 - this.dateLocale.firstDayOfWeek)) % 7
+    },
+    function() {
+      e.$inject = ["$element", "$scope", "$animate", "$q", "$$mdDateUtil", "$mdUtil"], be.module("material.components.datepicker").directive("mdCalendarYear", function() {
+        return {
+          require: ["^^mdCalendar", "mdCalendarYear"],
+          controller: e,
+          controllerAs: "yearCtrl",
+          bindToController: !0,
+          link: function(e, t, n, o) {
+            var r = o[0];
+            o[1].initialize(r)
+          }
+        }
+      });
+      var n = 88;
+
+      function e(e, t, n, o, r, i) {
+        this.$element = e, this.$scope = t, this.$animate = n, this.$q = o, this.dateUtil = r, this.calendarScroller = e[0].querySelector(".md-virtual-repeat-scroller"), this.isInitialized = !1, this.isMonthTransitionInProgress = !1, this.$mdUtil = i;
+        var a = this;
+        this.cellClickHandler = function() {
+          a.onTimestampSelected(r.getTimestampFromNode(this))
+        }
+      }
+      e.prototype.initialize = function(e) {
+        this.items = {
+          length: this.dateUtil.getYearDistance(e.firstRenderableDate, e.lastRenderableDate) + 1
+        }, this.calendarCtrl = e, this.attachScopeListeners(), e.updateVirtualRepeat(), e.ngModelCtrl && e.ngModelCtrl.$render()
+      }, e.prototype.getFocusedYearIndex = function() {
+        var e = this.calendarCtrl;
+        return this.dateUtil.getYearDistance(e.firstRenderableDate, e.displayDate || e.selectedDate || e.today)
+      }, e.prototype.changeDate = function(e) {
+        if (!this.isInitialized) return this.calendarCtrl.hideVerticalScrollbar(this), this.isInitialized = !0, this.$q.when();
+        if (this.dateUtil.isValidDate(e) && !this.isMonthTransitionInProgress) {
+          var t = this,
+            n = this.animateDateChange(e);
+          return t.isMonthTransitionInProgress = !0, t.calendarCtrl.displayDate = e, n.then(function() {
+            t.isMonthTransitionInProgress = !1
+          })
+        }
+      }, e.prototype.animateDateChange = function(e) {
+        if (this.dateUtil.isValidDate(e)) {
+          var t = this.dateUtil.getYearDistance(this.calendarCtrl.firstRenderableDate, e);
+          this.calendarScroller.scrollTop = t * n
+        }
+        return this.$q.when()
+      }, e.prototype.handleKeyEvent = function(e, t) {
+        var n = this,
+          o = n.calendarCtrl,
+          r = o.displayDate;
+        if ("select" === t) n.changeDate(r).then(function() {
+          n.onTimestampSelected(r)
+        });
+        else {
+          var i = null,
+            a = n.dateUtil;
+          switch (t) {
+            case "move-right":
+              i = a.incrementMonths(r, 1);
+              break;
+            case "move-left":
+              i = a.incrementMonths(r, -1);
+              break;
+            case "move-row-down":
+              i = a.incrementMonths(r, 6);
+              break;
+            case "move-row-up":
+              i = a.incrementMonths(r, -6)
+          }
+          if (i) {
+            var d = o.minDate ? a.getFirstDateOfMonth(o.minDate) : null,
+              s = o.maxDate ? a.getFirstDateOfMonth(o.maxDate) : null;
+            i = a.getFirstDateOfMonth(n.dateUtil.clampDate(i, d, s)), n.changeDate(i).then(function() {
+              o.focusDate(i)
+            })
+          }
+        }
+      }, e.prototype.attachScopeListeners = function() {
+        var n = this;
+        n.$scope.$on("md-calendar-parent-changed", function(e, t) {
+          n.calendarCtrl.changeSelectedDate(t ? n.dateUtil.getFirstDateOfMonth(t) : t), n.changeDate(t)
+        }), n.$scope.$on("md-calendar-parent-action", be.bind(n, n.handleKeyEvent))
+      }, e.prototype.onTimestampSelected = function(e) {
+        var t = this.calendarCtrl;
+        t.mode ? this.$mdUtil.nextTick(function() {
+          t.setNgModelValue(new Date(e))
+        }) : t.setCurrentView("month", e)
+      }
+    }(), fe.$inject = ["$element", "$$mdDateUtil", "$mdDateLocale"], be.module("material.components.datepicker").directive("mdCalendarYearBody", function() {
+      return {
+        require: ["^^mdCalendar", "^^mdCalendarYear", "mdCalendarYearBody"],
+        scope: {
+          offset: "=mdYearOffset"
+        },
+        controller: fe,
+        controllerAs: "mdYearBodyCtrl",
+        bindToController: !0,
+        link: function(e, t, n, o) {
+          var r = o[0],
+            i = o[1],
+            a = o[2];
+          a.calendarCtrl = r, a.yearCtrl = i, e.$watch(function() {
+            return a.offset
+          }, function(e) {
+            be.isNumber(e) && a.generateContent()
+          })
+        }
+      }
+    }), fe.prototype.generateContent = function() {
+      var e = this.dateUtil.incrementYears(this.calendarCtrl.firstRenderableDate, this.offset);
+      this.$element.empty().append(this.buildCalendarForYear(e)), this.focusAfterAppend && (this.focusAfterAppend.classList.add(this.calendarCtrl.FOCUSED_DATE_CLASS), this.focusAfterAppend = null)
+    }, fe.prototype.buildMonthCell = function(e, t) {
+      var n = this.calendarCtrl,
+        o = this.yearCtrl,
+        r = this.buildBlankCell(),
+        i = new Date(e, t, 1);
+      r.setAttribute("aria-label", this.dateLocale.monthFormatter(i)), r.id = n.getDateId(i, "year"), r.setAttribute("data-timestamp", String(i.getTime())), this.dateUtil.isSameMonthAndYear(i, n.today) && r.classList.add(n.TODAY_CLASS), this.dateUtil.isValidDate(n.selectedDate) && this.dateUtil.isSameMonthAndYear(i, n.selectedDate) && (r.classList.add(n.SELECTED_DATE_CLASS), r.setAttribute("aria-selected", "true"));
+      var a = this.dateLocale.shortMonths[t];
+      if (!this.dateUtil.isMonthWithinRange(i, n.minDate, n.maxDate) || be.isFunction(n.monthFilter) && !n.monthFilter(i)) r.classList.add("md-calendar-date-disabled"), r.textContent = a;
+      else {
+        var d = document.createElement("span");
+        d.classList.add("md-calendar-date-selection-indicator"), d.textContent = a, r.appendChild(d), r.addEventListener("click", o.cellClickHandler), n.displayDate && this.dateUtil.isSameMonthAndYear(i, n.displayDate) && (this.focusAfterAppend = r)
+      }
+      return r
+    }, fe.prototype.buildBlankCell = function() {
+      var e = document.createElement("td");
+      return e.tabIndex = -1, e.classList.add("md-calendar-date"), e.setAttribute("role", "gridcell"), e.setAttribute("tabindex", "-1"), e
+    }, fe.prototype.buildCalendarForYear = function(e) {
+      var t, n = e.getFullYear(),
+        o = document.createDocumentFragment(),
+        r = document.createElement("tr"),
+        i = document.createElement("td");
+      for (i.className = "md-calendar-month-label", i.textContent = String(n), r.appendChild(i), t = 0; t < 6; t++) r.appendChild(this.buildMonthCell(n, t));
+      o.appendChild(r);
+      var a = document.createElement("tr");
+      for (a.appendChild(this.buildBlankCell()), t = 6; t < 12; t++) a.appendChild(this.buildMonthCell(n, t));
+      return o.appendChild(a), o
+    }, be.module("material.components.datepicker").config(["$provide", function(e) {
+      function t() {
+        this.months = null, this.shortMonths = null, this.days = null, this.shortDays = null, this.dates = null, this.firstDayOfWeek = 0, this.formatDate = null, this.parseDate = null, this.monthHeaderFormatter = null, this.weekNumberFormatter = null, this.longDateFormatter = null, this.isDateComplete = null, this.msgCalendar = "", this.msgOpenCalendar = ""
+      }(t.prototype.$get = function(e, r) {
+        for (var t = e.DATETIME_FORMATS.SHORTDAY.map(function(e) {
+            return e.substring(0, 1)
+          }), n = Array(32), o = 1; o <= 31; o++) n[o] = o;
+        var i = new Date(1880, 0, 1),
+          a = new Date(i.getFullYear() + 250, 0, 1),
+          d = {
+            months: this.months || e.DATETIME_FORMATS.MONTH,
+            shortMonths: this.shortMonths || e.DATETIME_FORMATS.SHORTMONTH,
+            days: this.days || e.DATETIME_FORMATS.DAY,
+            shortDays: this.shortDays || t,
+            dates: this.dates || n,
+            firstDayOfWeek: this.firstDayOfWeek || 0,
+            formatDate: this.formatDate || function(e, t) {
+              if (!e) return "";
+              var n = e.toLocaleTimeString(),
+                o = e;
+              return 0 !== e.getHours() || -1 === n.indexOf("11:") && -1 === n.indexOf("23:") || (o = new Date(e.getFullYear(), e.getMonth(), e.getDate(), 1, 0, 0)), r("date")(o, "M/d/yyyy", t)
+            },
+            parseDate: this.parseDate || function(e) {
+              return new Date(e)
+            },
+            isDateComplete: this.isDateComplete || function(e) {
+              return e = e.trim(), /^(([a-zA-Z]{3,}|[0-9]{1,4})([ .,]+|[/-])){2}([a-zA-Z]{3,}|[0-9]{1,4})$/.test(e)
+            },
+            monthHeaderFormatter: this.monthHeaderFormatter || function(e) {
+              return d.shortMonths[e.getMonth()] + " " + e.getFullYear()
+            },
+            monthFormatter: this.monthFormatter || function(e) {
+              return d.months[e.getMonth()] + " " + e.getFullYear()
+            },
+            weekNumberFormatter: this.weekNumberFormatter || function(e) {
+              return "Week " + e
+            },
+            longDateFormatter: this.longDateFormatter || function(e) {
+              return [d.days[e.getDay()], d.months[e.getMonth()], d.dates[e.getDate()], e.getFullYear()].join(" ")
+            },
+            msgCalendar: this.msgCalendar || "Calendar",
+            msgOpenCalendar: this.msgOpenCalendar || "Open calendar",
+            firstRenderableDate: this.firstRenderableDate || i,
+            lastRenderableDate: this.lastRenderableDate || a
+          };
+        return d
+      }).$inject = ["$locale", "$filter"], e.provider("$mdDateLocale", new t)
+    }]), be.module("material.components.datepicker").factory("$$mdDateUtil", ["$mdDateLocale", function(o) {
+      return {
+        getFirstDateOfMonth: n,
+        getNumberOfDaysInMonth: r,
+        getDateInNextMonth: i,
+        getDateInPreviousMonth: a,
+        isInNextMonth: function(e, t) {
+          return d(i(e), t)
+        },
+        isInPreviousMonth: function(e, t) {
+          var n = a(e);
+          return d(t, n)
+        },
+        getDateMidpoint: function(e, t) {
+          return m((e.getTime() + t.getTime()) / 2)
+        },
+        isSameMonthAndYear: d,
+        getWeekOfMonth: function(e) {
+          var t = n(e);
+          return Math.floor((t.getDay() + e.getDate() - 1) / 7)
+        },
+        incrementDays: function(e, t) {
+          return new Date(e.getFullYear(), e.getMonth(), e.getDate() + t)
+        },
+        incrementMonths: s,
+        getLastDateOfMonth: function(e) {
+          return new Date(e.getFullYear(), e.getMonth(), r(e))
+        },
+        isSameDay: function(e, t) {
+          return e.getDate() == t.getDate() && d(e, t)
+        },
+        getMonthDistance: function(e, t) {
+          return 12 * (t.getFullYear() - e.getFullYear()) + (t.getMonth() - e.getMonth())
+        },
+        isValidDate: l,
+        setDateTimeToMidnight: c,
+        createDateAtMidnight: m,
+        isDateWithinRange: function(e, t, n) {
+          var o = m(e),
+            r = l(t) ? m(t) : null,
+            i = l(n) ? m(n) : null;
+          return (!r || r <= o) && (!i || o <= i)
+        },
+        incrementYears: function(e, t) {
+          return s(e, 12 * t)
+        },
+        getYearDistance: function(e, t) {
+          return t.getFullYear() - e.getFullYear()
+        },
+        clampDate: function(e, t, n) {
+          var o = e;
+          return t && e < t && (o = new Date(t.getTime())), n && n < e && (o = new Date(n.getTime())), o
+        },
+        getTimestampFromNode: function(e) {
+          if (e && e.hasAttribute("data-timestamp")) return Number(e.getAttribute("data-timestamp"))
+        },
+        isMonthWithinRange: function(e, t, n) {
+          var o = e.getMonth(),
+            r = e.getFullYear();
+          return (!t || t.getFullYear() < r || t.getMonth() <= o) && (!n || n.getFullYear() > r || n.getMonth() >= o)
+        },
+        removeLocalTzAndReparseDate: function(e) {
+          var t, n;
+          return t = new Date(e.getTime() + 6e4 * e.getTimezoneOffset()), n = o.formatDate(t), o.parseDate(n)
+        }
+      };
+
+      function n(e) {
+        return new Date(e.getFullYear(), e.getMonth(), 1)
+      }
+
+      function r(e) {
+        return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate()
+      }
+
+      function i(e) {
+        return new Date(e.getFullYear(), e.getMonth() + 1, 1)
+      }
+
+      function a(e) {
+        return new Date(e.getFullYear(), e.getMonth() - 1, 1)
+      }
+
+      function d(e, t) {
+        return e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth()
+      }
+
+      function s(e, t) {
+        var n = new Date(e.getFullYear(), e.getMonth() + t, 1),
+          o = r(n);
+        return o < e.getDate() ? n.setDate(o) : n.setDate(e.getDate()), n
+      }
+
+      function l(e) {
+        return e && e.getTime && !isNaN(e.getTime())
+      }
+
+      function c(e) {
+        l(e) && e.setHours(0, 0, 0, 0)
+      }
+
+      function m(e) {
+        var t;
+        return c(t = be.isDate(e) ? e : be.isNumber(e) ? new Date(e) : new Date), t
+      }
+    }]),
+    function() {
+      function e(l, m, u, p) {
+        return {
+          template: function(e, t) {
+            var n = t.mdHideIcons,
+              o = t.inputAriaDescribedby,
+              r = t.inputAriaLabelledby,
+              i = t.ariaLabel || t.mdPlaceholder,
+              a = t.ngModelOptions,
+              d = "all" === n || "calendar" === n ? "" : '<md-button class="md-datepicker-button md-icon-button" type="button" tabindex="-1" aria-hidden="true" ng-click="ctrl.openCalendarPane($event)"><md-icon class="md-datepicker-calendar-icon" aria-label="md-calendar" md-svg-src="' + l.mdCalendar + '"></md-icon></md-button>',
+              s = "";
+          },
+          require: ["ngModel", "mdDatepicker", "?^mdInputContainer", "?^form"],
+          scope: {
+            minDate: "=mdMinDate",
+            maxDate: "=mdMaxDate",
+            placeholder: "@mdPlaceholder",
+            currentView: "@mdCurrentView",
+            mode: "@mdMode",
+            dateFilter: "=mdDateFilter",
+            monthFilter: "=mdMonthFilter",
+            isOpen: "=?mdIsOpen",
+            debounceInterval: "=mdDebounceInterval",
+            dateLocale: "=mdDateLocale"
+          },
+          controller: t,
+          controllerAs: "ctrl",
+          bindToController: !0,
+          link: function(e, t, n, o) {
+            var r = o[0],
+              i = o[1],
+              a = o[2],
+              d = o[3],
+              s = m.parseAttributeBoolean(n.mdNoAsterisk);
+            if (i.configureNgModel(r, a, p), a) {
+              var l = t[0].querySelector(".md-errors-spacer");
+              l && t.after(be.element("<div>").append(l)), a.setHasPlaceholder(n.mdPlaceholder), a.input = t, a.element.addClass(h).toggleClass(f, "calendar" !== n.mdHideIcons && "all" !== n.mdHideIcons), a.label ? s || n.$observe("required", function(e) {
+                a.label.toggleClass("md-required", !!e)
+              }) : u.expect(t, "aria-label", n.mdPlaceholder), e.$watch(a.isErrorGetter || function() {
+                return r.$invalid && (r.$touched || d && d.$submitted)
+              }, a.setInvalid)
+            } else if (d) var c = e.$watch(function() {
+              return d.$submitted
+            }, function(e) {
+              e && (i.updateErrorState(), c())
+            })
+          }
+        }
+      }
+      t.$inject = ["$scope", "$element", "$attrs", "$window", "$mdConstant", "$mdTheming", "$mdUtil", "$mdDateLocale", "$$mdDateUtil", "$$rAF", "$filter", "$timeout"], e.$inject = ["$$mdSvgRegistry", "$mdUtil", "$mdAria", "inputDirective"], be.module("material.components.datepicker").directive("mdDatepicker", e);
+      var a = "md-datepicker-invalid",
+        m = "md-datepicker-open",
+        h = "_md-datepicker-floating-label",
+        f = "_md-datepicker-has-calendar-icon",
+        c = "_md-datepicker-has-triangle-icon",
+        p = /ipad|iphone|ipod|android/i;
+
+      function t(e, t, n, o, r, i, a, d, s, l, c, m) {
+        var u = this;
+        e.$on("$destroy", function() {
+          u.detachCalendarPane()
+        }), n.mdIsOpen && e.$watch("ctrl.isOpen", function(e) {
+          e ? u.openCalendarPane({
+            target: u.inputElement
+          }) : u.closeCalendarPane()
+        }), 1 === be.version.major && be.version.minor <= 4 && this.$onInit()
+      }
+      t.prototype.$onInit = function() {
+        this.locale = this.dateLocale ? be.extend({}, this.$mdDateLocale, this.dateLocale) : this.$mdDateLocale, this.installPropertyInterceptors(), this.attachChangeListeners(), this.attachInteractionListeners()
+      }, t.prototype.configureNgModel = function(e, t, n) {
+        this.ngModelCtrl = e, this.mdInputContainer = t, this.$attrs.$set("type", "date"), n[0].link.pre(this.$scope, {
+          on: be.noop,
+          val: be.noop,
+          0: {}
+        }, this.$attrs, [e]);
+        var o = this;
+        o.ngModelCtrl.$formatters.push(function(e) {
+          var t = be.isDefined(e) ? e : null;
+          if (!(e instanceof Date) && (t = Date.parse(e), !isNaN(t) && be.isNumber(t) && (e = new Date(t)), e && !(e instanceof Date))) throw Error("The ng-model for md-datepicker must be a Date instance or a value that can be parsed into a date. Currently the model is of type: " + typeof e);
+          return o.onExternalChange(e), e
+        }), e.$viewChangeListeners.unshift(be.bind(this, this.updateErrorState));
+        var r = o.$mdUtil.getModelOption(e, "updateOn");
+        r && this.ngInputElement.on(r, be.bind(this.$element, this.$element.triggerHandler, r))
+      }, t.prototype.attachChangeListeners = function() {
+        var n = this;
+        n.$scope.$on("md-calendar-change", function(e, t) {
+          n.setModelValue(t), n.onExternalChange(t), n.closeCalendarPane()
+        }), n.ngInputElement.on("input", be.bind(n, n.resizeInputElement));
+        var e = be.isDefined(this.debounceInterval) ? this.debounceInterval : 500;
+        n.ngInputElement.on("input", n.$mdUtil.debounce(n.handleInputEvent, e, n))
+      }, t.prototype.attachInteractionListeners = function() {
+        var t = this,
+          n = this.$scope,
+          o = this.$mdConstant.KEY_CODE;
+        t.ngInputElement.on("keydown", function(e) {
+          e.altKey && e.keyCode === o.DOWN_ARROW && (t.openCalendarPane(e), n.$digest())
+        }), t.openOnFocus && (t.ngInputElement.on("focus", be.bind(t, t.openCalendarPane)), t.ngInputElement.on("click", function(e) {
+          e.stopPropagation()
+        }), t.ngInputElement.on("pointerdown", function(e) {
+          e.target && e.target.setPointerCapture && e.target.setPointerCapture(e.pointerId)
+        }), be.element(t.$window).on("blur", t.windowBlurHandler), n.$on("$destroy", function() {
+          be.element(t.$window).off("blur", t.windowBlurHandler)
+        })), n.$on("md-calendar-close", function() {
+          t.closeCalendarPane()
+        })
+      }, t.prototype.installPropertyInterceptors = function() {
+        var t = this;
+        if (this.$attrs.ngDisabled) {
+          var e = this.$scope.$parent;
+          e && e.$watch(this.$attrs.ngDisabled, function(e) {
+            t.setDisabled(e)
+          })
+        }
+        Object.defineProperty(this, "placeholder", {
+          get: function() {
+            return t.inputElement.placeholder
+          },
+          set: function(e) {
+            t.inputElement.placeholder = e || ""
+          }
+        })
+      }, t.prototype.setDisabled = function(e) {
+        this.isDisabled = e, this.inputElement.disabled = e, this.calendarButton && (this.calendarButton.disabled = e)
+      }, t.prototype.updateErrorState = function(e) {
+        var t;
+        if (t = e ? new Date(e.valueOf()) : be.copy(this.ngModelCtrl.$modelValue), this.clearErrorState(), this.dateUtil.isValidDate(t)) {
+          if (t = this.dateUtil.createDateAtMidnight(t), this.dateUtil.isValidDate(this.minDate)) {
+            var n = this.dateUtil.createDateAtMidnight(this.minDate);
+            this.ngModelCtrl.$setValidity("mindate", n <= t)
+          }
+          if (this.dateUtil.isValidDate(this.maxDate)) {
+            var o = this.dateUtil.createDateAtMidnight(this.maxDate);
+            this.ngModelCtrl.$setValidity("maxdate", t <= o)
+          }
+          be.isFunction(this.dateFilter) && this.ngModelCtrl.$setValidity("filtered", this.dateFilter(t)), be.isFunction(this.monthFilter) && this.ngModelCtrl.$setValidity("filtered", this.monthFilter(t))
+        } else this.ngModelCtrl.$setValidity("valid", null == t);
+        var r = this.inputElement.value,
+          i = this.locale.parseDate(r);
+        !this.isInputValid(r, i) && this.ngModelCtrl.$valid && this.ngModelCtrl.$setValidity("valid", null == t), be.element(this.inputContainer).toggleClass(a, this.ngModelCtrl.$invalid && (this.ngModelCtrl.$touched || this.ngModelCtrl.$submitted))
+      }, t.prototype.isInputValid = function(e, t) {
+        return "" === e || this.dateUtil.isValidDate(t) && this.locale.isDateComplete(e) && this.isDateEnabled(t)
+      }, t.prototype.clearErrorState = function() {
+        this.inputContainer.classList.remove(a), ["mindate", "maxdate", "filtered", "valid"].forEach(function(e) {
+          this.ngModelCtrl.$setValidity(e, !0)
+        }, this)
+      }, t.prototype.resizeInputElement = function() {
+        this.inputElement.size = this.inputElement.value.length + 3
+      }, t.prototype.handleInputEvent = function() {
+        var e = this.inputElement.value,
+          t = e ? this.locale.parseDate(e) : null;
+        this.dateUtil.setDateTimeToMidnight(t), this.isInputValid(e, t) && (this.setModelValue(t), this.date = t), this.updateErrorState(t)
+      }, t.prototype.isDateEnabled = function(e) {
+        return this.dateUtil.isDateWithinRange(e, this.minDate, this.maxDate) && (!be.isFunction(this.dateFilter) || this.dateFilter(e)) && (!be.isFunction(this.monthFilter) || this.monthFilter(e))
+      }, t.prototype.attachCalendarPane = function() {
+        var e = this.calendarPane,
+          t = document.body;
+        e.style.transform = "", this.$element.addClass(m), this.mdInputContainer && this.mdInputContainer.element.addClass(m), be.element(t).addClass("md-datepicker-is-showing");
+        var n = this.inputContainer.getBoundingClientRect(),
+          o = t.getBoundingClientRect();
+        (!this.topMargin || this.topMargin < 0) && (this.topMargin = (this.inputMask.parent().prop("clientHeight") - this.ngInputElement.prop("clientHeight")) / 2);
+        var r = n.top - o.top - this.topMargin,
+          i = n.left - o.left - this.leftMargin,
+          a = o.top < 0 && 0 === document.body.scrollTop ? -o.top : document.body.scrollTop,
+          d = o.left < 0 && 0 === document.body.scrollLeft ? -o.left : document.body.scrollLeft,
+          s = a + this.$window.innerHeight,
+          l = d + this.$window.innerWidth;
+        if (this.inputMask.css({
+            position: "absolute",
+            left: this.leftMargin + "px",
+            top: this.topMargin + "px",
+            width: n.width - 1 + "px",
+            height: n.height - 2 + "px"
+          }), l < i + 360) {
+          if (0 < l - 360) i = l - 360;
+          else {
+            i = d;
+            var c = this.$window.innerWidth / 360;
+            e.style.transform = "scale(" + c + ")"
+          }
+          e.classList.add("md-datepicker-pos-adjusted")
+        }
+        s < r + 368 && a < s - 368 && (r = s - 368, e.classList.add("md-datepicker-pos-adjusted")), e.style.left = i + "px", e.style.top = r + "px", document.body.appendChild(e), this.$$rAF(function() {
+          e.classList.add("md-pane-open")
+        })
+      }, t.prototype.detachCalendarPane = function() {
+        this.$element.removeClass(m), this.mdInputContainer && this.mdInputContainer.element.removeClass(m), be.element(document.body).removeClass("md-datepicker-is-showing"), this.calendarPane.classList.remove("md-pane-open"), this.calendarPane.classList.remove("md-datepicker-pos-adjusted"), this.isCalendarOpen && this.$mdUtil.enableScrolling(), this.calendarPane.parentNode && this.calendarPane.parentNode.removeChild(this.calendarPane)
+      }, t.prototype.openCalendarPane = function(e) {
+        if (this.isCalendarOpen || this.isDisabled || this.inputFocusedOnWindowBlur) this.inputFocusedOnWindowBlur && this.resetInputFocused();
+        else {
+          this.isCalendarOpen = this.isOpen = !0, this.calendarPaneOpenedFrom = e.target, this.$mdUtil.disableScrollAround(this.calendarPane), this.attachCalendarPane(), this.focusCalendar(), this.evalAttr("ngFocus");
+          var t = this;
+          this.$mdUtil.nextTick(function() {
+            t.documentElement.on("click touchstart", t.bodyClickHandler)
+          }, !1), L.addEventListener(this.windowEventName, this.windowEventHandler)
+        }
+      }, t.prototype.closeCalendarPane = function() {
+        if (this.isCalendarOpen) {
+          var e = this;
+          e.detachCalendarPane(), e.ngModelCtrl.$setTouched(), e.evalAttr("ngBlur"), e.documentElement.off("click touchstart", e.bodyClickHandler), L.removeEventListener(e.windowEventName, e.windowEventHandler), e.calendarPaneOpenedFrom.focus(), e.calendarPaneOpenedFrom = null, e.openOnFocus ? e.$timeout(t) : t()
+        }
+
+        function t() {
+          e.isCalendarOpen = e.isOpen = !1
+        }
+      }, t.prototype.getCalendarCtrl = function() {
+        return be.element(this.calendarPane.querySelector("md-calendar")).controller("mdCalendar")
+      }, t.prototype.focusCalendar = function() {
+        var e = this;
+        this.$mdUtil.nextTick(function() {
+          e.getCalendarCtrl().focusDate(e.date)
+        }, !1)
+      }, t.prototype.setFocused = function(e) {
+        e || this.ngModelCtrl.$setTouched(), this.openOnFocus || this.evalAttr(e ? "ngFocus" : "ngBlur"), this.isFocused = e
+      }, t.prototype.handleBodyClick = function(e) {
+        this.isCalendarOpen && (this.$mdUtil.getClosest(e.target, "md-calendar") || this.closeCalendarPane(), this.$scope.$digest())
+      }, t.prototype.handleWindowBlur = function() {
+        this.inputFocusedOnWindowBlur = document.activeElement === this.inputElement
+      }, t.prototype.resetInputFocused = function() {
+        this.inputFocusedOnWindowBlur = !1
+      }, t.prototype.evalAttr = function(e) {
+        this.$attrs[e] && this.$scope.$parent.$eval(this.$attrs[e])
+      }, t.prototype.setModelValue = function(e) {
+        var t = this.$mdUtil.getModelOption(this.ngModelCtrl, "timezone");
+        null == t || null == e || e.getTimezoneOffset() < 0 ? this.ngModelCtrl.$setViewValue(this.ngDateFilter(e, "yyyy-MM-dd"), "default") : this.ngModelCtrl.$setViewValue(this.ngDateFilter(e, "yyyy-MM-dd", t), "default")
+      }, t.prototype.onExternalChange = function(e) {
+        var t = this,
+          n = this.$mdUtil.getModelOption(this.ngModelCtrl, "timezone");
+        this.dateUtil.isValidDate(e) && null != n && 0 <= e.getTimezoneOffset() ? this.date = this.dateUtil.removeLocalTzAndReparseDate(e) : this.date = e, null == n || null == e || e.getTimezoneOffset() < 0 ? this.inputElement.value = this.locale.formatDate(e) : this.inputElement.value = this.locale.formatDate(e, n), this.mdInputContainer && this.mdInputContainer.setHasValue(!!e), this.resizeInputElement(), this.$mdUtil.nextTick(function() {
+          t.updateErrorState()
+        }, !1, t.$scope)
+      }
+    function() {
+      e.$inject = ["$timeout"], t.$inject = ["$timeout"];
+      var n = 300;
+
+      function e(t) {
+        function o(e) {
+          t(e, n, !1)
+        }
+
+        function r(e) {
+          if (!e.hasClass("md-animations-waiting") || e.hasClass("_md-animations-ready")) {
+            var t = e[0],
+              s = e.controller("mdFabSpeedDial"),
+              o = t.querySelectorAll(".md-fab-action-item"),
+              l = t.querySelector("md-fab-trigger"),
+              n = t.querySelector("._md-css-variables"),
+              r = parseInt(L.getComputedStyle(n).zIndex);
+            be.forEach(o, function(e, t) {
+              var n = e.style;
+              n.transform = n.webkitTransform = "", n.transitionDelay = "", n.opacity = s.isOpen ? 1 : 0, n.zIndex = o.length - t + r
+            }), l.style.zIndex = r + o.length + 1, s.isOpen || be.forEach(o, function(e, t) {
+              var n, o, r = e.style,
+                i = (l.clientHeight - e.clientHeight) / 2,
+                a = (l.clientWidth - e.clientWidth) / 2;
+              switch (s.direction) {
+                case "up":
+                  n = e.scrollHeight * (t + 1) + i, o = "Y";
+                  break;
+                case "down":
+                  n = -(e.scrollHeight * (t + 1) + i), o = "Y";
+                  break;
+                case "left":
+                  n = e.scrollWidth * (t + 1) + a, o = "X";
+                  break;
+                case "right":
+                  n = -(e.scrollWidth * (t + 1) + a), o = "X"
+              }
+              var d = "translate" + o + "(" + n + "px)";
+              r.transform = r.webkitTransform = d
+            })
+          }
+        }
+        return {
+          addClass: function(e, t, n) {
+            e.hasClass("md-fling") ? (r(e), o(n)) : n()
+          },
+          removeClass: function(e, t, n) {
+            r(e), o(n)
+          }
+        }
+      }
+
+      function t(t) {
+        function o(e) {
+          t(e, n, !1)
+        }
+
+        function r(e) {
+          var t = e[0],
+            r = e.controller("mdFabSpeedDial"),
+            i = t.querySelectorAll(".md-fab-action-item"),
+            n = t.querySelector("._md-css-variables"),
+            a = parseInt(L.getComputedStyle(n).zIndex);
+          be.forEach(i, function(e, t) {
+            var n = e.style,
+              o = 65 * t;
+            n.opacity = r.isOpen ? 1 : 0, n.transform = n.webkitTransform = r.isOpen ? "scale(1)" : "scale(0)", n.transitionDelay = (r.isOpen ? o : i.length - o) + "ms", n.zIndex = i.length - t + a
+          })
+        }
+        return {
+          addClass: function(e, t, n) {
+            r(e), o(n)
+          },
+          removeClass: function(e, t, n) {
+            r(e), o(n)
+          }
+        }
+      }
+      be.module("material.components.fabSpeedDial", ["material.core", "material.components.fabShared", "material.components.fabActions"]).directive("mdFabSpeedDial", function() {
+        return {
+          restrict: "E",
+          scope: {
+            direction: "@?mdDirection",
+            isOpen: "=?mdOpen"
+          },
+          bindToController: !0,
+          controller: "MdFabController",
+          controllerAs: "ctrl",
+          link: function(e, t) {
+            t.prepend('<div class="_md-css-variables"></div>')
+          }
+        }
+      }).animation(".md-fling", e).animation(".md-scale", t).service("mdFabSpeedDialFlingAnimation", e).service("mdFabSpeedDialScaleAnimation", t)
+    }(), be.module("material.components.fabToolbar", ["material.core", "material.components.fabShared", "material.components.fabActions"]).directive("mdFabToolbar", function() {
+      return {
+        restrict: "E",
+        transclude: !0,
+        template: '<div class="md-fab-toolbar-wrapper">  <div class="md-fab-toolbar-content" ng-transclude></div></div>',
+        scope: {
+          direction: "@?mdDirection",
+          isOpen: "=?mdOpen"
+        },
+        bindToController: !0,
+        controller: "MdFabController",
+        controllerAs: "ctrl",
+        link: function(e, t, n) {
+          t.addClass("md-fab-toolbar"), t.find("md-fab-trigger").find("button").prepend('<div class="md-fab-toolbar-background"></div>')
+        }
+      }
+    }).animation(".md-fab-toolbar", Ce).service("mdFabToolbarAnimation", Ce), Ae.$inject = ["$mdUtil"], we.$inject = ["$mdUtil"], Te.$inject = ["$interpolate", "$mdConstant", "$mdGridLayout", "$mdMedia", "$mdUtil"], _e.$inject = ["$mdMedia"], be.module("material.components.gridList", ["material.core"]).directive("mdGridList", Te).directive("mdGridTile", _e).directive("mdGridTileFooter", ke).directive("mdGridTileHeader", ke).factory("$mdGridLayout", we), Ae.prototype = {
+      invalidateTiles: function() {
+        this.tilesInvalidated = !0, this.invalidateLayout()
+      },
+      invalidateLayout: function() {
+        this.layoutInvalidated || (this.layoutInvalidated = !0, this.$timeout_(be.bind(this, this.layout)))
+      },
+      layout: function() {
+        try {
+          this.layoutDelegate(this.tilesInvalidated)
+        } finally {
+          this.layoutInvalidated = !1, this.tilesInvalidated = !1
+        }
+      }
+    }, be.module("material.components.icon", ["material.core"]), be.module("material.components.icon").directive("mdIcon", ["$mdIcon", "$mdTheming", "$mdAria", "$sce", function(d, s, l, e) {
+      return {
+        restrict: "E",
+        link: function(e, t, n) {
+          s(t);
+          var o = n.mdFontIcon,
+            r = d.fontSet(n.mdFontSet);
+          n.mdSvgIcon || n.mdSvgSrc || (n.mdFontIcon && t.addClass("md-font " + n.mdFontIcon), t.addClass(r)), n.$observe("mdFontIcon", a), n.$observe("mdFontSet", a), n.role || (l.expect(t, "role", "img"), n.role = "img"), t[0].hasAttribute("aria-label") && "" === n.ariaLabel && t.attr("aria-hidden", !0), "img" !== n.role || n.ariaHidden || l.hasAriaLabel(t) || (t[0].hasAttribute("alt") && "" === n.alt ? t.attr("aria-hidden", !0) : n.alt ? l.expect(t, "aria-label", n.alt) : l.parentHasAriaLabel(t, 2) ? l.expect(t, "aria-hidden", "true") : n.mdFontIcon || n.mdSvgIcon || t.text() ? l.expect(t, "aria-label", n.mdFontIcon || n.mdSvgIcon || t.text()) : l.expect(t, "aria-hidden", "true"));
+          var i = n.$normalize(n.$attr.mdSvgIcon || n.$attr.mdSvgSrc || "");
+
+          function a() {
+            if (!n.mdSvgIcon && !n.mdSvgSrc) {
+              n.mdFontIcon && (t.removeClass(o), t.addClass(n.mdFontIcon), o = n.mdFontIcon);
+              var e = d.fontSet(n.mdFontSet);
+              r !== e && (t.removeClass(r), t.addClass(e), r = e)
+            }
+          }
+          i && n.$observe(i, function(e) {
+            t.empty(), e && d(e).then(function(e) {
+              t.empty(), t.append(e)
+            })
+          })
+        }
+      }
+    }]),
+    function() {
+      a.$inject = ["config", "$templateRequest", "$q", "$log", "$mdUtil", "$sce"], be.module("material.components.icon").constant("$$mdSvgRegistry", {
+        mdTabsArrow: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=",
+        mdClose: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik0xOSA2LjQxbC0xLjQxLTEuNDEtNS41OSA1LjU5LTUuNTktNS41OS0xLjQxIDEuNDEgNS41OSA1LjU5LTUuNTkgNS41OSAxLjQxIDEuNDEgNS41OS01LjU5IDUuNTkgNS41OSAxLjQxLTEuNDEtNS41OS01LjU5eiIvPjwvZz48L3N2Zz4=",
+        mdCancel: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik0xMiAyYy01LjUzIDAtMTAgNC40Ny0xMCAxMHM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTAtNC40Ny0xMC0xMC0xMHptNSAxMy41OWwtMS40MSAxLjQxLTMuNTktMy41OS0zLjU5IDMuNTktMS40MS0xLjQxIDMuNTktMy41OS0zLjU5LTMuNTkgMS40MS0xLjQxIDMuNTkgMy41OSAzLjU5LTMuNTkgMS40MSAxLjQxLTMuNTkgMy41OSAzLjU5IDMuNTl6Ii8+PC9nPjwvc3ZnPg==",
+        mdMenu: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0zLDZIMjFWOEgzVjZNMywxMUgyMVYxM0gzVjExTTMsMTZIMjFWMThIM1YxNloiIC8+PC9zdmc+",
+        mdToggleArrow: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiPjxwYXRoIGQ9Ik0yNCAxNmwtMTIgMTIgMi44MyAyLjgzIDkuMTctOS4xNyA5LjE3IDkuMTcgMi44My0yLjgzeiIvPjxwYXRoIGQ9Ik0wIDBoNDh2NDhoLTQ4eiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==",
+        mdCalendar: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgM2gtMVYxaC0ydjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY4aDE0djExek03IDEwaDV2NUg3eiIvPjwvc3ZnPg==",
+        mdChecked: "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz48L2c+PC9zdmc+"
+      }).provider("$mdIcon", e);
+      var i = {
+        defaultViewBoxSize: 24,
+        defaultFontSet: "material-icons",
+        fontSets: []
+      };
+
+      function e() {}
+
+      function o(e, t) {
+        this.url = e, this.viewBoxSize = t || i.defaultViewBoxSize
+      }
+
+      function a(a, i, d, s, c, t) {
+        var n = {},
+          l = {},
+          o = /[-\w@:%+.~#?&//=]{2,}\.[a-z]{2,4}\b(\/[-\w@:%+.~#?&//=]*)?/i,
+          m = /^data:image\/svg\+xml[\s*;\w\-=]*?(base64)?,(.*)$/i;
+        return g.prototype = {
+          clone: function() {
+            return this.element.cloneNode(!0)
+          },
+          prepare: function() {
+            var e = this.config ? this.config.viewBoxSize : a.defaultViewBoxSize;
+            be.forEach({
+              fit: "",
+              height: "100%",
+              width: "100%",
+              preserveAspectRatio: "xMidYMid meet",
+              viewBox: this.element.getAttribute("viewBox") || "0 0 " + e + " " + e,
+              focusable: !1
+            }, function(e, t) {
+              this.element.setAttribute(t, e)
+            }, this)
+          }
+        }, e.fontSet = function(t) {
+          if (be.isUndefined(t) || !t || !t.length) return a.defaultFontSet;
+          var n = t;
+          return be.forEach(a.fontSets, function(e) {
+            e.alias === t && (n = e.fontSet || n)
+          }), n
+        }, e;
+
+        function e(e) {
+          return e = e || "", be.isString(e) || (e = t.getTrustedUrl(e)), n[e] ? d.when(r(n[e])) : o.test(e) || m.test(e) ? b(e).then(p(e)) : (-1 === e.indexOf(":") && (e = "$default:" + e), (a[e] ? h : f)(e).then(p(e)))
+        }
+
+        function r(e) {
+          var n, o, r, i, a = e.clone(),
+            d = c.nextUid(),
+            s = ["clip-path", "color-profile", "cursor", "fill", "filter", "href", "marker-start", "marker-mid", "marker-end", "mask", "stroke", "style", "vector-effect"],
+            l = a.innerHTML === ge;
+          if (!isFinite(Number(d))) throw new Error("Unsafe and unexpected non-number result from $mdUtil.nextUid().");
+          return n = "_cache" + d, a.id && (a.id += n), be.forEach(a.querySelectorAll("[id]"), function(t) {
+            for (o = "", r = 0; r < s.length; r++) o += "[" + s[r] + '="url(#' + t.id + ')"]', r + 1 < s.length && (o += ", ");
+            be.forEach(a.querySelectorAll(o), function(e) {
+              u(t, e, l, d)
+            }), be.forEach(a.querySelectorAll("style"), function(e) {
+              u(t, e, l, d)
+            }), be.forEach(a.querySelectorAll("[*|href]:not([href])"), function(e) {
+              (i = e.getAttribute("xlink:href")) && (i = i.replace("#" + t.id, "#" + t.id + n), e.setAttribute("xlink:href", i))
+            }), t.id += n
+          }), a
+        }
+
+        function u(e, t, n, o) {
+          var r, i;
+          if (!isFinite(Number(o))) throw new Error("Unsafe and unexpected non-number result for newUid.");
+          i = "_cache" + o, n ? (r = (r = c.getOuterHTML(t)).replace("url(#" + e.id + ")", "url(#" + e.id + i + ")"), t.textContent = be.element(r)[0].innerHTML) : t.outerHTML = t.outerHTML.replace("url(#" + e.id + ")", "url(#" + e.id + i + ")")
+        }
+
+        function p(t) {
+          return function(e) {
+            return n[t] = function(e) {
+              return be.isDefined(e.element) && be.isDefined(e.config)
+            }(e) ? e : new g(e, a[t]), r(n[t])
+          }
+        }
+
+        function h(e) {
+          var t = a[e];
+          return b(t.url).then(function(e) {
+            return new g(e, t)
+          })
+        }
+
+        function f(o) {
+          var e = o.substring(0, o.lastIndexOf(":")) || "$default",
+            r = a[e];
+          return r ? b(r.url).then(function(e) {
+            var t = o.slice(o.lastIndexOf(":") + 1),
+              n = e.querySelector("#" + t);
+            return n ? new g(n, r) : i(o)
+          }) : i(o);
+
+          function i(e) {
+            var t = "icon " + e + " not found";
+            return s.warn(t), d.reject(t || e)
+          }
+        }
+
+        function b(e) {
+          return m.test(e) ? (t = e, n = m.exec(t), r = /base64/i.test(t) ? L.atob(n[2]) : n[2], d.when(be.element(r)[0])) : (o = e, d(function(t, n) {
+            i(o, !0).then(function(e) {
+              l[o] || (l[o] = be.element("<div>").append(e)[0].querySelector("svg")), t(l[o])
+            }, function(e) {
+              var t = be.isString(e) ? e : e.message || e.data || e.statusText;
+              s.warn(t), n(e)
+            })
+          }));
+          var o, t, n, r
+        }
+
+        function g(e, t) {
+          if (e && "symbol" === e.tagName.toLowerCase()) {
+            var n = e.getAttribute("viewBox");
+            e = e.innerHTML ? be.element('<svg xmlns="http://www.w3.org/2000/svg">').html(e.innerHTML)[0] : be.element('<svg xmlns="http://www.w3.org/2000/svg">').append(c.getInnerHTML(e))[0], n && e.setAttribute("viewBox", n)
+          }
+          e && "svg" !== e.tagName.toLowerCase() && (e = be.element('<svg xmlns="http://www.w3.org/2000/svg">').append(e.cloneNode(!0))[0]), e.getAttribute("xmlns") || e.setAttribute("xmlns", "http://www.w3.org/2000/svg"), this.element = e, this.config = t, this.prepare()
+        }
+      }
+      e.prototype = {
+        icon: function(e, t, n) {
+          return -1 == e.indexOf(":") && (e = "$default:" + e), i[e] = new o(t, n), this
+        },
+        iconSet: function(e, t, n) {
+          return i[e] = new o(t, n), this
+        },
+        defaultIconSet: function(e, t) {
+          var n = "$default";
+          return i[n] || (i[n] = new o(e, t)), i[n].viewBoxSize = t || i.defaultViewBoxSize, this
+        },
+        defaultViewBoxSize: function(e) {
+          return i.defaultViewBoxSize = e, this
+        },
+        fontSet: function(e, t) {
+          return i.fontSets.push({
+            alias: e,
+            fontSet: t || e
+          }), this
+        },
+        defaultFontSet: function(e) {
+          return i.defaultFontSet = e || "", this
+        },
+        defaultIconSize: function(e) {
+          return i.defaultIconSize = e, this
+        },
+        $get: ["$templateRequest", "$q", "$log", "$mdUtil", "$sce", function(e, t, n, o, r) {
+          return a(i, e, t, n, o, r)
+        }]
+      }
+    }(),
+    function() {
+      t.$inject = ["$mdTheming", "$parse", "$$rAF"], n.$inject = ["$mdUtil", "$window", "$mdAria", "$timeout", "$mdGesture"], o.$inject = ["$animate", "$mdUtil"], r.$inject = ["$compile"], c.$inject = ["$mdUtil"], i.$inject = ["$document", "$timeout"], m.$inject = ["$$AnimateRunner", "$animateCss", "$mdUtil"], u.$inject = ["$$AnimateRunner", "$animateCss", "$mdUtil"], p.$inject = ["$$AnimateRunner", "$animateCss", "$mdUtil", "$log"];
+      var e = be.module("material.components.input", ["material.core"]).directive("mdInputContainer", t).directive("label", function() {
+        return {
+          restrict: "E",
+          require: "^?mdInputContainer",
+          link: function(e, t, n, o) {
+            !o || n.mdNoFloat || t.hasClass("md-container-ignore") || (o.label = t, e.$on("$destroy", function() {
+              o.label = null
+            }))
+          }
+        }
+      }).directive("input", n).directive("textarea", n).directive("mdMaxlength", o).directive("placeholder", r).directive("ngMessages", function() {
+        return {
+          restrict: "EA",
+          link: function(e, t, n, o) {
+            if (!o) return;
+            t.toggleClass("md-input-messages-animation", !0), t.toggleClass("md-auto-hide", !0), "false" != n.mdAutoHide && ! function(t) {
+              return l.some(function(e) {
+                return t[e]
+              })
+            }(n) || t.toggleClass("md-auto-hide", !1)
+          },
+          require: "^^?mdInputContainer"
+        }
+      }).directive("ngMessage", c).directive("ngMessageExp", c).directive("mdSelectOnFocus", i).animation(".md-input-invalid", m).animation(".md-input-messages-animation", u).animation(".md-input-message-animation", p);
+
+      function t(r, i, a) {
+        n.$inject = ["$scope", "$element", "$attrs", "$animate"];
+        var e = ["INPUT", "TEXTAREA", "SELECT", "MD-SELECT"],
+          t = e.reduce(function(e, t) {
+            return e.concat(["md-icon ~ " + t, ".md-icon ~ " + t])
+          }, []).join(","),
+          d = e.reduce(function(e, t) {
+            return e.concat([t + " ~ md-icon", t + " ~ .md-icon"])
+          }, []).join(",");
+        return {
+          restrict: "E",
+          compile: function(e) {
+            var n = e[0].querySelector(t),
+              o = e[0].querySelector(d);
+            return function(e, t) {
+              r(t), (n || o) && a(function() {
+                var e = t[0].querySelector("md-icon") || t[0].querySelector(".md-icon");
+                n && e && t.addClass("md-icon-left"), o && e && t.addClass("md-icon-right")
+              })
+            }
+          },
+          controller: n
+        };
+
+        function n(e, t, n, o) {
+          var r = this;
+          t.addClass("md-auto-horizontal-margin"), r.isErrorGetter = n.mdIsError && i(n.mdIsError), r.delegateClick = function() {
+            r.input.focus()
+          }, r.element = t, r.setFocused = function(e) {
+            t.toggleClass("md-input-focused", !!e)
+          }, r.setHasValue = function(e) {
+            t.toggleClass("md-input-has-value", !!e)
+          }, r.setHasPlaceholder = function(e) {
+            t.toggleClass("md-input-has-placeholder", !!e)
+          }, r.setInvalid = function(e) {
+            e ? o.addClass(t, "md-input-invalid") : o.removeClass(t, "md-input-invalid")
+          }, e.$watch(function() {
+            return r.label && r.input
+          }, function(e) {
+            e && !r.label.attr("for") && r.label.attr("for", r.input.attr("id"))
+          })
+        }
+      }
+
+      function n(b, g, E, v, $) {
+        return {
+          restrict: "E",
+          require: ["^?mdInputContainer", "?ngModel", "?^form"],
+          link: function(c, m, u, e) {
+            var p = e[0],
+              h = !!e[1],
+              f = e[1] || b.fakeNgModel(),
+              t = e[2],
+              n = be.isDefined(u.readonly),
+              o = b.parseAttributeBoolean(u.mdNoAsterisk),
+              r = m[0].tagName.toLowerCase();
+            if (!p) return; {
+              if ("hidden" === u.type) return void m.attr("aria-hidden", "true");
+              if (p.input) {
+                if (p.input[0].contains(m[0])) return;
+                throw new Error("<md-input-container> can only have *one* <input>, <textarea> or <md-select> child element!")
+              }
+            }
+            p.input = m, p.label && u.$observe("required", function(e) {
+              p.label && p.label.toggleClass("md-required", e && !o)
+            });
+            var i = be.element('<div class="md-errors-spacer">');
+            m.after(i);
+            var a = be.isString(u.placeholder) ? u.placeholder.trim() : "";
+            p.label || a.length || E.expect(m, "aria-label");
+            m.addClass("md-input"), m.attr("id") || m.attr("id", "input_" + b.nextUid());
+            "input" === r && "number" === u.type && u.min && u.max && !u.step ? m.attr("step", "any") : "textarea" === r && function() {
+              var t = !u.hasOwnProperty("mdNoAutogrow");
+              if (function() {
+                  if (u.hasOwnProperty("mdNoResize")) return;
+                  var e = be.element('<div class="md-resize-handle"></div>'),
+                    t = !1,
+                    n = 0,
+                    o = p.element,
+                    r = $.register(e, "drag", {
+                      horizontal: !1
+                    });
+
+                  function i(e) {
+                    e.preventDefault(), t = !0, e.clientY, n = parseFloat(m.css("height")) || m.prop("offsetHeight")
+                  }
+
+                  function a(e) {
+                    t && (e.preventDefault(), l(), o.addClass("md-input-resized"))
+                  }
+
+                  function d(e) {
+                    t && m.css("height", n + e.pointer.distanceY + "px")
+                  }
+
+                  function s(e) {
+                    t && (t = !1, o.removeClass("md-input-resized"))
+                  }
+                  m.wrap('<div class="md-resize-wrapper">').after(e), e.on("mousedown", i), o.on("$md.dragstart", a).on("$md.drag", d).on("$md.dragend", s), c.$on("$destroy", function() {
+                    e.off("mousedown", i).remove(), o.off("$md.dragstart", a).off("$md.drag", d).off("$md.dragend", s), r(), r = o = e = null
+                  })
+                }(), !t) return;
+              var o = u.hasOwnProperty("rows") ? parseInt(u.rows) : NaN,
+                r = u.hasOwnProperty("maxRows") ? parseInt(u.maxRows) : NaN,
+                n = c.$on("md-resize-textarea", d),
+                i = null,
+                a = m[0];
+              v(function() {
+                b.nextTick(d)
+              }, 10, !1), m.on("input", d), h && f.$formatters.push(s);
+              o || m.attr("rows", 1);
+
+              function d() {
+                m.attr("rows", 1).css("height", "auto").addClass("md-no-flex");
+                var e = function() {
+                  var e = a.offsetHeight,
+                    t = a.scrollHeight - e;
+                  return e + Math.max(t, 0)
+                }();
+                if (!i) {
+                  var t = m[0].style.padding || "";
+                  i = m.css("padding", 0).prop("offsetHeight"), m[0].style.padding = t
+                }
+                if (o && i && (e = Math.max(e, i * o)), r && i) {
+                  var n = i * r;
+                  n < e ? (m.attr("md-no-autogrow", ""), e = n) : m.removeAttr("md-no-autogrow")
+                }
+                i && m.attr("rows", Math.round(e / i)), m.css("height", e + "px").removeClass("md-no-flex")
+              }
+
+              function s(e) {
+                return b.nextTick(d), e
+              }
+
+              function l() {
+                if (t && (t = !1, be.element(g).off("resize", d), n && n(), m.attr("md-no-autogrow", "").off("input", d), h)) {
+                  var e = f.$formatters.indexOf(s); - 1 < e && f.$formatters.splice(e, 1)
+                }
+              }
+              if (be.element(g).on("resize", d), c.$on("$destroy", l), u.hasOwnProperty("mdDetectHidden")) {
+                var e = function() {
+                  var t = !1;
+                  return function() {
+                    var e = 0 === a.offsetHeight;
+                    !1 == e && !0 === t && d(), t = e
+                  }
+                }();
+                c.$watch(function() {
+                  return b.nextTick(e, !1), !0
+                })
+              }
+            }();
+            h || l();
+            var d = p.isErrorGetter || function() {
+              return f.$invalid && (f.$touched || t && t.$submitted)
+            };
+            c.$watch(d, p.setInvalid), u.ngValue && u.$observe("value", l);
+            f.$parsers.push(s), f.$formatters.push(s), m.on("input", l), n || m.on("focus", function(e) {
+              b.nextTick(function() {
+                p.setFocused(!0)
+              })
+            }).on("blur", function(e) {
+              b.nextTick(function() {
+                p.setFocused(!1), l()
+              })
+            });
+
+            function s(e) {
+              return p.setHasValue(!f.$isEmpty(e)), e
+            }
+
+            function l() {
+              p.setHasValue(0 < m.val().length || (m[0].validity || {}).badInput)
+            }
+            c.$on("$destroy", function() {
+              p.setFocused(!1), p.setHasValue(!1), p.input = null
+            })
+          }
+        }
+      }
+
+      function o(p, h) {
+        return {
+          restrict: "A",
+          require: ["ngModel", "^mdInputContainer"],
+          link: function(e, o, t, n) {
+            var r = parseInt(t.mdMaxlength);
+            isNaN(r) && (r = -1);
+            var i, a, d = n[0],
+              s = n[1],
+              l = !be.isDefined(t.ngTrim) || h.parseAttributeBoolean(t.ngTrim),
+              c = "password" === t.type;
+
+            function m(e) {
+              return (e = l && !c && be.isString(e) ? e.trim() : e) !== ge && null !== e || (e = ""), String(e).length
+            }
+
+            function u() {
+              i && i.parent() && i.text(m(o.val()) + " / " + r)
+            }
+            e.$watch(t.mdMaxlength, function(e) {
+              r = e
+            }), d.$validators["md-maxlength"] = function(e, t) {
+              if (!be.isNumber(r) || r < 0) return !0;
+              u();
+              var n = o.val() || t;
+              return n !== ge && null !== n || (n = ""), n = l && !c && be.isString(n) ? n.trim() : n, String(n).length <= r
+            }, d.$isEmpty = function(e) {
+              return 0 === m(e)
+            }, h.nextTick(function() {
+              a = be.element(s.element[0].querySelector(".md-errors-spacer")), i = be.element('<div class="md-char-counter">'), a.append(i), t.$observe("ngTrim", function(e) {
+                l = !be.isDefined(e) || h.parseAttributeBoolean(e)
+              }), e.$watch(t.mdMaxlength, function(e) {
+                be.isNumber(e) && 0 < e ? (i.parent().length || p.enter(i, a), u()) : p.leave(i)
+              })
+            })
+          }
+        }
+      }
+
+      function r(d) {
+        return {
+          restrict: "A",
+          require: "^^?mdInputContainer",
+          priority: 200,
+          link: {
+            pre: function(e, t, n, o) {
+              if (!o) return;
+              var r = o.element.find("label"),
+                i = o.element.attr("md-no-float");
+              if (r && r.length || "" === i || e.$eval(i)) return void o.setHasPlaceholder(!0);
+              if ("MD-SELECT" !== t[0].nodeName) {
+                var a = be.element('<label ng-click="delegateClick()" tabindex="-1" aria-hidden="true">' + n.placeholder + "</label>");
+                n.$set("placeholder", null), o.element.addClass("md-icon-float").prepend(a), d(a)(e)
+              }
+            }
+          }
+        }
+      }
+
+      function i(a, d) {
+        return {
+          restrict: "A",
+          link: function(e, t, n) {
+            if ("INPUT" !== t[0].nodeName && "TEXTAREA" !== t[0].nodeName) return;
+            var o = !1;
+
+            function r() {
+              d(function() {
+                a[0].activeElement === t[0] && t[0].select(), o = !1
+              }, 1, !(o = !0))
+            }
+
+            function i(e) {
+              o && e.preventDefault()
+            }
+            t.on("focus", r).on("mouseup", i), e.$on("$destroy", function() {
+              t.off("focus", r).off("mouseup", i)
+            })
+          }
+        }
+      }
+      L._mdMocksIncluded && e.service("$$mdInput", function() {
+        return {
+          messages: {
+            getElement: E
+          }
+        }
+      }).service("mdInputInvalidAnimation", m).service("mdInputMessagesAnimation", u).service("mdInputMessageAnimation", p);
+      var a, d, s, l = ["ngIf", "ngShow", "ngHide", "ngSwitchWhen", "ngSwitchDefault"];
+
+      function c(t) {
+        return {
+          restrict: "EA",
+          compile: function(n) {
+            if (o(n)) r(n);
+            else if (function() {
+                var e = n[0];
+                for (; e = e.parentNode;)
+                  if (e.nodeType === Node.DOCUMENT_FRAGMENT_NODE) return !0;
+                return !1
+              }()) return function(e, t) {
+              o(t) && r(n)
+            };
+
+            function o(e) {
+              return !!t.getClosest(e, "md-input-container")
+            }
+
+            function r(e) {
+              e.toggleClass("md-input-message-animation", !0)
+            }
+          },
+          priority: 100
+        }
+      }
+
+      function m(e, t, n) {
+        return v(e, t, n), {
+          addClass: function(e, t, n) {
+            h(e, n)
+          }
+        }
+      }
+
+      function u(e, t, n) {
+        return v(e, t, n), {
+          enter: function(e, t) {
+            h(e, t)
+          },
+          leave: function(e, t) {
+            f(e, t)
+          },
+          addClass: function(e, t, n) {
+            "ng-hide" == t ? f(e, n) : n()
+          },
+          removeClass: function(e, t, n) {
+            "ng-hide" == t ? h(e, n) : n()
+          }
+        }
+      }
+
+      function p(e, t, n, o) {
+        return v(e, t, n), {
+          enter: function(e, t) {
+            b(e).start().done(t)
+          },
+          leave: function(e, t) {
+            g(e).start().done(t)
+          }
+        }
+      }
+
+      function h(e, t) {
+        var n, o = [],
+          r = E(e),
+          i = r.children();
+        0 != r.length && 0 != i.length ? (be.forEach(i, function(e) {
+          n = b(be.element(e)), o.push(n.start())
+        }), a.all(o, t)) : t()
+      }
+
+      function f(e, t) {
+        var n, o = [],
+          r = E(e),
+          i = r.children();
+        0 != r.length && 0 != i.length ? (be.forEach(i, function(e) {
+          n = g(be.element(e)), o.push(n.start())
+        }), a.all(o, t)) : t()
+      }
+
+      function b(e) {
+        var t = parseInt(L.getComputedStyle(e[0]).height),
+          n = parseInt(L.getComputedStyle(e[0]).marginTop),
+          o = E(e),
+          r = function(e) {
+            return e.controller("mdInputContainer").element
+          }(e);
+        return -t < n || o.hasClass("md-auto-hide") && !r.hasClass("md-input-invalid") ? d(e, {}) : d(e, {
+          event: "enter",
+          structural: !0,
+          from: {
+            opacity: 0,
+            "margin-top": -t + "px"
+          },
+          to: {
+            opacity: 1,
+            "margin-top": "0"
+          },
+          duration: .3
+        })
+      }
+
+      function g(e) {
+        var t = e[0].offsetHeight,
+          n = L.getComputedStyle(e[0]);
+        return 0 === parseInt(n.opacity) ? d(e, {}) : d(e, {
+          event: "leave",
+          structural: !0,
+          from: {
+            opacity: 1,
+            "margin-top": 0
+          },
+          to: {
+            opacity: 0,
+            "margin-top": -t + "px"
+          },
+          duration: .3
+        })
+      }
+
+      function E(e) {
+        return e.hasClass("md-input-messages-animation") ? e : e.hasClass("md-input-message-animation") ? be.element(s.getClosest(e, function(e) {
+          return e.classList.contains("md-input-messages-animation")
+        })) : be.element(e[0].querySelector(".md-input-messages-animation"))
+      }
+
+      function v(e, t, n) {
+        a = e, d = t, s = n
+      }
+    function() {
+      e.$inject = ["$scope", "$rootScope", "$element", "$attrs", "$mdConstant", "$document", "$mdUtil", "$timeout"], be.module("material.components.menuBar").controller("MenuBarController", e);
+      var l = ["handleKeyDown", "handleMenuHover", "scheduleOpenHoveredMenu", "cancelScheduledOpen"];
+
+      function e(e, t, n, o, r, i, a, d) {
+        this.$element = n, this.$attrs = o, this.$mdConstant = r, this.$mdUtil = a, this.$document = i, this.$scope = e, this.$rootScope = t, this.$timeout = d;
+        var s = this;
+        be.forEach(l, function(e) {
+          s[e] = be.bind(s, s[e])
+        })
+      }
+      e.prototype.init = function() {
+        var a = this.$element,
+          d = this.$mdUtil,
+          e = this.$scope,
+          s = this,
+          t = [];
+        a.on("keydown", this.handleKeyDown), this.parentToolbar = d.getClosest(a, "MD-TOOLBAR"), t.push(this.$rootScope.$on("$mdMenuOpen", function(e, t) {
+          -1 != s.getMenus().indexOf(t[0]) && (a[0].classList.add("md-open"), t[0].classList.add("md-open"), s.currentlyOpenMenu = t.controller("mdMenu"), s.currentlyOpenMenu.registerContainerProxy(s.handleKeyDown), s.enableOpenOnHover())
+        })), t.push(this.$rootScope.$on("$mdMenuClose", function(e, t, n) {
+          var o = s.getMenus(); - 1 != o.indexOf(t[0]) && (a[0].classList.remove("md-open"), t[0].classList.remove("md-open"));
+          var r = be.element(t[0]).controller("mdMenu");
+          if (r.isInMenuBar && r.mdMenuBarCtrl === s) {
+            for (var i = t[0]; i && -1 == o.indexOf(i);) i = d.getClosest(i, "MD-MENU", !0);
+            i && (n.skipFocus || i.querySelector("button:not([disabled])").focus(), s.currentlyOpenMenu = ge), s.disableOpenOnHover(), s.setKeyboardMode(!0)
+          }
+        })), e.$on("$destroy", function() {
+          for (s.disableOpenOnHover(); t.length;) t.shift()()
+        }), this.setKeyboardMode(!0)
+      }, e.prototype.setKeyboardMode = function(e) {
+        e ? this.$element[0].classList.add("md-keyboard-mode") : this.$element[0].classList.remove("md-keyboard-mode")
+      }, e.prototype.enableOpenOnHover = function() {
+        if (!this.openOnHoverEnabled) {
+          var e = this;
+          e.openOnHoverEnabled = !0, e.parentToolbar && (e.parentToolbar.classList.add("md-has-open-menu"), e.$mdUtil.nextTick(function() {
+            be.element(e.parentToolbar).on("click", e.handleParentClick)
+          }, !1)), be.element(e.getMenus()).on("mouseenter", e.handleMenuHover)
+        }
+      }, e.prototype.handleMenuHover = function(e) {
+        this.setKeyboardMode(!1), this.openOnHoverEnabled && this.scheduleOpenHoveredMenu(e)
+      }, e.prototype.disableOpenOnHover = function() {
+        this.openOnHoverEnabled && (this.openOnHoverEnabled = !1, this.parentToolbar && (this.parentToolbar.classList.remove("md-has-open-menu"), be.element(this.parentToolbar).off("click", this.handleParentClick)), be.element(this.getMenus()).off("mouseenter", this.handleMenuHover))
+      }, e.prototype.scheduleOpenHoveredMenu = function(e) {
+        var t = be.element(e.currentTarget).controller("mdMenu");
+        this.setKeyboardMode(!1), this.scheduleOpenMenu(t)
+      }, e.prototype.scheduleOpenMenu = function(e) {
+        var t = this,
+          n = this.$timeout;
+        e != t.currentlyOpenMenu && (n.cancel(t.pendingMenuOpen), t.pendingMenuOpen = n(function() {
+          t.pendingMenuOpen = ge, t.currentlyOpenMenu && t.currentlyOpenMenu.close(!0, {
+            closeAll: !0
+          }), e.open()
+        }, 200, !1))
+      }, e.prototype.handleKeyDown = function(e) {
+        var t, n, o, r = this.$mdConstant.KEY_CODE,
+          i = this.currentlyOpenMenu,
+          a = i && i.isOpen;
+        switch (this.setKeyboardMode(!0), e.keyCode) {
+          case r.DOWN_ARROW:
+            i ? i.focusMenuContainer() : this.openFocusedMenu(), t = !0;
+            break;
+          case r.UP_ARROW:
+            i && i.close(), t = !0;
+            break;
+          case r.LEFT_ARROW:
+            n = this.focusMenu(-1), a && (o = be.element(n).controller("mdMenu"), this.scheduleOpenMenu(o)), t = !0;
+            break;
+          case r.RIGHT_ARROW:
+            n = this.focusMenu(1), a && (o = be.element(n).controller("mdMenu"), this.scheduleOpenMenu(o)), t = !0
+        }
+        t && (e && e.preventDefault && e.preventDefault(), e && e.stopImmediatePropagation && e.stopImmediatePropagation())
+      }, e.prototype.focusMenu = function(e) {
+        var t = this.getMenus(),
+          n = this.getFocusedMenuIndex(); - 1 == n && (n = this.getOpenMenuIndex());
+        var o = !1;
+        if (-1 == n ? o = !(n = 0) : (e < 0 && 0 < n || 0 < e && n < t.length - e) && (n += e, o = !0), o) return t[n].querySelector("button").focus(), t[n]
+      }, e.prototype.openFocusedMenu = function() {
+        var e = this.getFocusedMenu();
+        e && be.element(e).controller("mdMenu").open()
+      }, e.prototype.getMenus = function() {
+        var e = this.$element;
+        return this.$mdUtil.nodesToArray(e[0].children).filter(function(e) {
+          return "MD-MENU" == e.nodeName
+        })
+      }, e.prototype.getFocusedMenu = function() {
+        return this.getMenus()[this.getFocusedMenuIndex()]
+      }, e.prototype.getFocusedMenuIndex = function() {
+        var e = this.$mdUtil.getClosest(this.$document[0].activeElement, "MD-MENU");
+        return e ? this.getMenus().indexOf(e) : -1
+      }, e.prototype.getOpenMenuIndex = function() {
+        for (var e = this.getMenus(), t = 0; t < e.length; ++t)
+          if (e[t].classList.contains("md-open")) return t;
+        return -1
+      }, e.prototype.handleParentClick = function(e) {
+        var t = this.querySelector("md-menu.md-open");
+        t && !t.contains(e.target) && be.element(t).controller("mdMenu").close(!0, {
+          closeAll: !0
+        })
+      }
+    }(), Oe.$inject = ["$mdUtil", "$mdTheming"], be.module("material.components.menuBar").directive("mdMenuBar", Oe), be.module("material.components.menuBar").directive("mdMenuDivider", function() {
+      return {
+        restrict: "E",
+        compile: function(e, t) {
+          t.role || e[0].setAttribute("role", "separator")
+        }
+      }
+    }), Pe.$inject = ["$scope", "$element", "$attrs"], be.module("material.components.menuBar").controller("MenuItemController", Pe), Pe.prototype.init = function(e) {
+      var t = this.$element,
+        n = this.$attrs;
+      this.ngModel = e, "checkbox" != n.type && "radio" != n.type || (this.mode = n.type, this.iconEl = t[0].children[0], this.buttonEl = t[0].children[1], e && this.initClickListeners())
+    }, Pe.prototype.clearNgAria = function() {
+      var t = this.$element[0];
+      be.forEach(["role", "tabindex", "aria-invalid", "aria-checked"], function(e) {
+        t.removeAttribute(e)
+      })
+    }, Pe.prototype.initClickListeners = function() {
+      var e = this,
+        t = this.ngModel,
+        n = this.$scope,
+        o = this.$attrs,
+        r = (this.$element, this.mode);
+      this.handleClick = be.bind(this, this.handleClick);
+      var i = this.iconEl,
+        a = be.element(this.buttonEl),
+        d = this.handleClick;
+
+      function s(e) {
+        e ? a.off("click", d) : a.on("click", d)
+      }
+      o.$observe("disabled", s), s(o.disabled), t.$render = function() {
+        e.clearNgAria(),
+          function() {
+            if ("radio" != r) return t.$modelValue;
+            var e = o.ngValue ? n.$eval(o.ngValue) : o.value;
+            return t.$modelValue == e
+          }() ? (i.style.display = "", a.attr("aria-checked", "true")) : (i.style.display = "none", a.attr("aria-checked", "false"))
+      }, n.$$postDigest(t.$render)
+    }, Pe.prototype.handleClick = function(e) {
+      var t, n = this.mode,
+        o = this.ngModel,
+        r = this.$attrs;
+      "checkbox" == n ? t = !o.$modelValue : "radio" == n && (t = r.ngValue ? this.$scope.$eval(r.ngValue) : r.value), o.$setViewValue(t), o.$render()
+      this._inkbar = be.element(this._navBarEl.querySelector("md-nav-ink-bar"));
+      var n = this;
+      this._$timeout(function() {
+        n._updateTabs(n.mdSelectedNavItem, null)
+      }), this._$scope.$watch("ctrl.mdSelectedNavItem", function(e, t) {
+        n._$timeout(function() {
+          n._updateTabs(e, t)
+        })
+      })
+    }, Fe.prototype._updateTabs = function(e, t) {
+      var n = this,
+        o = this._getTabs(),
+        r = e === t;
+      if (o) {
+        var i = -1,
+          a = this._getTabByName(e),
+          d = this._getTabByName(t);
+        d && d.setSelected(!1), a && (a.setSelected(!0), i = o.indexOf(a)), this._$timeout(function() {
+          n._updateInkBarStyles(a, i), a && d && !r && n._moveFocus(d, a)
+        })
+      }
+    }, Fe.prototype._updateInkBarStyles = function(e, t) {
+      if (this._inkbar.css({
+          display: t < 0 ? "none" : ""
+        }), e) {
+        var n = e.getButtonEl(),
+          o = n.offsetLeft,
+          r = n.offsetWidth,
+          i = this._navBarEl.getBoundingClientRect().width,
+          a = r / i,
+          d = o / i * 100;
+        this._inkbar.css({
+          transform: "translateX(" + d + "%) scaleX(" + a + ")"
+        })
+      }
+    }, Fe.prototype.updateSelectedTabInkBar = function() {
+      this._updateInkBarStyles(this._getSelectedTab())
+    }, Fe.prototype._getTabs = function() {
+      var e = Array.prototype.slice.call(this._navBarEl.querySelectorAll(".md-nav-item")).map(function(e) {
+        return be.element(e).controller("mdNavItem")
+      });
+      return e.indexOf(ge) ? e : []
+    }, Fe.prototype._getTabByName = function(t) {
+      return this._findTab(function(e) {
+        return e.getName() === t
+      })
+    }, Fe.prototype._getSelectedTab = function() {
+      return this._findTab(function(e) {
+        return e.isSelected()
+      })
+    }, Fe.prototype.getFocusedTab = function() {
+      return this._findTab(function(e) {
+        return e.hasFocus()
+      })
+    }, Fe.prototype._findTab = function(e, t) {
+      var n, o = this._getTabs();
+      for (null == t && (t = 0), n = t; n < o.length; n++)
+        if (e(o[n])) return o[n];
+      return null
+    }, Fe.prototype._findTabReverse = function(e, t) {
+      var n = this._getTabs();
+      t !== ge && null !== t || (t = n.length - 1);
+      for (var o = t; 0 <= o; o--)
+        if (e(n[o])) return n[o];
+      return null
+    }, Fe.prototype.onFocus = function() {
+      var e = this._getSelectedTab();
+      e && !e.isFocused && e.setFocused(!0)
+    }, Fe.prototype._moveFocus = function(e, t) {
+      e.setFocused(!1), t.setFocused(!0)
+    }, Fe.prototype._focusFirstTab = function() {
+      if (this._getTabs()) {
+        var e = this._findTab(function(e) {
+          return e._isEnabled()
+        });
+        e && this._moveFocus(this.getFocusedTab(), e)
+      }
+    }, Fe.prototype._focusLastTab = function() {
+      if (this._getTabs()) {
+        var e = this._findTabReverse(function(e) {
+          return e._isEnabled()
+        });
+        e && this._moveFocus(this.getFocusedTab(), e)
+      }
+    }, Fe.prototype._focusNextTab = function(e) {
+      if (this._getTabs()) {
+        var t = this._findTab(function(e) {
+          return e._isEnabled()
+        }, e + 1);
+        t ? this._moveFocus(this.getFocusedTab(), t) : this._focusFirstTab()
+      }
+    }, Fe.prototype._focusPreviousTab = function(e) {
+      if (this._getTabs()) {
+        var t = this._findTabReverse(function(e) {
+          return e._isEnabled()
+        }, e - 1);
+        t ? this._moveFocus(this.getFocusedTab(), t) : this._focusLastTab()
+      }
+    }, Fe.prototype.onKeydown = function(e) {
+      var t = this._$mdConstant.KEY_CODE,
+        n = this._getTabs(),
+        o = this.getFocusedTab();
+      if (o && n) {
+        var r = n.indexOf(o);
+        switch (e.keyCode) {
+          case t.UP_ARROW:
+          case t.LEFT_ARROW:
+            e.preventDefault(), this._focusPreviousTab(r);
+            break;
+          case t.DOWN_ARROW:
+          case t.RIGHT_ARROW:
+            e.preventDefault(), this._focusNextTab(r);
+            break;
+          case t.SPACE:
+          case t.ENTER:
+            this._$timeout(function() {
+              o.getButtonEl().click()
+            });
+            break;
+          case t.HOME:
+            e.preventDefault(), this._focusFirstTab();
+            break;
+          case t.END:
+            e.preventDefault(), this._focusLastTab()
+        }
+      }
+    }, Ue.prototype.getNgClassMap = function() {
+      return {
+        "md-active": this._selected,
+        "md-primary": this._selected,
+        "md-unselected": !this._selected,
+        "md-focused": this.isFocused
+      }
+    }, Ue.prototype.getName = function() {
+      return this.name
+    }, Ue.prototype.getButtonEl = function() {
+      return this._$element[0].querySelector("._md-nav-button")
+    }, Ue.prototype.setSelected = function(e) {
+      (this._selected = e) ? this.getButtonEl().setAttribute("tabindex", "0"): this.getButtonEl().setAttribute("tabindex", "-1")
+    }, Ue.prototype.isSelected = function() {
+      return this._selected
+    }, Ue.prototype.setFocused = function(e) {
+      (this.isFocused = e) && this.getButtonEl().focus()
+    }, Ue.prototype.hasFocus = function() {
+      return this.isFocused
+    }, Ue.prototype._isEnabled = function() {
+      return !this._$element.attr("disabled")
+    },
+    function() {
+      s.$inject = ["presets", "$rootElement", "$rootScope", "$injector", "$window"], be.module("material.components.panel", ["material.core", "material.components.backdrop"]).provider("$mdPanel", function() {
+        return {
+          definePreset: e,
+          getAllPresets: t,
+          clearPresets: o,
+          $get: ["$rootElement", "$rootScope", "$injector", "$window", function(e, t, n, o) {
+            return new s(r, e, t, n, o)
+          }]
+        }
+      });
+      var i = 80,
+        a = "_md-panel-hidden",
+        n = be.element('<div class="_md-panel-focus-trap" tabindex="0"></div>'),
+        r = {};
+
+      function e(e, t) {
+        if (!e || !t) throw new Error("mdPanelProvider: The panel preset definition is malformed. The name and preset object are required.");
+        if (r.hasOwnProperty(e)) throw new Error("mdPanelProvider: The panel preset you have requested has already been defined.");
+        delete t.id, delete t.position, delete t.animation, r[e] = t
+      }
+
+      function t() {
+        return be.copy(r)
+      }
+
+      function o() {
+        r = {}
+      }
+
+      function d(e) {
+        return be.isString(e) && (e = [e]), e
+      }
+
+      function s(e, t, n, o, r) {
+        this._defaultConfigOptions = {
+          bindToController: !0,
+          clickOutsideToClose: !1,
+          disableParentScroll: !1,
+          escapeToClose: !1,
+          focusOnOpen: !0,
+          fullscreen: !1,
+          hasBackdrop: !1,
+          propagateContainerEvents: !1,
+          transformTemplate: be.bind(this, this._wrapTemplate),
+          trapFocus: !1,
+          zIndex: i
+        }, this._config = {}, this._presets = e, this._$rootElement = t, this._$rootScope = n, this._$injector = o, this._$window = r, this._$mdUtil = this._$injector.get("$mdUtil"), this._trackedPanels = {}, this._groups = Object.create(null), this.animation = c.animation, this.xPosition = h.xPosition, this.yPosition = h.yPosition, this.interceptorTypes = l.interceptorTypes, this.closeReasons = l.closeReasons, this.absPosition = h.absPosition
+      }
+
+      function l(e, t) {
+        this._$q = t.get("$q"), this._$mdCompiler = t.get("$mdCompiler"), this._$mdConstant = t.get("$mdConstant"), this._$mdUtil = t.get("$mdUtil"), this._$mdTheming = t.get("$mdTheming"), this._$rootScope = t.get("$rootScope"), this._$animate = t.get("$animate"), this._$mdPanel = t.get("$mdPanel"), this._$log = t.get("$log"), this._$window = t.get("$window"), this._$$rAF = t.get("$$rAF"), this.id = e.id, this.config = e, this.panelContainer = ge, this.panelEl = ge, this.innerWrapper = ge, this.isAttached = !1, this._removeListeners = [], this._topFocusTrap = ge, this._bottomFocusTrap = ge, this._backdropRef = ge, this._restoreScroll = null, this._interceptors = Object.create(null), this._compilerCleanup = null, this._restoreCache = {
+          styles: "",
+          classes: ""
+        }
+      }
+
+      function h(e) {
+        this._$window = e.get("$window"), this._isRTL = e.get("$mdUtil").isRtl(), this._$mdConstant = e.get("$mdConstant"), this._absolute = !1, this._relativeToEl = ge, this._top = "", this._bottom = "", this._left = "", this._right = "", this._translateX = [], this._translateY = [], this._positions = [], this._actualPosition = ge
+      }
+
+      function c(e) {
+        this._$mdUtil = e.get("$mdUtil"), this._openFrom, this._closeTo, this._animationClass = "", this._openDuration, this._closeDuration, this._rawDuration
+      }
+
+      function m(e) {
+        var t = be.isString(e) ? document.querySelector(e) : e;
+        return be.element(t)
+      }
+
+      function u(e, t) {
+        if (null !== t && !be.isUndefined(t)) {
+          for (var n, o = Object.keys(e), r = [], i = 0; n = o[i]; i++) {
+            var a = e[n];
+            if (r.push(a), a === t) return
+          }
+          throw new Error("Panel position only accepts the following values:\n" + r.join(" | "))
+        }
+      }
+
+      function p(e) {
+        return be.isNumber(e) ? e + "px" : e
+      }
+      s.prototype.create = function(e, t) {
+        if ("string" == typeof e ? e = this._getPresetByName(e) : "object" != typeof e || !be.isUndefined(t) && t || (t = e, e = {}), e = e || {}, t = t || {}, be.isDefined(t.id) && this._trackedPanels[t.id]) {
+          var n = this._trackedPanels[t.id];
+          return be.extend(n.config, t), n
+        }
+        this._config = be.extend({
+          id: t.id || "panel_" + this._$mdUtil.nextUid(),
+          scope: this._$rootScope.$new(!0),
+          attachTo: this._$rootElement
+        }, this._defaultConfigOptions, t, e);
+        var o = new l(this._config, this._$injector);
+        return this._trackedPanels[this._config.id] = o, this._config.groupName && (this._config.groupName = d(this._config.groupName), be.forEach(this._config.groupName, function(e) {
+          o.addToGroup(e)
+        })), this._config.scope.$on("$destroy", be.bind(o, o.detach)), o
+      }, s.prototype.open = function(e, t) {
+        var n = this.create(e, t);
+        return n.open().then(function() {
+          return n
+        })
+      }, s.prototype._getPresetByName = function(e) {
+        if (!this._presets[e]) throw new Error("mdPanel: The panel preset configuration that you requested does not exist. Use the $mdPanelProvider to create a preset before requesting one.");
+        return this._presets[e]
+      }, s.prototype.newPanelPosition = function() {
+        return new h(this._$injector)
+      }, s.prototype.newPanelAnimation = function() {
+        return new c(this._$injector)
+      }, s.prototype.newPanelGroup = function(e, t) {
+        return this._groups[e] || (t = t || {}, this._groups[e] = {
+          panels: [],
+          openPanels: [],
+          maxOpen: 0 < t.maxOpen ? t.maxOpen : 1 / 0
+        }), this._groups[e]
+      }, s.prototype.setGroupMaxOpen = function(e, t) {
+        if (!this._groups[e]) throw new Error("mdPanel: Group does not exist yet. Call newPanelGroup().");
+        this._groups[e].maxOpen = t
+      }, s.prototype._openCountExceedsMaxOpen = function(e) {
+        if (this._groups[e]) {
+          var t = this._groups[e];
+          return 0 < t.maxOpen && t.openPanels.length > t.maxOpen
+        }
+        return !1
+      }, s.prototype._closeFirstOpenedPanel = function(e) {
+        var t = this._groups[e];
+        t && t.openPanels.length && t.openPanels[0].close()
+      }, s.prototype._wrapTemplate = function(e) {
+        return '<div class="md-panel-outer-wrapper"><div class="md-panel-inner-wrapper _md-panel-offscreen"><div class="md-panel _md-panel-offscreen">' + (e || "") + "</div></div></div>"
+      }, s.prototype._wrapContentElement = function(e) {
+        var t = be.element('<div class="md-panel-outer-wrapper"><div class="md-panel-inner-wrapper _md-panel-offscreen"></div></div>');
+        return e.addClass("md-panel _md-panel-offscreen"), t.children().eq(0).append(e), t
+      }, l.interceptorTypes = {
+        CLOSE: "onClose"
+      }, l.prototype.open = function() {
+        var r = this;
+        return this._$q(function(e, t) {
+          var n = r._done(e, r),
+            o = r._simpleBind(r.show, r);
+          r.attach().then(o).then(function() {
+            r.config.groupName && (r.config.groupName = d(r.config.groupName), be.forEach(r.config.groupName, function(e) {
+              r._$mdPanel._openCountExceedsMaxOpen(e) && r._$mdPanel._closeFirstOpenedPanel(e)
+            }))
+          }).then(n).catch(t)
+        })
+      }, l.prototype.close = function(i) {
+        var a = this;
+        return this._$q(function(o, r) {
+          a._callInterceptors(l.interceptorTypes.CLOSE).then(function() {
+            var e = a._done(o, a),
+              t = a._simpleBind(a.detach, a),
+              n = a.config.onCloseSuccess || be.noop;
+            n = be.bind(a, n, a, i), a.hide().then(t).then(e).then(n).catch(r)
+          }, r)
+        })
+      }, l.prototype.attach = function() {
+        if (this.isAttached && this.panelEl) return this._$q.when(this);
+        var r = this;
+        return this._$q(function(e, t) {
+          var n = r._done(e, r),
+            o = r.config.onDomAdded || be.noop;
+          r._$q.all([r._createBackdrop(), r._createPanel().then(function(e) {
+            return r.isAttached = !0, r._addEventListeners(), e
+          }).catch(t)]).then(o).then(n).catch(t)
+        })
+      }, l.prototype.detach = function() {
+        if (!this.isAttached) return this._$q.when(this);
+        var o = this,
+          r = o.config.onDomRemoved || be.noop;
+        return this._restoreScroll && (this._restoreScroll(), this._restoreScroll = null), this._$q(function(e, t) {
+          var n = o._done(e, o);
+        })
+      }, l.prototype.destroy = function() {
+        var t = this;
+        this.config.groupName && (this.config.groupName = d(this.config.groupName), be.forEach(this.config.groupName, function(e) {
+          t.removeFromGroup(e)
+        })), this.config.scope.$destroy(), this.config.locals = null, this.config.onDomAdded = null, this.config.onDomRemoved = null, this.config.onRemoving = null, this.config.onOpenComplete = null, this._interceptors = ge
+      }, l.prototype.show = function() {
+        if (!this.panelContainer) return this._$q(function(e, t) {
+          t("mdPanel: Panel does not exist yet. Call open() or attach().")
+        });
+        if (!this.panelContainer.hasClass(a)) return this._$q.when(this);
+        var r = this;
+        return this._$q(function(e, t) {
+          var n = r._done(e, r),
+            o = r.config.onOpenComplete || be.noop;
+          r._$q.all([r._backdropRef ? r._backdropRef.show() : r, (r.panelContainer.removeClass(a), r._animateOpen()).then(function() {
+            r._focusOnOpen()
+          }, t)]).then(o).then(function() {
+            r.config.groupName && (r.config.groupName = d(r.config.groupName), be.forEach(r.config.groupName, function(e) {
+              (e = r._$mdPanel._groups[e]) && e.openPanels.push(r)
+            }))
+          }).then(n).catch(t)
+        })
+      }, l.prototype.hide = function() {
+        if (!this.panelContainer) return this._$q(function(e, t) {
+          t("mdPanel: Panel does not exist yet. Call open() or attach().")
+        });
+        if (this.panelContainer.hasClass(a)) return this._$q.when(this);
+        var r = this;
+        return this._$q(function(e, t) {
+          var n = r._done(e, r),
+            o = r.config.onRemoving || be.noop;
+          r._$q.all([r._backdropRef ? r._backdropRef.hide() : r, r._animateClose().then(o).then(function() {
+            r.panelContainer.addClass(a)
+          }).then(function() {
+            var t;
+            r.config.groupName && (r.config.groupName = d(r.config.groupName), be.forEach(r.config.groupName, function(e) {
+              e = r._$mdPanel._groups[e], -1 < (t = e.openPanels.indexOf(r)) && e.openPanels.splice(t, 1)
+            }))
+          }).then(function() {
+            var e = r.config.origin;
+            e && m(e).focus()
+          }).catch(t)]).then(n, t)
+        })
+      }, l.prototype._compile = function() {
+        var o = this;
+        return o._$mdCompiler.compile(o.config).then(function(e) {
+          var t = o.config;
+          if (t.contentElement) {
+            var n = e.element;
+            o._restoreCache.styles = n[0].style.cssText, o._restoreCache.classes = n[0].className, o.panelContainer = o._$mdPanel._wrapContentElement(n), o.panelEl = n
+          } else o.panelContainer = e.link(t.scope), o.panelEl = be.element(o.panelContainer[0].querySelector(".md-panel"));
+          return o.innerWrapper = be.element(o.panelContainer[0].querySelector(".md-panel-inner-wrapper")), o._compilerCleanup = e.cleanup, m(o.config.attachTo).append(o.panelContainer), o
+        })
+      }, l.prototype._createPanel = function() {
+        var n = this;
+        return this._$q(function(e, t) {
+          n.config.locals || (n.config.locals = {}), (n.config.locals.mdPanelRef = n)._compile().then(function() {
+            n.config.disableParentScroll && (n._restoreScroll = n._$mdUtil.disableScrollAround(null, n.panelContainer, {
+              disableScrollMask: !0
+            })), n.config.panelClass && n.panelEl.addClass(n.config.panelClass), n.config.propagateContainerEvents && (n.panelContainer.css("pointer-events", "none"), n.panelEl.css("pointer-events", "all")), n._$animate.pin && n._$animate.pin(n.panelContainer, m(n.config.attachTo)), n._configureTrapFocus(), n._addStyles().then(function() {
+              e(n)
+            }, t)
+          }, t)
+        })
+      }, l.prototype._addStyles = function() {
+        var n = this;
+        return this._$q(function(e) {
+          n.panelContainer.css("z-index", n.config.zIndex), n.innerWrapper.css("z-index", n.config.zIndex + 1);
+
+          function t() {
+            n._setTheming(), n.panelEl.removeClass("_md-panel-offscreen"), n.innerWrapper.removeClass("_md-panel-offscreen"), n.panelContainer.addClass(a), e(n)
+          }
+          if (n.config.fullscreen) return n.panelEl.addClass("_md-panel-fullscreen"), void t();
+          n.config.position ? n._$rootScope.$$postDigest(function() {
+            n._updatePosition(!0), n._setTheming(), e(n)
+          }) : t()
+        })
+      }, l.prototype._setTheming = function() {
+        this._$mdTheming(this.panelEl), this._$mdTheming(this.panelContainer)
+      }, l.prototype.updatePosition = function(e) {
+        if (!this.panelContainer) throw new Error("mdPanel: Panel does not exist yet. Call open() or attach().");
+        this.config.position = e, this._updatePosition()
+      }, l.prototype._updatePosition = function(e) {
+        var t = this.config.position;
+        t && (t._setPanelPosition(this.innerWrapper), e && (this.panelEl.removeClass("_md-panel-offscreen"), this.innerWrapper.removeClass("_md-panel-offscreen"), this.panelContainer.addClass(a)), this.innerWrapper.css(h.absPosition.TOP, t.getTop()), this.innerWrapper.css(h.absPosition.BOTTOM, t.getBottom()), this.innerWrapper.css(h.absPosition.LEFT, t.getLeft()), this.innerWrapper.css(h.absPosition.RIGHT, t.getRight()))
+      }, l.prototype._focusOnOpen = function() {
+        if (this.config.focusOnOpen) {
+          var e = this;
+          this._$rootScope.$$postDigest(function() {
+            (e._$mdUtil.findFocusTarget(e.panelEl) || e.panelEl).focus()
+          })
+        }
+      }, l.prototype._createBackdrop = function() {
+        if (this.config.hasBackdrop) {
+          if (!this._backdropRef) {
+            var e = this._$mdPanel.newPanelAnimation().openFrom(this.config.attachTo).withAnimation({
+              open: "_md-opaque-enter",
+              close: "_md-opaque-leave"
+            });
+            this.config.animation && e.duration(this.config.animation._rawDuration);
+            var t = {
+              animation: e,
+              attachTo: this.config.attachTo,
+              focusOnOpen: !1,
+              panelClass: "_md-panel-backdrop",
+              zIndex: this.config.zIndex - 1
+            };
+            this._backdropRef = this._$mdPanel.create(t)
+          }
+          if (!this._backdropRef.isAttached) return this._backdropRef.attach()
+        }
+      }, l.prototype._addEventListeners = function() {
+        this._configureEscapeToClose(), this._configureClickOutsideToClose(), this._configureScrollListener()
+      }, l.prototype._removeEventListeners = function() {
+        this._removeListeners && this._removeListeners.forEach(function(e) {
+          e()
+        }), this._removeListeners = []
+      }, l.prototype._configureEscapeToClose = function() {
+        if (this.config.escapeToClose) {
+          var e = m(this.config.attachTo),
+            t = this,
+            n = function(e) {
+              e.keyCode === t._$mdConstant.KEY_CODE.ESCAPE && (e.stopPropagation(), e.preventDefault(), t.close(l.closeReasons.ESCAPE))
+            };
+          this.panelContainer.on("keydown", n), e.on("keydown", n), this._removeListeners.push(function() {
+            t.panelContainer.off("keydown", n), e.off("keydown", n)
+          })
+        }
+      }, l.prototype._configureClickOutsideToClose = function() {
+        if (this.config.clickOutsideToClose) {
+          var t, n = this.config.propagateContainerEvents ? be.element(document.body) : this.panelContainer,
+            e = function(e) {
+              t = e.target
+            },
+            o = this,
+            r = function(e) {
+              o.config.propagateContainerEvents ? t === o.panelEl[0] || o.panelEl[0].contains(t) || o.close() : t === n[0] && e.target === n[0] && (e.stopPropagation(), e.preventDefault(), o.close(l.closeReasons.CLICK_OUTSIDE))
+            };
+          n.on("mousedown", e), n.on("mouseup", r), this._removeListeners.push(function() {
+            n.off("mousedown", e), n.off("mouseup", r)
+          })
+        }
+      }, l.prototype._configureScrollListener = function() {
+        if (!this.config.disableParentScroll) {
+          var e = be.bind(this, this._updatePosition),
+            t = this._$$rAF.throttle(e),
+            n = this,
+            o = function() {
+              t()
+            };
+          this._$window.addEventListener("scroll", o, !0), this._removeListeners.push(function() {
+            n._$window.removeEventListener("scroll", o, !0)
+          })
+        }
+      }, l.prototype._configureTrapFocus = function() {
+        if (this.panelEl.attr("tabIndex", "-1"), this.config.trapFocus) {
+          var e = this.panelEl;
+          this._topFocusTrap = n.clone()[0], this._bottomFocusTrap = n.clone()[0];
+          var t = function() {
+            e.focus()
+          };
+          this._topFocusTrap.addEventListener("focus", t), this._bottomFocusTrap.addEventListener("focus", t), this._removeListeners.push(this._simpleBind(function() {
+            this._topFocusTrap.removeEventListener("focus", t), this._bottomFocusTrap.removeEventListener("focus", t)
+          }, this)), e[0].parentNode.insertBefore(this._topFocusTrap, e[0]), e.after(this._bottomFocusTrap)
+        }
+      }, l.prototype.updateAnimation = function(e) {
+        this.config.animation = e, this._backdropRef && this._backdropRef.config.animation.duration(e._rawDuration)
+      }, l.prototype._animateOpen = function() {
+        this.panelContainer.addClass("md-panel-is-showing");
+        var n = this.config.animation;
+        if (!n) return this.panelContainer.addClass("_md-panel-shown"), this._$q.when(this);
+        var o = this;
+        return this._$q(function(e) {
+          var t = o._done(e, o);
+          n.animateOpen(o.panelEl).then(t, function() {
+            o._$log.warn("mdPanel: MdPanel Animations failed. Showing panel without animating."), t()
+          })
+        })
+      }, l.prototype._animateClose = function() {
+        var n = this,
+          o = this.config.animation;
+        return o ? this._$q(function(e) {
+          function t() {
+            n.panelContainer.removeClass("md-panel-is-showing"), n.panelEl.css("transform", ""), e(n)
+          }
+          o.animateClose(n.panelEl).then(t, function() {
+            n._$log.warn("mdPanel: MdPanel Animations failed. Hiding panel without animating."), t()
+          })
+        }) : (this.panelContainer.removeClass("md-panel-is-showing"), this.panelContainer.removeClass("_md-panel-shown"), this._$q.when(this))
+      }, l.prototype.registerInterceptor = function(e, t) {
+        var n = null;
+        if (be.isString(e) ? be.isFunction(t) || (n = "Interceptor callback must be a function, instead got " + typeof t) : n = "Interceptor type must be a string, instead got " + typeof e, n) throw new Error("MdPanel: " + n);
+        var o = this._interceptors[e] = this._interceptors[e] || [];
+        return -1 === o.indexOf(t) && o.push(t), this
+      }, l.prototype.removeInterceptor = function(e, t) {
+        var n = this._interceptors[e] ? this._interceptors[e].indexOf(t) : -1;
+        return -1 < n && this._interceptors[e].splice(n, 1), this
+      }, l.prototype.removeAllInterceptors = function(e) {
+        return e ? this._interceptors[e] = [] : this._interceptors = Object.create(null), this
+      }, l.prototype._callInterceptors = function(e) {
+        var o = this,
+          r = o._$q;
+        return (o._interceptors && o._interceptors[e] || []).reduceRight(function(e, t) {
+          var n = t && be.isFunction(t.then) ? t : null;
+          return e.then(function() {
+            if (!n) try {
+              n = t(o)
+            } catch (e) {
+              n = r.reject(e)
+            }
+            return n
+          })
+        }, r.resolve(o))
+      }, l.prototype._simpleBind = function(t, n) {
+        return function(e) {
+          return t.apply(n, e)
+        }
+      }, l.prototype._done = function(e, t) {
+        return function() {
+          e(t)
+        }
+      }, l.prototype.addToGroup = function(e) {
+        this._$mdPanel._groups[e] || this._$mdPanel.newPanelGroup(e);
+        var t = this._$mdPanel._groups[e];
+        t.panels.indexOf(this) < 0 && t.panels.push(this)
+      }, l.prototype.removeFromGroup = function(e) {
+        if (!this._$mdPanel._groups[e]) throw new Error("mdPanel: The group " + e + " does not exist.");
+        var t = this._$mdPanel._groups[e],
+          n = t.panels.indexOf(this); - 1 < n && t.panels.splice(n, 1)
+      }, l.closeReasons = {
+        CLICK_OUTSIDE: "clickOutsideToClose",
+        ESCAPE: "escapeToClose"
+      }, h.xPosition = {
+        CENTER: "center",
+        ALIGN_START: "align-start",
+        ALIGN_END: "align-end",
+        OFFSET_START: "offset-start",
+        OFFSET_END: "offset-end"
+      }, h.yPosition = {
+        CENTER: "center",
+        ALIGN_TOPS: "align-tops",
+        ALIGN_BOTTOMS: "align-bottoms",
+        ABOVE: "above",
+        BELOW: "below"
+      }, h.absPosition = {
+        TOP: "top",
+        RIGHT: "right",
+        BOTTOM: "bottom",
+        LEFT: "left"
+      }, h.viewportMargin = 8, h.prototype.absolute = function() {
+        return this._absolute = !0, this
+      }, h.prototype._setPosition = function(e, t) {
+        if (e === h.absPosition.RIGHT || e === h.absPosition.LEFT) this._left = this._right = "";
+        else {
+          if (e !== h.absPosition.BOTTOM && e !== h.absPosition.TOP) {
+            var n = Object.keys(h.absPosition).join().toLowerCase();
+            throw new Error("mdPanel: Position must be one of " + n + ".")
+          }
+          this._top = this._bottom = ""
+        }
+        return this["_" + e] = be.isString(t) ? t : "0", this
+      }, h.prototype.top = function(e) {
+        return this._setPosition(h.absPosition.TOP, e)
+      }, h.prototype.bottom = function(e) {
+        return this._setPosition(h.absPosition.BOTTOM, e)
+      }, h.prototype.start = function(e) {
+        var t = this._isRTL ? h.absPosition.RIGHT : h.absPosition.LEFT;
+        return this._setPosition(t, e)
+      }, h.prototype.end = function(e) {
+        var t = this._isRTL ? h.absPosition.LEFT : h.absPosition.RIGHT;
+        return this._setPosition(t, e)
+      }, h.prototype.left = function(e) {
+        return this._setPosition(h.absPosition.LEFT, e)
+      }, h.prototype.right = function(e) {
+        return this._setPosition(h.absPosition.RIGHT, e)
+      }, h.prototype.centerHorizontally = function() {
+        return this._left = "50%", this._right = "", this._translateX = ["-50%"], this
+      }, h.prototype.centerVertically = function() {
+        return this._top = "50%", this._bottom = "", this._translateY = ["-50%"], this
+      }, h.prototype.center = function() {
+        return this.centerHorizontally().centerVertically()
+      }, h.prototype.relativeTo = function(e) {
+        return this._absolute = !1, this._relativeToEl = m(e), this
+      }, h.prototype.addPanelPosition = function(e, t) {
+        if (!this._relativeToEl) throw new Error("mdPanel: addPanelPosition can only be used with relative positioning. Set relativeTo first.");
+        return u(h.xPosition, e), u(h.yPosition, t), this._positions.push({
+          x: e,
+          y: t
+        }), this
+      }, h.prototype.withOffsetX = function(e) {
+        return this._translateX.push(p(e)), this
+      }, h.prototype.withOffsetY = function(e) {
+        return this._translateY.push(p(e)), this
+      }, h.prototype.getTop = function() {
+        return this._top
+      }, h.prototype.getBottom = function() {
+        return this._bottom
+      }, h.prototype.getLeft = function() {
+        return this._left
+      }, h.prototype.getRight = function() {
+        return this._right
+      }, h.prototype.getTransform = function() {
+        return (this._reduceTranslateValues("translateX", this._translateX) + " " + this._reduceTranslateValues("translateY", this._translateY)).trim()
+      }, h.prototype._setTransform = function(e) {
+        return e.css(this._$mdConstant.CSS.TRANSFORM, this.getTransform())
+      }, h.prototype._isOnscreen = function(e) {
+        var t = parseInt(this.getLeft()),
+          n = parseInt(this.getTop());
+        if (this._translateX.length || this._translateY.length) {
+          var o = function(e, t) {
+            var n = getComputedStyle(e[0] || e)[t],
+              o = n.indexOf("("),
+              r = n.lastIndexOf(")"),
+              i = {
+                x: 0,
+                y: 0
+              };
+            if (-1 < o && -1 < r) {
+              var a = n.substring(o + 1, r).split(", ").slice(-2);
+              i.x = parseInt(a[0]), i.y = parseInt(a[1])
+            }
+            return i
+          }(e, this._$mdConstant.CSS.TRANSFORM);
+          t += o.x, n += o.y
+        }
+        var r = t + e[0].offsetWidth,
+          i = n + e[0].offsetHeight;
+        return 0 <= t && 0 <= n && i <= this._$window.innerHeight && r <= this._$window.innerWidth
+      }, h.prototype.getActualPosition = function() {
+        return this._actualPosition
+      }, h.prototype._reduceTranslateValues = function(n, e) {
+        return e.map(function(e) {
+          var t = be.isFunction(e) ? p(e(this)) : e;
+          return n + "(" + t + ")"
+        }, this).join(" ")
+      }, h.prototype._setPanelPosition = function(e) {
+        if (e.removeClass("_md-panel-position-adjusted"), this._absolute) this._setTransform(e);
+        else {
+          if (this._actualPosition) return this._calculatePanelPosition(e, this._actualPosition), this._setTransform(e), void this._constrainToViewport(e);
+          for (var t = 0; t < this._positions.length; t++)
+            if (this._actualPosition = this._positions[t], this._calculatePanelPosition(e, this._actualPosition), this._setTransform(e), this._isOnscreen(e)) return;
+          this._constrainToViewport(e)
+        }
+      }, h.prototype._constrainToViewport = function(e) {
+        var t = h.viewportMargin,
+          n = this._top,
+          o = this._left;
+        if (this.getTop()) {
+          var r = parseInt(this.getTop()),
+            i = e[0].offsetHeight + r,
+            a = this._$window.innerHeight;
+          r < t ? this._top = t + "px" : a < i && (this._top = r - (i - a + t) + "px")
+        }
+        if (this.getLeft()) {
+          var d = parseInt(this.getLeft()),
+            s = e[0].offsetWidth + d,
+            l = this._$window.innerWidth;
+          d < t ? this._left = t + "px" : l < s && (this._left = d - (s - l + t) + "px")
+        }
+        e.toggleClass("_md-panel-position-adjusted", this._top !== n || this._left !== o)
+      }, h.prototype._reverseXPosition = function(e) {
+        if (e === h.xPosition.CENTER) return e;
+        return -1 < e.indexOf("start") ? e.replace("start", "end") : e.replace("end", "start")
+      }, h.prototype._bidi = function(e) {
+        return this._isRTL ? this._reverseXPosition(e) : e
+      }, h.prototype._calculatePanelPosition = function(e, t) {
+        var n = e[0].getBoundingClientRect(),
+          o = Math.max(n.width, e[0].clientWidth),
+          r = Math.max(n.height, e[0].clientHeight),
+          i = this._relativeToEl[0].getBoundingClientRect(),
+          a = i.left,
+          d = i.right,
+          s = i.width;
+        switch (this._bidi(t.x)) {
+          case h.xPosition.OFFSET_START:
+            this._left = a - o + "px";
+            break;
+          case h.xPosition.ALIGN_END:
+            this._left = d - o + "px";
+            break;
+          case h.xPosition.CENTER:
+            var l = a + .5 * s - .5 * o;
+            this._left = l + "px";
+            break;
+          case h.xPosition.ALIGN_START:
+            this._left = a + "px";
+            break;
+          case h.xPosition.OFFSET_END:
+            this._left = d + "px"
+        }
+        var c = i.top,
+          m = i.bottom,
+          u = i.height;
+        switch (t.y) {
+          case h.yPosition.ABOVE:
+            this._top = c - r + "px";
+            break;
+          case h.yPosition.ALIGN_BOTTOMS:
+            this._top = m - r + "px";
+            break;
+          case h.yPosition.CENTER:
+            var p = c + .5 * u - .5 * r;
+            this._top = p + "px";
+            break;
+          case h.yPosition.ALIGN_TOPS:
+            this._top = c + "px";
+            break;
+          case h.yPosition.BELOW:
+            this._top = m + "px"
+        }
+      }, c.animation = {
+        SLIDE: "md-panel-animate-slide",
+        SCALE: "md-panel-animate-scale",
+        FADE: "md-panel-animate-fade"
+      }, c.prototype.openFrom = function(e) {
+        return e = e.target ? e.target : e, this._openFrom = this._getPanelAnimationTarget(e), this._closeTo || (this._closeTo = this._openFrom), this
+      }, c.prototype.closeTo = function(e) {
+        return this._closeTo = this._getPanelAnimationTarget(e), this
+      }, c.prototype.duration = function(e) {
+        return e && (be.isNumber(e) ? this._openDuration = this._closeDuration = t(e) : be.isObject(e) && (this._openDuration = t(e.open), this._closeDuration = t(e.close))), this._rawDuration = e, this;
+
+        function t(e) {
+          if (be.isNumber(e)) return e / 1e3
+        }
+      }, c.prototype._getPanelAnimationTarget = function(e) {
+        return be.isDefined(e.top) || be.isDefined(e.left) ? {
+          element: ge,
+          bounds: {
+            top: e.top || 0,
+            left: e.left || 0
+          }
+        } : this._getBoundingClientRect(m(e))
+      }, c.prototype.withAnimation = function(e) {
+        return this._animationClass = e, this
+      }, c.prototype.animateOpen = function(e) {
+        var t = this._$mdUtil.dom.animator;
+        this._fixBounds(e);
+        var n = {},
+          o = e[0].style.transform || "",
+          r = t.toTransformCss(o),
+          i = t.toTransformCss(o);
+        switch (this._animationClass) {
+          case c.animation.SLIDE:
+            e.css("opacity", "1"), n = {
+              transitionInClass: "_md-panel-animate-enter",
+              transitionOutClass: "_md-panel-animate-leave"
+            };
+            var a = t.calculateSlideToOrigin(e, this._openFrom) || "";
+            r = t.toTransformCss(a + " " + o);
+            break;
+          case c.animation.SCALE:
+            n = {
+              transitionInClass: "_md-panel-animate-enter"
+            };
+            var d = t.calculateZoomToOrigin(e, this._openFrom) || "";
+            r = t.toTransformCss(o + " " + d);
+            break;
+          case c.animation.FADE:
+            n = {
+              transitionInClass: "_md-panel-animate-enter"
+            };
+            break;
+          default:
+            n = be.isString(this._animationClass) ? {
+              transitionInClass: this._animationClass
+            } : {
+              transitionInClass: this._animationClass.open,
+              transitionOutClass: this._animationClass.close
+            }
+        }
+        return n.duration = this._openDuration, t.translate3d(e, r, i, n)
+      }, c.prototype.animateClose = function(e) {
+        var t = this._$mdUtil.dom.animator,
+          n = {},
+          o = e[0].style.transform || "",
+          r = t.toTransformCss(o),
+          i = t.toTransformCss(o);
+        switch (this._animationClass) {
+          case c.animation.SLIDE:
+            e.css("opacity", "1"), n = {
+              transitionInClass: "_md-panel-animate-leave",
+              transitionOutClass: "_md-panel-animate-enter _md-panel-animate-leave"
+            };
+            var a = t.calculateSlideToOrigin(e, this._closeTo) || "";
+            i = t.toTransformCss(a + " " + o);
+            break;
+          case c.animation.SCALE:
+            n = {
+              transitionInClass: "_md-panel-animate-scale-out _md-panel-animate-leave",
+              transitionOutClass: "_md-panel-animate-scale-out _md-panel-animate-enter _md-panel-animate-leave"
+            };
+            var d = t.calculateZoomToOrigin(e, this._closeTo) || "";
+            i = t.toTransformCss(o + " " + d);
+            break;
+          case c.animation.FADE:
+            n = {
+              transitionInClass: "_md-panel-animate-fade-out _md-panel-animate-leave",
+              transitionOutClass: "_md-panel-animate-fade-out _md-panel-animate-enter _md-panel-animate-leave"
+            };
+            break;
+          default:
+            n = be.isString(this._animationClass) ? {
+              transitionOutClass: this._animationClass
+            } : {
+              transitionInClass: this._animationClass.close,
+              transitionOutClass: this._animationClass.open
+            }
+        }
+        return n.duration = this._closeDuration, t.translate3d(e, r, i, n)
+      }, c.prototype._fixBounds = function(e) {
+        var t = e[0].offsetWidth,
+          n = e[0].offsetHeight;
+        this._openFrom && null == this._openFrom.bounds.height && (this._openFrom.bounds.height = n), this._openFrom && null == this._openFrom.bounds.width && (this._openFrom.bounds.width = t), this._closeTo && null == this._closeTo.bounds.height && (this._closeTo.bounds.height = n), this._closeTo && null == this._closeTo.bounds.width && (this._closeTo.bounds.width = t)
+      }, c.prototype._getBoundingClientRect = function(e) {
+        if (e instanceof be.element) return {
+          element: e,
+          bounds: e[0].getBoundingClientRect()
+        }
+      }
+    }(), be.module("material.components.progressCircular", ["material.core"]), je.$inject = ["$window", "$mdProgressCircular", "$mdTheming", "$mdUtil", "$interval", "$log"], be.module("material.components.progressCircular").directive("mdProgressCircular", je), be.module("material.components.progressCircular").provider("$mdProgressCircular", function() {
+      var t = {
+        progressSize: 50,
+        strokeWidth: 10,
+        duration: 100,
+        easeFn: e,
+        durationIndeterminate: 1333,
+        startIndeterminate: 1,
+        endIndeterminate: 149,
+        easeFnIndeterminate: n,
+        easingPresets: {
+          linearEase: e,
+          materialEase: n
+        }
+      };
+      return {
+        configure: function(e) {
+          return t = be.extend(t, e || {})
+        },
+        $get: function() {
+          return t
+        }
+      };
+
+      function e(e, t, n, o) {
+        return n * e / o + t
+      }
+
+      function n(e, t, n, o) {
+        var r = (e /= o) * e,
+          i = r * e;
+        return t + n * (6 * i * r + -15 * r * r + 10 * i)
+      }
+    }), ze.$inject = ["$mdTheming", "$mdUtil", "$log"], be.module("material.components.progressLinear", ["material.core"]).directive("mdProgressLinear", ze),
+    function() {
+      e.$inject = ["$mdUtil", "$mdConstant", "$mdTheming", "$timeout"], t.$inject = ["$mdAria", "$mdUtil", "$mdTheming"], be.module("material.components.radioButton", ["material.core"]).directive("mdRadioGroup", e).directive("mdRadioButton", t);
+      var i = Object.freeze({
+        PREVIOUS: -1,
+        CURRENT: 0,
+        NEXT: 1
+      });
+
+      function e(d, s, l, c) {
+        return e.prototype = {
+          init: function(e) {
+            this._ngModelCtrl = e, this._ngModelCtrl.$render = be.bind(this, this.render)
+          },
+          add: function(e) {
+            this._radioButtonRenderFns.push(e)
+          },
+          remove: function(e) {
+            var t = this._radioButtonRenderFns.indexOf(e); - 1 !== t && this._radioButtonRenderFns.splice(t, 1)
+          },
+          render: function() {
+            this._radioButtonRenderFns.forEach(function(e) {
+              e()
+            })
+          },
+          setViewValue: function(e, t) {
+            this._ngModelCtrl.$setViewValue(e, t), this.render()
+          },
+          getViewValue: function() {
+            return this._ngModelCtrl.$viewValue
+          },
+          selectCurrent: function() {
+            return t(this.$element, i.CURRENT)
+          },
+          selectNext: function() {
+            return t(this.$element, i.NEXT)
+          },
+          selectPrevious: function() {
+            return t(this.$element, i.PREVIOUS)
+          },
+          setActiveDescendant: function(e) {
+            this.$element.attr("aria-activedescendant", e)
+          },
+          isDisabled: function() {
+            return this.$element[0].hasAttribute("disabled")
+          }
+        }, {
+          restrict: "E",
+          controller: ["$element", e],
+          require: ["mdRadioGroup", "?ngModel"],
+          link: {
+            pre: function(e, o, t, n) {
+              o.addClass("_md"), l(o);
+              var r = n[0],
+                i = n[1] || d.fakeNgModel();
+
+              function a() {
+                o.hasClass("md-focused") || o.addClass("md-focused")
+              }
+              r.init(i), e.mouseActive = !1, o.attr({
+                role: "radiogroup",
+                tabIndex: o.attr("tabindex") || "0"
+              }).on("keydown", function(e) {
+                var t = e.which || e.keyCode;
+                if (t === s.KEY_CODE.ENTER || e.currentTarget === e.target) switch (t) {
+                  case s.KEY_CODE.LEFT_ARROW:
+                  case s.KEY_CODE.UP_ARROW:
+                    e.preventDefault(), r.selectPrevious(), a();
+                    break;
+                  case s.KEY_CODE.RIGHT_ARROW:
+                  case s.KEY_CODE.DOWN_ARROW:
+                    e.preventDefault(), r.selectNext(), a();
+                    break;
+                  case s.KEY_CODE.SPACE:
+                    e.preventDefault(), r.selectCurrent();
+                    break;
+                  case s.KEY_CODE.ENTER:
+                    var n = be.element(d.getClosest(o[0], "form"));
+                    0 < n.length && n.triggerHandler("submit")
+                }
+              }).on("mousedown", function() {
+                e.mouseActive = !0, c(function() {
+                  e.mouseActive = !1
+                }, 100)
+              }).on("focus", function() {
+                !1 === e.mouseActive && r.$element.addClass("md-focused")
+              }).on("blur", function() {
+                r.$element.removeClass("md-focused")
+              }), d.nextTick(function() {
+                var e = m(r.$element);
+                e.count() && !r.$element[0].hasAttribute("aria-activedescendant") && r.setActiveDescendant(e.first().id)
+              })
+            }
+          }
+        };
+
+        function e(e) {
+          this._radioButtonRenderFns = [], this.$element = e
+        }
+
+        function m(e) {
+          return d.iterator(e[0].querySelectorAll("md-radio-button"), !0)
+        }
+
+        function t(e, t) {
+          var n, o = m(e);
+          if (o.count()) {
+            var r = e[0].querySelector("md-radio-button.md-checked");
+            r ? t !== i.PREVIOUS && t !== i.NEXT || (n = o[t === i.PREVIOUS ? "previous" : "next"](r, function(e) {
+              return !be.element(e).attr("disabled")
+            })) : n = o.first(), n && be.element(n).triggerHandler("click")
+          }
+        }
+      }
+
+      function t(s, l, c) {
+        var m = "md-checked";
+        return {
+          restrict: "E",
+          require: "^mdRadioGroup",
+          transclude: !0,
+          template: '<div class="md-container" md-ink-ripple md-ink-ripple-checkbox><div class="md-off"></div><div class="md-on"></div></div><div ng-transclude class="md-label"></div>',
+          link: function(t, n, o, r) {
+            var i;
+            c(n),
+              function(e) {
+                e.attr({
+                  id: o.id || "radio_" + l.nextUid(),
+                  role: "radio",
+                  "aria-checked": "false"
+                }), s.expectWithText(e, "aria-label")
+              }(n), n.addClass("md-auto-horizontal-margin"), o.ngValue ? l.nextTick(e, !1) : e();
+
+            function e() {
+              if (!r) throw "RadioButton: No RadioGroupController could be found.";
+              r.add(d), o.$observe("value", d), n.on("click", a).on("$destroy", function() {
+                r.remove(d)
+              })
+            }
+
+            function a(e) {
+              n[0].hasAttribute("disabled") || r.isDisabled() || t.$apply(function() {
+                r.setViewValue(o.value, e && e.type)
+              })
+            }
+
+            function d() {
+              var e = r.getViewValue() == o.value;
+              e !== i && (n[0] && n[0].parentNode && "md-radio-group" !== n[0].parentNode.nodeName.toLowerCase() && n.parent().toggleClass(m, e), e && r.setActiveDescendant(n.attr("id")), i = e, n.attr("aria-checked", e).toggleClass(m, e))
+            }
+          }
+        }
+      }
+    }(),
+    function() {
+      e.$inject = ["$mdSelect", "$mdUtil", "$mdConstant", "$mdTheming", "$mdAria", "$parse", "$sce"], t.$inject = ["$parse", "$mdUtil", "$mdConstant", "$mdTheming"], o.$inject = ["$mdButtonInkRipple", "$mdUtil", "$mdTheming"], r.$inject = ["$$interimElementProvider"], i.$inject = ["$element"];
+      var P = 8,
+        n = 0,
+        c = be.element('<div class="md-container"><div class="md-icon"></div></div>');
+
+      function e(L, R, F, B, U, j, z) {
+        return {
+          restrict: "E",
+          require: ["^?mdInputContainer", "mdSelect", "ngModel", "?^form"],
+          compile: function(e, t) {
+            var n = R.parseAttributeBoolean(t.multiple);
+            e.addClass("md-auto-horizontal-margin");
+            var o = be.element("<md-select-value><span></span></md-select-value>");
+            o.append('<span class="md-select-icon" aria-hidden="true"></span>'), o.addClass("md-select-value"), o[0].hasAttribute("id") || o.attr("id", "select_value_label_" + R.nextUid());
+            var r = e.find("md-content");
+            r.length || (e.append(be.element("<md-content>").append(e.contents())), r = e.find("md-content"));
+            r.attr("role", "listbox"), r.attr("tabindex", "-1"), n ? r.attr("aria-multiselectable", "true") : r.attr("aria-multiselectable", "false");
+            t.mdOnOpen && (e.find("md-content").prepend(be.element('<div> <md-progress-circular md-mode="indeterminate" ng-if="$$loadingAsyncDone === false" md-diameter="25px"></md-progress-circular></div>')), e.find("md-option").attr("ng-show", "$$loadingAsyncDone"));
+            if (t.name) {
+              var i = be.element('<select class="md-visually-hidden"></select>');
+              i.attr({
+                name: t.name,
+                "aria-hidden": "true",
+                tabindex: "-1"
+              });
+              var a = e.find("md-option");
+              be.forEach(a, function(e) {
+                var t = be.element("<option>" + e.innerHTML + "</option>");
+                e.hasAttribute("ng-value") ? t.attr("ng-value", e.getAttribute("ng-value")) : e.hasAttribute("value") && t.attr("value", e.getAttribute("value")), i.append(t)
+              }), i.append('<option ng-value="' + t.ngModel + '" selected></option>'), e.parent().append(i)
+            }
+            var d = n ? "multiple" : "",
+              s = t.ngModelOptions ? R.supplant('ng-model-options="{0}"', [t.ngModelOptions]) : "",
+              l = '<div class="md-select-menu-container" aria-hidden="true" role="presentation">  <md-select-menu role="presentation" {0} {1}>{2}</md-select-menu></div>';
+            l = R.supplant(l, [d, s, e.html()]), e.empty().append(o), e.append(l), t.tabindex || t.$set("tabindex", 0);
+            return function(r, i, a, e) {
+              var t, n, d, o, s, l, c = !0,
+                m = e[0],
+                u = e[1],
+                p = e[2],
+                h = e[3],
+                f = i.find("md-select-value"),
+                b = be.isDefined(a.readonly),
+                g = R.parseAttributeBoolean(a.mdNoAsterisk),
+                E = be.isDefined(a.ariaLabelledby),
+                v = i.find("md-content"),
+                $ = i.attr("placeholder");
+              if (g && i.addClass("md-no-asterisk"), m) {
+                var M = m.isErrorGetter || function() {
+                  return p.$invalid && (p.$touched || h && h.$submitted)
+                };
+                if (m.input && i.find("md-select-header").find("input")[0] !== m.input[0]) throw new Error("<md-input-container> can only have *one* child <input>, <textarea>, or <select> element!");
+                if (m.input = i, m.label) m.label.attr("aria-hidden", "true"), v.attr("aria-label", m.label.text()), m.setHasPlaceholder(!!$);
+                else {
+                  U.expect(i, "aria-label", $);
+                  var y = i.attr("aria-label");
+                  y = y || $, v.attr("aria-label", y)
+                }
+                var C = r.$watch(M, m.setInvalid)
+              }
+              l = be.element(i[0].querySelector(".md-select-menu-container")), o = r, a.mdContainerClass && l.addClass(a.mdContainerClass), (s = l.find("md-select-menu").controller("mdSelectMenu")).init(p, a), i.on("$destroy", function() {
+                l.remove()
+              }), d = l, B(i);
+              var T = p.$render;
+              p.$render = function() {
+                T(), k(), I()
+              };
+              var A = a.$observe("placeholder", p.$render),
+                w = a.$observe("required", function(e) {
+                  m && m.label && m.label.toggleClass("md-required", e && !g), i.removeAttr("aria-required"), e ? v.attr("aria-required", "true") : v.removeAttr("aria-required")
+                });
+              if (u.setSelectValueText = function(e) {
+                  var t = e === ge || "" === e,
+                    n = !1;
+                  if (u.setIsPlaceholder(!e), a.mdSelectedText && a.mdSelectedHtml) throw Error("md-select cannot have both `md-selected-text` and `md-selected-html`");
+                  if (a.mdSelectedText || a.mdSelectedHtml) e = j(a.mdSelectedText || a.mdSelectedHtml)(r), n = !0;
+                  else if (t) {
+                    e = a.placeholder || (m && m.label ? m.label.text() : "") || "", n = !0
+                  }
+                  var o = f.children().eq(0);
+                  a.mdSelectedHtml ? o.html(z.getTrustedHtml(e)) : n ? o.text(e) : o.html(e), t ? (f.attr("aria-hidden", "true"), E || i.removeAttr("aria-labelledby")) : (f.removeAttr("aria-hidden"), E || i.attr("aria-labelledby", i[0].id + " " + f[0].id))
+                }, u.setIsPlaceholder = function(e) {
+                  e ? (f.addClass("md-select-placeholder"), m && m.label && !i.attr("placeholder") && m.label.addClass("md-placeholder")) : (f.removeClass("md-select-placeholder"), m && m.label && !i.attr("placeholder") && m.label.removeClass("md-placeholder"))
+                }, !b) {
+                i.on("focus", function() {
+                  m && m.setFocused(!0)
+                }), i.on("blur", function(e) {
+                  c && (c = !1, o._mdSelectIsOpen && e.stopImmediatePropagation()), m && m.setFocused(!1), I()
+                })
+              }
+              u.triggerClose = function() {
+                j(a.mdOnClose)(r)
+              }, r.$$postDigest(function() {
+                ! function() {
+                  var e = i.attr("aria-label") || i.attr("placeholder");
+                  !e && m && m.label && (e = m.label.text());
+                  U.expect(i, "aria-label", e)
+                }(), k()
+              });
+              var _ = r.$watch(function() {
+                return s.getSelectedLabels()
+              }, k);
+
+              function k() {
+                s = s || d.find("md-select-menu").controller("mdSelectMenu"), u.setSelectValueText(s.getSelectedLabels())
+              }
+              var x = a.$observe("mdMultiple", function(e) {
+                  n && n();
+                  var t = j(e);
+                  n = r.$watch(function() {
+                    return t(r)
+                  }, function(e, t) {
+                    var n = d.find("md-select-menu");
+                    if (e !== ge || t !== ge) {
+                      if (e) {
+                        var o = {
+                          multiple: "multiple"
+                        };
+                        i.attr(o), n.attr(o)
+                      } else i.removeAttr("multiple"), n.removeAttr("multiple");
+                      i.find("md-content").attr("aria-multiselectable", e ? "true" : "false"), d && (s.setMultiple(Boolean(e)), T = p.$render, p.$render = function() {
+                        T(), k(), I()
+                      }, p.$render())
+                    }
+                  })
+                }),
+                N = a.$observe("disabled", function(e) {
+                  be.isString(e) && (e = !0), t !== ge && t === e || ((t = e) ? i.attr({
+                    "aria-disabled": "true"
+                  }).removeAttr("tabindex").removeAttr("aria-expanded").removeAttr("aria-haspopup").off("click", P).off("keydown", O) : i.attr({
+                    tabindex: a.tabindex,
+                    "aria-haspopup": "listbox"
+                  }).removeAttr("aria-disabled").on("click", P).on("keydown", O))
+                });
+              a.hasOwnProperty("disabled") || a.hasOwnProperty("ngDisabled") || (i.attr({
+                "aria-disabled": "false"
+              }), i.on("click", P), i.on("keydown", O));
+              var S = {
+                role: "button",
+                "aria-haspopup": "listbox"
+              };
+              i[0].hasAttribute("id") || (S.id = "select_" + R.nextUid());
+              var D = "select_container_" + R.nextUid();
+              d.attr("id", D);
+              var H = "select_listbox_" + R.nextUid();
+
+              function I() {
+                R.nextTick(function() {
+                  m && m.setHasValue(0 < s.getSelectedLabels().length || (i[0].validity || {}).badInput)
+                })
+              }
+
+              function O(e) {
+                if (F.isNavigationKey(e)) e.preventDefault(), P();
+                else if (q(e, F)) {
+                  e.preventDefault();
+                  var t = s.optNodeForKeyboardSearch(e);
+                  if (!t || t.hasAttribute("disabled")) return;
+                  var n = be.element(t).controller("mdOption");
+                  s.isMultiple || be.forEach(Object.keys(s.selected), function(e) {
+                    s.deselect(e)
+                  }), s.select(n.hashKey, n.value), s.refreshViewValue()
+                }
+              }
+
+              function P() {
+                o._mdSelectIsOpen = !0, i.attr("aria-expanded", "true"), L.show({
+                  scope: o,
+                  preserveScope: !0,
+                  skipCompile: !0,
+                  element: d,
+                  target: i[0],
+                  selectCtrl: u,
+                  preserveElement: !0,
+                  hasBackdrop: !0,
+                  loadingAsync: !!a.mdOnOpen && (r.$eval(a.mdOnOpen) || !0)
+                }).finally(function() {
+                  o._mdSelectIsOpen = !1, i.removeAttr("aria-expanded"), i.removeAttr("aria-activedescendant"), p.$setTouched()
+                })
+              }
+              d.find("md-content").attr("id", H), i.find("md-select-menu").length || (S["aria-owns"] = H), i.attr(S), r.$on("$destroy", function() {
+                w && w(), N && N(), n && n(), x && x(), _ && _(), A && A(), C && C(), i.off("focus"), i.off("blur"), L.destroy().finally(function() {
+                  m && (m.setFocused(!1), m.setHasValue(!1), m.input = null), p.$setTouched()
+                })
+              })
+            }
+          },
+          controller: function() {}
+        }
+      }
+
+      function t(h, f, e, r) {
+        return {
+          restrict: "E",
+          require: ["mdSelectMenu"],
+          scope: !(t.$inject = ["$scope", "$attrs", "$element"]),
+          controller: t,
+          link: {
+            pre: function(i, e, t, n) {
+              var a = n[0];
+
+              function o(e) {
+                var t = f.getClosest(e.target, "md-option"),
+                  n = t && be.element(t).data("$mdOptionController");
+                if (t && n)
+                  if (t.hasAttribute("disabled")) e.stopImmediatePropagation();
+                  else {
+                    var o = a.hashGetter(n.value),
+                      r = be.isDefined(a.selected[o]);
+                    i.$apply(function() {
+                      a.isMultiple ? r ? a.deselect(o) : a.select(o, n.value) : r || (be.forEach(Object.keys(a.selected), function(e) {
+                        a.deselect(e)
+                      }), a.select(o, n.value)), a.refreshViewValue()
+                    })
+                  }
+                else e.target && e.target.parentNode && "MD-SELECT-HEADER" === e.target.parentNode.tagName && e.stopImmediatePropagation()
+              }
+              e.addClass("_md"), r(e), e.on("click", o), e.on("keypress", function(e) {
+                13 !== e.keyCode && 32 !== e.keyCode || o(e)
+              })
+            }
+          }
+        };
+
+        function t(i, r, a) {
+          var d, o, s, l, c = this,
+            m = "";
+
+          function u() {
+            var n = c.ngModel.$modelValue || c.ngModel.$viewValue || [];
+            if (be.isArray(n)) {
+              var e = Object.keys(c.selected),
+                t = n.map(c.hashGetter);
+              e.filter(function(e) {
+                return -1 === t.indexOf(e)
+              }).forEach(c.deselect), t.forEach(function(e, t) {
+                c.select(e, n[t])
+              })
+            }
+          }
+
+          function p() {
+            var e = c.ngModel.$viewValue || c.ngModel.$modelValue;
+            Object.keys(c.selected).forEach(c.deselect), c.select(c.hashGetter(e), e)
+          }
+          c.isMultiple = be.isDefined(r.multiple), c.selected = {}, c.options = {}, i.$watchCollection(function() {
+            return c.options
+          }, function() {
+            c.ngModel.$render(),
+              function() {
+                var e, t;
+                if (!a.find("md-optgroup").length) return;
+                for (t = a.find("md-option"), e = 0; e < t.length; e++) t[e].setAttribute("aria-setsize", t.length), t[e].setAttribute("aria-posinset", e + 1)
+              }()
+          }), c.setMultiple = function(e) {
+            var t = c.ngModel;
+            if (d = d || t.$isEmpty, c.isMultiple = e, c.isMultiple) {
+              var n = !1,
+                o = function(e) {
+                  n ? u() : f.nextTick(function() {
+                    u(), n = !0
+                  })
+                };
+              t.$validators["md-multiple"] = r, t.$render = o, i.$watchCollection(c.modelBinding, function(e) {
+                r(e) && o()
+              }), t.$isEmpty = function(e) {
+                return !e || 0 === e.length
+              }
+            } else delete t.$validators["md-multiple"], t.$render = p;
+
+            function r(e, t) {
+              return be.isArray(e || t || [])
+            }
+          }, c.optNodeForKeyboardSearch = function(e) {
+            var t, n;
+            for (o && clearTimeout(o), o = setTimeout(function() {
+                m = "", s = l = o = ge
+              }, 300), m += e.key, t = new RegExp("^" + f.sanitize(m), "i"), s || (s = a.find("md-option"), l = new Array(s.length), be.forEach(s, function(e, t) {
+                l[t] = e.textContent.trim()
+              })), n = 0; n < l.length; ++n)
+              if (t.test(l[n])) return s[n]
+          }, c.init = function(e, t) {
+            function o(e) {
+              return be.isObject(e) && !be.isArray(e) ? "object_" + (e.$$mdSelectId || (e.$$mdSelectId = ++n)) : e + ""
+            }
+            c.ngModel = e, c.modelBinding = t.ngModel, c.ngModel.$isEmpty = function(e) {
+              var t = c.options[c.hashGetter(e)] ? c.options[c.hashGetter(e)].value : null;
+              return !be.isDefined(t) || null === t || "" === t || t != t
+            }, r.ngModelOptions ? c.hashGetter = function(e) {
+              var t = h(r.ngModelOptions)(i),
+                n = t && t.trackBy;
+              return n ? h(n)(i, {
+                $value: e
+              }) : be.isObject(e) ? o(e) : e
+            } : c.hashGetter = o, c.setMultiple(c.isMultiple), t.hasOwnProperty("mdSelectOnlyOption") && f.nextTick(function() {
+              var e = Object.keys(c.options);
+              if (1 === e.length) {
+                var t = c.options[e[0]];
+                c.deselect(Object.keys(c.selected)[0]), c.select(c.hashGetter(t.value), t.value), c.refreshViewValue(), c.ngModel.$setPristine()
+              }
+            }, !1)
+          }, c.setActiveDescendant = function(e) {
+            be.isDefined(e) ? a.find("md-content").attr("aria-activedescendant", e) : a.find("md-content").removeAttr("aria-activedescendant")
+          }, c.getSelectedLabels = function(e) {
+            var t, n = (e = e || {}).mode || "html",
+              o = f.nodesToArray(a[0].querySelectorAll("md-option[selected]"));
+            return o.length ? ("html" === n ? t = function(e) {
+              if (e.hasAttribute("md-option-empty")) return "";
+              var t = e.innerHTML,
+                n = e.querySelector(".md-ripple-container");
+              n && (t = t.replace(n.outerHTML, ""));
+              var o = e.querySelector(".md-container");
+              return o && (t = t.replace(o.outerHTML, "")), t
+            } : "aria" === n && (t = function(e) {
+              return e.hasAttribute("aria-label") ? e.getAttribute("aria-label") : e.textContent
+            }), f.uniq(o.map(t)).join(", ")) : ""
+          }, c.select = function(e, t) {
+            var n = c.options[e];
+            n && n.setSelected(!0, c.isMultiple), c.selected[e] = t
+          }, c.deselect = function(e) {
+            var t = c.options[e];
+            t && t.setSelected(!1, c.isMultiple), delete c.selected[e]
+          }, c.addOption = function(e, t) {
+            if (be.isDefined(c.options[e])) throw new Error('Duplicate md-option values are not allowed in a select. Duplicate value "' + t.value + '" found.');
+            c.options[e] = t, be.isDefined(c.selected[e]) && (c.select(e, t.value), be.isDefined(c.ngModel.$$rawModelValue) && c.hashGetter(c.ngModel.$$rawModelValue) === e && c.ngModel.$validate(), c.refreshViewValue())
+          }, c.removeOption = function(e) {
+            delete c.options[e]
+          }, c.refreshViewValue = function() {
+            var e, t = [];
+            for (var n in c.selected)(e = c.options[n]) ? t.push(e.value) : t.push(c.selected[n]);
+            var o = c.isMultiple ? t : t[0];
+            ! function(e, t) {
+              {
+                if (c.isMultiple) {
+                  if (be.isArray(e)) {
+                    if (e.length !== t.length) return !1;
+                    var n = e.map(function(e) {
+                      return c.hashGetter(e)
+                    });
+                    return t.every(function(e) {
+                      var t = c.hashGetter(e);
+                      return n.some(function(e) {
+                        return e === t
+                      })
+                    })
+                  }
+                  return !1
+                }
+                return c.hashGetter(e) === c.hashGetter(t)
+              }
+            }(c.ngModel.$modelValue, o) && (c.ngModel.$setViewValue(o), c.ngModel.$render())
+          }
+        }
+      }
+
+      function o(o, r, l) {
+        return {
+          restrict: "E",
+          require: ["mdOption", "^^mdSelectMenu"],
+          controller: i,
+          compile: function(e, t) {
+            e.append(be.element('<div class="md-text">').append(e.contents())), e.attr("tabindex", t.tabindex || "0"),
+              function(e) {
+                var t = e.value,
+                  n = e.ngValue;
+                return t || n
+              }(t) || e.attr("md-option-empty", "");
+            return n
+          }
+        };
+
+        function n(i, n, e, t) {
+          var a = t[0],
+            d = t[1];
+
+          function s(e, t, n) {
+            if (d.hashGetter) {
+              var o = d.hashGetter(t, i),
+                r = d.hashGetter(e, i);
+              a.hashKey = r, a.value = e, d.removeOption(o, a), d.addOption(r, a)
+            } else n || i.$$postDigest(function() {
+              s(e, t, !0)
+            })
+          }
+          l(n), d.isMultiple && (n.addClass("md-checkbox-enabled"), n.prepend(c.clone())), be.isDefined(e.ngValue) ? i.$watch(e.ngValue, function(e, t) {
+              s(e, t), n.removeAttr("aria-checked")
+            }) : be.isDefined(e.value) ? s(e.value) : i.$watch(function() {
+              return n.text().trim()
+            }, s), e.$observe("disabled", function(e) {
+              e ? n.attr("tabindex", "-1") : n.attr("tabindex", "0")
+            }), i.$$postDigest(function() {
+              e.$observe("selected", function(e) {
+                be.isDefined(e) && ("string" == typeof e && (e = !0), e ? (d.isMultiple || d.deselect(Object.keys(d.selected)[0]), d.select(a.hashKey, a.value)) : d.deselect(a.hashKey), d.refreshViewValue())
+              })
+            }), o.attach(i, n),
+            function() {
+              var e = {
+                role: "option"
+              };
+              d.isMultiple && (e["aria-selected"] = "false");
+              n[0].hasAttribute("id") || (e.id = "select_option_" + r.nextUid());
+              n.attr(e)
+            }(), i.$on("$destroy", function() {
+              d.removeOption(a.hashKey, a)
+            })
+        }
+      }
+
+      function i(n) {
+        this.setSelected = function(e, t) {
+          e ? n.attr({
+            selected: "true",
+            "aria-selected": "true"
+          }) : e || (n.removeAttr("selected"), t ? n.attr("aria-selected", "false") : n.removeAttr("aria-selected"))
+        }
+      }
+
+      function r(e) {
+        return t.$inject = ["$mdSelect", "$mdConstant", "$mdUtil", "$window", "$q", "$$rAF", "$animateCss", "$animate", "$document"], e("$mdSelect").setDefaults({
+          methods: ["target"],
+          options: t
+        });
+
+        function t(l, c, D, H, r, i, m, u, I) {
+          var p = D.dom.animator,
+            h = c.KEY_CODE;
+          return {
+            parent: "body",
+            themable: !0,
+            onShow: function(n, a, d) {
+              return function() {
+                  d.loadingAsync && !d.isRemoved && (n.$$loadingAsyncDone = !1, r.when(d.loadingAsync).then(function() {
+                    n.$$loadingAsyncDone = !0, delete d.loadingAsync
+                  }).then(function() {
+                    i(o)
+                  }))
+                }(),
+                function(e, t) {
+                  var n = a.find("md-select-menu");
+                  if (!t.target) throw new Error(D.supplant("$mdSelect.show() expected a target element in options.target but got '{0}'!", [t.target]));
+                  be.extend(t, {
+                    isRemoved: !1,
+                    target: be.element(t.target),
+                    parent: be.element(t.parent),
+                    selectEl: n,
+                    contentEl: a.find("md-content"),
+                    optionNodes: n[0].getElementsByTagName("md-option")
+                  })
+                }(0, d), d.hideBackdrop = function(e, t, n) {
+                  n.disableParentScroll && !D.getClosest(n.target, "MD-DIALOG") ? n.restoreScroll = D.disableScrollAround(n.element, n.parent) : n.disableParentScroll = !1;
+                  n.hasBackdrop && (n.backdrop = D.createBackdrop(e, "md-select-backdrop md-click-catcher"), u.enter(n.backdrop, I[0].body, null, {
+                    duration: 0
+                  }));
+                  return function() {
+                    n.backdrop && n.backdrop.remove(), n.disableParentScroll && n.restoreScroll(), delete n.restoreScroll
+                  }
+                }(n, 0, d),
+                function(e, n, t) {
+                  t.parent !== n.parent() && n.parent().attr("aria-owns", n.find("md-content").attr("id"));
+                  return t.parent.append(n), r(function(e, t) {
+                    try {
+                      m(n, {
+                        removeClass: "md-leave",
+                        duration: 0
+                      }).start().then(o).then(e)
+                    } catch (e) {
+                      t(e)
+                    }
+                  })
+                }(0, a, d).then(function(e) {
+                  return a.attr("aria-hidden", "false"), d.alreadyOpen = !0, d.cleanupInteraction = function() {
+                    if (d.isRemoved) return;
+                    var o = d.selectEl,
+                      i = o.controller("mdSelectMenu") || {};
+                    return a.addClass("md-clickable"), d.backdrop && d.backdrop.on("click", e), o.on("keydown", t), o.on("click", r),
+                      function() {
+                        d.backdrop && d.backdrop.off("click", e), o.off("keydown", t), o.off("click", r), a.removeClass("md-clickable"), d.isRemoved = !0
+                      };
+
+                    function e(e) {
+                      e.preventDefault(), e.stopPropagation(), d.restoreFocus = !1, D.nextTick(l.hide, !0)
+                    }
+
+                    function t(e) {
+                      switch (e.preventDefault(), e.stopPropagation(), e.keyCode) {
+                        case h.UP_ARROW:
+                          return void n("prev");
+                        case h.DOWN_ARROW:
+                          return void n("next");
+                        case h.SPACE:
+                        case h.ENTER:
+                          d.focusedNode && (o.triggerHandler({
+                            type: "click",
+                            target: d.focusedNode
+                          }), e.preventDefault()), r(e);
+                          break;
+                        case h.TAB:
+                        case h.ESCAPE:
+                          e.stopPropagation(), e.preventDefault(), d.restoreFocus = !0, D.nextTick(l.hide, !0);
+                          break;
+                        default:
+                          if (q(e, c)) {
+                            var t = i.optNodeForKeyboardSearch(e);
+                            t && !t.hasAttribute("disabled") && s(d.focusedNode, t, i)
+                          }
+                      }
+                    }
+
+                    function n(e) {
+                      for (var t, n = D.nodesToArray(d.optionNodes), o = n.indexOf(d.focusedNode), r = n[o]; - 1 === o ? o = 0 : "next" === e && o < n.length - 1 ? o++ : "prev" === e && 0 < o && o--, (t = n[o]).hasAttribute("disabled") && (t = null), !t && o < n.length - 1 && 0 < o;);
+                      s(r, t, i)
+                    }
+
+                    function r(n) {
+                      n && "click" === n.type && n.currentTarget !== o[0] || function() {
+                        var e = !1;
+                        if (n && 0 < n.currentTarget.children.length) {
+                          var t = n.currentTarget.children[0];
+                          if (t.scrollHeight > t.clientHeight && 0 < t.children.length) n.pageX - n.currentTarget.getBoundingClientRect().left > t.querySelector("md-option").offsetWidth && (e = !0)
+                        }
+                        return e
+                      }() || d.focusedNode && d.focusedNode.hasAttribute && !d.focusedNode.hasAttribute("disabled") && (n.preventDefault(), n.stopPropagation(), i.isMultiple || (d.restoreFocus = !0, D.nextTick(function() {
+                        l.hide(i.ngModel.$viewValue), d.focusedNode.classList.remove("md-focused")
+                      }, !0)))
+                    }
+                  }(), d.cleanupResizing = function() {
+                    var e = function(o, r, i) {
+                        return function() {
+                          if (!i.isRemoved) {
+                            var e = f(o, r, i),
+                              t = e.container,
+                              n = e.dropDown;
+                            t.element.css(p.toCss(t.styles)), n.element.css(p.toCss(n.styles))
+                          }
+                        }
+                      }(n, a, d),
+                      t = be.element(H);
+                    return t.on("resize", e), t.on("orientationchange", e),
+                      function() {
+                        t.off("resize", e), t.off("orientationchange", e)
+                      }
+                  }(), d.contentEl[0].focus(), e
+                }, d.hideBackdrop);
+
+              function o() {
+                return r(function(e) {
+                  if (d.isRemoved) return r.reject(!1);
+                  var t = f(n, a, d);
+                  t.container.element.css(p.toCss(t.container.styles)), t.dropDown.element.css(p.toCss(t.dropDown.styles)), i(function() {
+                    a.addClass("md-active"), t.dropDown.element.css(p.toCss({
+                        transform: ""
+                      })),
+                      function(e) {
+                        var t;
+                        e && !e.hasAttribute("disabled") && (t = d.selectEl.controller("mdSelectMenu"), s(null, e, t))
+                      }(d.focusedNode), e()
+                  })
+                })
+              }
+
+              function s(e, t, n) {
+                var o = d.contentEl[0];
+                if (t) {
+                  if (e && e.classList.remove("md-focused"), t.classList.add("md-focused"), n && n.setActiveDescendant && n.setActiveDescendant(t.id), o.scrollHeight > o.clientHeight) {
+                    var r = o.clientHeight + o.scrollTop,
+                      i = t.offsetTop + t.offsetHeight;
+                    r < i ? o.scrollTop = i - o.clientHeight : t.offsetTop < o.scrollTop && (o.scrollTop = t.offsetTop)
+                  }
+                  d.focusedNode = t, n && n.refreshViewValue && n.refreshViewValue()
+                }
+              }
+            },
+            onRemove: function(e, t, n) {
+              var o = null,
+                r = e.$on("$destroy", function() {
+                  o.end()
+                });
+              return (n = n || {}).cleanupInteraction(), n.cleanupResizing(), n.hideBackdrop(), !0 === n.$destroy ? i() : function() {
+                return (o = m(t, {
+                  addClass: "md-leave"
+                })).start()
+              }().then(i);
+
+              function i() {
+                r(), t.removeClass("md-active").attr("aria-hidden", "true").css({
+                    display: "none",
+                    top: "",
+                    right: "",
+                    bottom: "",
+                    left: "",
+                    "font-size": "",
+                    "min-width": ""
+                  }),
+                  function(e) {
+                    var t = e.selectCtrl;
+                    if (t) {
+                      var n = e.selectEl.controller("mdSelectMenu");
+                      t.setSelectValueText(n ? n.getSelectedLabels() : ""), t.triggerClose()
+                    }
+                  }(n), n.$destroy || (n.restoreFocus ? n.target.focus() : D.nextTick(function() {
+                    n.target.triggerHandler("blur")
+                  }, !0))
+              }
+            },
+            hasBackdrop: !0,
+            disableParentScroll: !0
+          };
+
+          function f(e, t, n) {
+            var o, r = t[0],
+              i = n.target[0].children[0],
+              a = I[0].body,
+              d = n.selectEl[0],
+              s = n.contentEl[0],
+              l = a.getBoundingClientRect(),
+              c = i.getBoundingClientRect(),
+              m = {
+                left: l.left + P,
+                top: P,
+                bottom: l.height - P,
+                right: l.width - P - (D.floatingScrollbars() ? 16 : 0)
+              },
+              u = c.top - m.top,
+              p = (c.left, c.left, c.width, m.bottom - (c.top + c.height)),
+              h = l.width - 2 * P,
+              f = d.querySelector("md-option[selected]"),
+              b = d.getElementsByTagName("md-option"),
+              g = d.getElementsByTagName("md-optgroup"),
+              E = function(e, t) {
+                var n = !1;
+                try {
+                  var o = e[0].style.display;
+                  e[0].style.display = "block", n = t.scrollHeight > t.offsetHeight, e[0].style.display = o
+                } finally {}
+                return n
+              }(t, s);
+            o = function(e) {
+              return e && be.isFunction(e.then)
+            }(n.loadingAsync) ? s.firstElementChild || s : f || (g.length ? g[0] : b.length ? b[0] : s.firstElementChild || s), s.offsetWidth > h ? s.style["max-width"] = h + "px" : s.style.maxWidth = null, E && d.classList.add("md-overflow");
+            var v = o;
+            "MD-OPTGROUP" === (v.tagName || "").toUpperCase() && (o = v = b[0] || s.firstElementChild || s), n.focusedNode = v, r.style.display = "block";
+            var $, M, y, C, T, A = d.getBoundingClientRect(),
+              w = function(e) {
+                return e ? {
+                  left: e.offsetLeft,
+                  top: e.offsetTop,
+                  width: e.offsetWidth,
+                  height: e.offsetHeight
+                } : {
+                  left: 0,
+                  top: 0,
+                  width: 0,
+                  height: 0
+                }
+              }(o);
+            if (o) {
+              var _ = H.getComputedStyle(o);
+              w.paddingLeft = parseInt(_.paddingLeft, 10) || 0, w.paddingRight = parseInt(_.paddingRight, 10) || 0
+            }
+            if (E) {
+              var k = s.offsetHeight / 2;
+              s.scrollTop = w.top + w.height / 2 - k, u < k ? s.scrollTop = Math.min(w.top, s.scrollTop + k - u) : p < k && (s.scrollTop = Math.max(w.top + w.height - A.height, s.scrollTop - k + p))
+            }
+            $ = c.left + w.left - w.paddingLeft, M = Math.floor(c.top + c.height / 2 - w.height / 2 - w.top + s.scrollTop) + 2, y = w.left + c.width / 2 + "px " + (w.top + w.height / 2 - s.scrollTop) + "px 0px", C = Math.min(c.width + w.paddingLeft + w.paddingRight, h), T = L.getComputedStyle(i)["font-size"];
+            var x = r.getBoundingClientRect(),
+              N = Math.round(100 * Math.min(c.width / A.width, 1)) / 100,
+              S = Math.round(100 * Math.min(c.height / A.height, 1)) / 100;
+            return {
+              container: {
+                element: be.element(r),
+                styles: {
+                  left: Math.floor(O(m.left, $, m.right - C)),
+                  top: Math.floor(O(m.top, M, m.bottom - x.height)),
+                  "min-width": C,
+                  "font-size": T
+                }
+              },
+              dropDown: {
+                element: be.element(d),
+                styles: {
+                  transformOrigin: y,
+                  transform: n.alreadyOpen ? "" : D.supplant("scale({0},{1})", [N, S])
+                }
+              }
+            }
+          }
+        }
+
+        function O(e, t, n) {
+          return Math.max(e, Math.min(t, n))
+        }
+      }
+
+      function q(e, t) {
+        var n = String.fromCharCode(e.keyCode),
+          o = e.keyCode <= 31;
+        return n && n.length && !o && !t.isMetaKey(e) && !t.isFnLockKey(e) && !t.hasModifierKey(e)
+      }
+      be.module("material.components.select", ["material.core", "material.components.backdrop"]).directive("mdSelect", e).directive("mdSelectMenu", t).directive("mdOption", o).directive("mdOptgroup", function() {
+        return {
+          restrict: "E",
+          compile: function(t, n) {
+            t.parent().find("md-select-header").length || function() {
+              var e = t.find("label");
+              e.length || (e = be.element("<label>"), t.prepend(e));
+              e.addClass("md-container-ignore"), e.attr("aria-hidden", "true"), n.label && e.text(n.label);
+              t.attr("aria-label", e.text())
+            }();
+            t.attr("role", "group")
+          }
+        }
+      }).directive("mdSelectHeader", function() {
+        return {
+          restrict: "E"
+        }
+      }).provider("$mdSelect", r)
+    function() {
+      e.$inject = ["$$rAF", "$window", "$mdAria", "$mdUtil", "$mdConstant", "$mdTheming", "$mdGesture", "$parse", "$log", "$timeout"], be.module("material.components.slider", ["material.core"]).directive("mdSlider", e).directive("mdSliderContainer", function() {
+        return {
+          controller: function() {},
+          compile: function(e) {
+            var t = e.find("md-slider");
+            if (t) return t.attr("md-vertical") !== ge && e.attr("md-vertical", ""), t.attr("flex") || t.attr("flex", ""),
+              function(e, a, t, n) {
+                function o(e) {
+                  a.children().attr("disabled", e), a.find("input").attr("disabled", e)
+                }
+                a.addClass("_md");
+                var d, r = be.noop;
+                t.disabled ? o(!0) : t.ngDisabled && (r = e.$watch(t.ngDisabled, function(e) {
+                  o(e)
+                })), e.$on("$destroy", function() {
+                  r()
+                }), n.fitInputWidthToTextLength = function(e) {
+                  var t = a[0].querySelector("md-input-container");
+                  if (t) {
+                    var n = getComputedStyle(t),
+                      o = parseInt(n.minWidth),
+                      r = parseInt(n.paddingLeft) + parseInt(n.paddingRight);
+                    d = d || parseInt(n.maxWidth);
+                    var i = Math.max(d, o + r + o / 2 * e);
+                    t.style.maxWidth = i + "px"
+                  }
+                }
+              }
+          }
+        }
+      });
+      var J = 10,
+        ee = 4;
+
+      function e(q, V, r, W, Y, K, G, X, Z, Q) {
+        return {
+          scope: {},
+          require: ["?ngModel", "?^mdSliderContainer"],
+          template: '<div class="md-slider-wrapper"><div class="md-slider-content"><div class="md-track-container"><div class="md-track"></div><div class="md-track md-track-fill"></div><div class="md-track-ticks"></div></div><div class="md-thumb-container"><div class="md-thumb"></div><div class="md-focus-thumb"></div><div class="md-focus-ring"></div><div class="md-sign"><span class="md-thumb-text"></span></div><div class="md-disabled-thumb"></div></div></div></div>',
+          compile: function(e, t) {
+            var n = be.element(e[0].getElementsByClassName("md-slider-wrapper")),
+              o = t.tabindex || 0;
+            n.attr("tabindex", o), (t.disabled || t.ngDisabled) && n.attr("tabindex", -1);
+            return n.attr("role", "slider"), r.expect(e, "aria-label"), i
+          }
+        };
+
+        function i(n, o, r, e) {
+          K(o);
+          var i = e[0] || {
+              $setViewValue: function(e) {
+                this.$viewValue = e, this.$viewChangeListeners.forEach(function(e) {
+                  e()
+                })
+              },
+              $parsers: [],
+              $formatters: [],
+              $viewChangeListeners: []
+            },
+            a = e[1],
+            d = (be.element(W.getClosest(o, "_md-slider-container", !0)), r.ngDisabled ? be.bind(null, X(r.ngDisabled), n.$parent) : function() {
+              return o[0].hasAttribute("disabled")
+            }),
+            t = be.element(o[0].querySelector(".md-thumb")),
+            s = be.element(o[0].querySelector(".md-thumb-text")),
+            l = t.parent(),
+            c = be.element(o[0].querySelector(".md-track-container")),
+            m = be.element(o[0].querySelector(".md-track-fill")),
+            u = be.element(o[0].querySelector(".md-track-ticks")),
+            p = be.element(o[0].getElementsByClassName("md-slider-wrapper")),
+            h = (be.element(o[0].getElementsByClassName("md-slider-content")), W.throttle(S, 5e3)),
+            f = be.isDefined(r.mdVertical),
+            b = be.isDefined(r.mdDiscrete),
+            g = be.isDefined(r.mdInvert);
+          be.isDefined(r.min) ? r.$observe("min", w) : w(0), be.isDefined(r.max) ? r.$observe("max", _) : _(100), be.isDefined(r.step) ? r.$observe("step", k) : k(1), be.isDefined(r.round) ? r.$observe("round", x) : x(3);
+          be.noop;
+
+          function E() {
+            S(), O()
+          }
+          r.ngDisabled && n.$parent.$watch(r.ngDisabled, function() {
+            o.attr("aria-disabled", !!d())
+          }), G.register(p, "drag", {
+            horizontal: !f
+          }), n.mouseActive = !1, p.on("keydown", function(e) {
+            if (d()) return;
+            var t, n = Y.KEY_CODE;
+            switch (e.keyCode) {
+              case n.DOWN_ARROW:
+              case n.LEFT_ARROW:
+                e.preventDefault(), t = -M;
+                break;
+              case n.UP_ARROW:
+              case n.RIGHT_ARROW:
+                e.preventDefault(), t = M;
+                break;
+              case n.PAGE_DOWN:
+                e.preventDefault(), t = -M * J;
+                break;
+              case n.PAGE_UP:
+                e.preventDefault(), t = M * J;
+                break;
+              case n.HOME:
+                e.preventDefault(), e.stopPropagation(), H(v);
+                break;
+              case n.END:
+                e.preventDefault(), e.stopPropagation(), H($)
+            }
+            t && (t = g ? -t : t, (e.metaKey || e.ctrlKey || e.altKey) && (t *= ee), e.preventDefault(), e.stopPropagation(), H(i.$viewValue + t))
+          }).on("mousedown", function() {
+            (function() {
+              if (!b || d()) return;
+              if (be.isUndefined(M)) return;
+              if (M <= 0) {
+                var e = "Slider step value must be greater than zero when in discrete mode";
+                throw Z.error(e), new Error(e)
+              }
+              var t = Math.floor(($ - v) / M);
+              C || (C = be.element("<canvas>").css("position", "absolute"), u.append(C), T = C[0].getContext("2d"));
+              var n, o = D();
+              !o || o.height || o.width || (S(), o = N);
+              C[0].width = o.width, C[0].height = o.height;
+              for (var r = 0; r <= t; r++) {
+                var i = V.getComputedStyle(u[0]);
+                T.fillStyle = i.color || "black", n = Math.floor((f ? o.height : o.width) * (r / t)), T.fillRect(f ? 0 : n - 1, f ? n - 1 : 0, f ? o.width : 2, f ? 2 : o.height)
+              }
+            })(), n.mouseActive = !0, p.removeClass("md-focused"), Q(function() {
+              n.mouseActive = !1
+            }, 100)
+          }).on("focus", function() {
+            !1 === n.mouseActive && p.addClass("md-focused")
+          }).on("blur", function() {
+            p.removeClass("md-focused"), o.removeClass("md-active"),
+              function() {
+                if (C && T) {
+                  var e = D();
+                  T.clearRect(0, 0, e.width, e.height)
+                }
+              }()
+          }).on("$md.pressdown", function(e) {
+            if (d()) return;
+            o.addClass("md-active"), o[0].focus(), S();
+            var t = P(L(j(U(f ? e.srcEvent.clientY : e.srcEvent.clientX))));
+            n.$apply(function() {
+              I(t), R(z(t))
+            })
+          }).on("$md.pressup", function(e) {
+            if (d()) return;
+            o.removeClass("md-dragging");
+            var t = P(L(j(U(f ? e.srcEvent.clientY : e.srcEvent.clientX))));
+            n.$apply(function() {
+              I(t), O()
+            })
+          }).on("$md.dragstart", function(e) {
+            if (d()) return;
+            F = !0, e.stopPropagation(), o.addClass("md-dragging"), B(e)
+          }).on("$md.drag", function(e) {
+            if (!F) return;
+            e.stopPropagation(), B(e)
+          }).on("$md.dragend", function(e) {
+            if (!F) return;
+            e.stopPropagation(), F = !1
+          }), setTimeout(E, 0);
+          var v, $, M, y, C, T, A = q.throttle(E);
+
+          function w(e) {
+            v = parseFloat(e), i.$viewValue = P(i.$modelValue, v, $), p.attr("aria-valuemin", e), E()
+          }
+
+          function _(e) {
+            $ = parseFloat(e), i.$viewValue = P(i.$modelValue, v, $), p.attr("aria-valuemax", e), E()
+          }
+
+          function k(e) {
+            M = parseFloat(e)
+          }
+
+          function x(e) {
+            y = P(parseInt(e), 0, 6)
+          }
+          be.element(V).on("resize", A), n.$on("$destroy", function() {
+            be.element(V).off("resize", A)
+          }), i.$render = O, i.$viewChangeListeners.push(O), i.$formatters.push(P), i.$formatters.push(L);
+          var N = {};
+
+          function S() {
+            N = c[0].getBoundingClientRect()
+          }
+
+          function D() {
+            return h(), N
+          }
+
+          function H(e) {
+            n.$evalAsync(function() {
+              I(e)
+            })
+          }
+
+          function I(e) {
+            i.$setViewValue(P(L(e)))
+          }
+
+          function O() {
+            isNaN(i.$viewValue) && (i.$viewValue = i.$modelValue), i.$viewValue = P(i.$viewValue);
+            var e = z(i.$viewValue);
+            n.modelValue = i.$viewValue, p.attr("aria-valuenow", i.$viewValue), R(e), s.text(i.$viewValue)
+          }
+
+          function P(e, t, n) {
+            if (be.isNumber(e)) return t = be.isNumber(t) ? t : v, n = be.isNumber(n) ? n : $, Math.max(t, Math.min(n, e))
+          }
+
+          function L(e) {
+            if (be.isNumber(e)) {
+              var t = Math.round((e - v) / M) * M + v;
+              return t = Math.round(t * Math.pow(10, y)) / Math.pow(10, y), a && a.fitInputWidthToTextLength && W.debounce(function() {
+                a.fitInputWidthToTextLength(t.toString().length)
+              }, 100)(), t
+            }
+          }
+
+          function R(e) {
+            var t = 100 * (e = function(e) {
+                return Math.max(0, Math.min(e || 0, 1))
+              }(e)) + "%",
+              n = g ? 100 * (1 - e) + "%" : t;
+            f ? l.css("bottom", t) : W.bidiProperty(l, "left", "right", t), m.css(f ? "height" : "width", n), o.toggleClass(g ? "md-max" : "md-min", 0 === e), o.toggleClass(g ? "md-min" : "md-max", 1 === e)
+          }
+          S();
+          var F = !1;
+
+          function B(e) {
+            b ? function(e) {
+              var t = P(L(j(U(e))));
+              R(U(e)), s.text(t)
+            }(f ? e.srcEvent.clientY : e.srcEvent.clientX) : function(e) {
+              n.$evalAsync(function() {
+                I(j(U(e)))
+              })
+            }(f ? e.srcEvent.clientY : e.srcEvent.clientX)
+          }
+
+          function U(e) {
+            var t = (e - (f ? N.top : N.left)) / (f ? N.height : N.width);
+            return !f && W.isRtl(r) && (t = 1 - t), Math.max(0, Math.min(1, f ? 1 - t : t))
+          }
+
+          function j(e) {
+            return v + (g ? 1 - e : e) * ($ - v)
+          }
+
+          function z(e) {
+            var t = (e - v) / ($ - v);
+            return g ? 1 - t : t
+          }
+        }
+      }
+      return {
+        decreasePageOffset: function(e, t) {
+          var n, o, r = e.canvas,
+            i = d(e);
+          for (n = 0; n < i.length; n++)
+            if (i[n] >= t) {
+              o = i[n];
+              break
+            } return Math.max(0, o - r.clientWidth)
+        },
+        increasePageOffset: function(e, t) {
+          var n, o, r = e.canvas,
+            i = s(e) - r.clientWidth,
+            a = d(e);
+          for (n = 0; a.length, a[n] <= t + r.clientWidth; n++) o = a[n];
+          return Math.min(i, o)
+        },
+        getTabOffsets: d,
+        getTotalTabsWidth: s
+      };
+
+      function d(e) {
+        var t, n, o = 0,
+          r = [];
+        for (t = 0; t < e.tabs.length; t++) n = e.tabs[t], r.push(o), o += n.offsetWidth;
+        return r
+      }
+
+      function s(e) {
+        var t, n = 0;
+        for (t = 0; t < e.tabs.length; t++) n += e.tabs[t].offsetWidth;
+        return n
+      }
+    }), be.module("material.components.tabs").directive("mdTab", function() {
+      return {
+        require: "^?mdTabs",
+        terminal: !0,
+        compile: function(e, t) {
+          var n = s(e, "md-tab-label"),
+            o = s(e, "md-tab-body");
+          if (0 === n.length && (n = be.element("<md-tab-label></md-tab-label>"), t.label ? n.text(t.label) : n.append(e.contents()), 0 === o.length)) {
+            var r = e.contents().detach();
+            (o = be.element("<md-tab-body></md-tab-body>")).append(r)
+          }
+          return e.append(n), o.html() && e.append(o), i
+        },
+        scope: {
+          active: "=?mdActive",
+          disabled: "=?ngDisabled",
+          select: "&?mdOnSelect",
+          deselect: "&?mdOnDeselect",
+          tabClass: "@mdTabClass"
+        }
+      };
+
+      function i(e, t, n, o) {
+        if (o) {
+          var r = o.getTabElementIndex(t),
+            i = s(t, "md-tab-body").remove(),
+            a = s(t, "md-tab-label").remove(),
+            d = o.insertTab({
+              scope: e,
+              parent: e.$parent,
+              index: r,
+              element: t,
+              template: i.html(),
+              label: a.html()
+            }, r);
+          e.select = e.select || be.noop, e.deselect = e.deselect || be.noop, e.$watch("active", function(e) {
+            e && o.select(d.getIndex(), !0)
+          }), e.$watch("disabled", function() {
+            o.refreshIndex()
+          }), e.$watch(function() {
+            return o.getTabElementIndex(t)
+          }, function(e) {
+            d.index = e, o.updateTabOrder()
+          }), e.$on("$destroy", function() {
+            o.removeTab(d)
+          })
+        }
+      }
+
+      function s(e, t) {
+        for (var n = e[0].children, o = 0, r = n.length; o < r; o++) {
+          var i = n[o];
+          if (i.tagName === t.toUpperCase()) return be.element(i)
+        }
+        return be.element()
+      }
+    }), be.module("material.components.tabs").directive("mdTabItem", function() {
+      return {
+        require: "^?mdTabs",
+        link: function(e, t, n, o) {
+          o && o.attachRipple(e, t)
+        }
+      }
+    }), be.module("material.components.tabs").directive("mdTabLabel", function() {
+      return {
+        terminal: !0
+      }
+      var i = {},
+        a = be.element(L);
+      return {
+        register: function(e, t, n) {
+          var o = i[e] = i[e] || [];
+          o.length || (n ? L.addEventListener(e, d, !0) : a.on(e, d)), -1 === o.indexOf(t) && o.push(t)
+        },
+        deregister: function(e, t, n) {
+          var o = i[e],
+            r = o ? o.indexOf(t) : -1; - 1 < r && (o.splice(r, 1), 0 === o.length && (n ? L.removeEventListener(e, d, !0) : a.off(e, d)))
+        }
+      };
+
+      function d(t) {
+        i[t.type] && i[t.type].forEach(function(e) {
+          e.call(this, t)
+        }, this)
+      }
+    }), dt.$inject = ["$element"], be.module("material.components.truncate", ["material.core"]).directive("mdTruncate", function() {
+      return {
+        restrict: "AE",
+        controller: dt
+      }
+    }),
+    function() {
+      function e(e) {
+        return '<div class="md-virtual-repeat-scroller" role="presentation"><div class="md-virtual-repeat-sizer" role="presentation"></div><div class="md-virtual-repeat-offsetter" role="presentation">' + e[0].innerHTML + "</div></div>"
+      }
+      t.$inject = ["$$rAF", "$mdUtil", "$mdConstant", "$parse", "$rootScope", "$window", "$scope", "$element", "$attrs"], r.$inject = ["$scope", "$element", "$attrs", "$browser", "$document", "$rootScope", "$$rAF", "$mdUtil"], n.$inject = ["$parse"], be.module("material.components.virtualRepeat", ["material.core", "material.components.showHide"]).directive("mdVirtualRepeatContainer", function() {
+        return {
+          controller: t,
+          template: e,
+          compile: function(e, t) {
+            e.addClass("md-virtual-repeat-container").addClass(t.hasOwnProperty("mdOrientHorizontal") ? "md-orient-horizontal" : "md-orient-vertical")
+          }
+        }
+      }).directive("mdVirtualRepeat", n).directive("mdForceHeight", i);
+
+      function t(e, n, t, o, r, i, a, d, s) {
+          e !== this.topIndex && this.scrollToIndex(e)
+        }))) : this.topIndex = 0, this.scroller = d[0].querySelector(".md-virtual-repeat-scroller"), this.sizer = this.scroller.querySelector(".md-virtual-repeat-sizer"), this.offsetter = this.scroller.querySelector(".md-virtual-repeat-offsetter");
+        var l = be.bind(this, this.updateSize);
+        e(be.bind(this, function() {
+          l();
+          var e = n.debounce(l, 10, null, !1),
+            t = be.element(i);
+          this.size || e(), t.on("resize", e), a.$on("$destroy", function() {
+            t.off("resize", e)
+          }), a.$emit("$md-resize-enable"), a.$on("$md-resize", l)
+        }))
+      }
+
+      function n(o) {
+        return {
+          controller: r,
+          priority: 1e3,
+          require: ["mdVirtualRepeat", "^^mdVirtualRepeatContainer"],
+          restrict: "A",
+          terminal: !0,
+          transclude: "element",
+          compile: function(e, t) {
+            var n = t.mdVirtualRepeat.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)\s*$/),
+              i = n[1],
+              a = o(n[2]),
+              d = t.mdExtraName && o(t.mdExtraName);
+            return function(e, t, n, o, r) {
+              o[0].link_(o[1], r, i, a, d)
+            }
+          }
+        }
+      }
+
+      function r(e, t, n, o, r, i, a, d) {
+        this.$scope = e, this.$element = t, this.$attrs = n, this.$browser = o, this.$document = r, this.$mdUtil = d, this.$rootScope = i, this.$$rAF = a, this.onDemand = d.parseAttributeBoolean(n.mdOnDemand), this.browserCheckUrlChange = o.$$checkUrlChange, this.newStartIndex = 0, this.newEndIndex = 0, this.newVisibleEnd = 0, this.startIndex = 0, this.endIndex = 0, this.itemSize = e.$eval(n.mdItemSize) || null, this.isFirstRender = !0, this.isVirtualRepeatUpdating_ = !1, this.itemsLength = 0, this.unwatchItemSize_ = be.noop, this.blocks = {}, this.pooledBlocks = [], e.$on("$destroy", be.bind(this, this.cleanupBlocks_))
+      }
+
+      function o(e) {
+        if (!be.isFunction(e.getItemAtIndex) || !be.isFunction(e.getLength)) throw Error("When md-on-demand is enabled, the Object passed to md-virtual-repeat must implement functions getItemAtIndex() and getLength().");
+        this.model = e
+      }
+
+      function i(e) {
+        return {
+          restrict: "A",
+          link: function(e, t, n) {
+            var o = e.$eval(n.mdForceHeight) || null;
+            o && t && (t[0].style.height = o)
+          }
+        }
+      }
+      t.prototype.register = function(e) {
+        this.repeater = e, be.element(this.scroller).on("scroll wheel touchmove touchend", be.bind(this, this.handleScroll_))
+      }, t.prototype.isHorizontal = function() {
+        return this.horizontal
+      }, t.prototype.getSize = function() {
+        return this.size
+      }, t.prototype.setSize_ = function(e) {
+        var t = this.getDimensionName_();
+        this.size = e, this.$element[0].style[t] = e + "px"
+      }, t.prototype.unsetSize_ = function() {
+        this.$element[0].style[this.getDimensionName_()] = this.oldElementSize, this.oldElementSize = null
+      }, t.prototype.updateSize = function() {
+        if (!this.originalSize) {
+          var e = this.isHorizontal() ? this.$element[0].clientWidth : this.$element[0].clientHeight;
+          e && (this.size = e), this.handleScroll_(), this.repeater && this.repeater.containerUpdated()
+        }
+      }, t.prototype.getScrollSize = function() {
+        return this.scrollSize
+      }, t.prototype.getDimensionName_ = function() {
+        return this.isHorizontal() ? "width" : "height"
+      }, t.prototype.sizeScroller_ = function(e) {
+        var t = this.getDimensionName_(),
+          n = this.isHorizontal() ? "height" : "width";
+        if (this.sizer.innerHTML = "", e < this.maxElementPixels) this.sizer.style[t] = e + "px";
+        else {
+          this.sizer.style[t] = "auto", this.sizer.style[n] = "auto";
+          var o = Math.floor(e / this.maxElementPixels),
+            r = document.createElement("div");
+          r.style[t] = this.maxElementPixels + "px", r.style[n] = "1px";
+          for (var i = 0; i < o; i++) this.sizer.appendChild(r.cloneNode(!1));
+          r.style[t] = e - o * this.maxElementPixels + "px", this.sizer.appendChild(r)
+        }
+      }, t.prototype.autoShrink_ = function(e) {
+        var t = Math.max(e, this.autoShrinkMin * this.repeater.getItemSize());
+        if (this.autoShrink && t !== this.size) {
+          null === this.oldElementSize && (this.oldElementSize = this.$element[0].style[this.getDimensionName_()]);
+          var n = this.originalSize || this.size;
+          if (!n || t < n) this.originalSize || (this.originalSize = this.size), this.setSize_(t);
+          else if (null !== this.originalSize) {
+            this.unsetSize_();
+            var o = this.originalSize;
+            this.originalSize = null, o || this.updateSize(), this.setSize_(o || this.size)
+          }
+          this.repeater.containerUpdated()
+        }
+      }, t.prototype.setScrollSize = function(e) {
+        var t = e + this.offsetSize;
+        this.scrollSize !== t && (this.sizeScroller_(t), this.autoShrink_(t), this.scrollSize = t)
+      }, t.prototype.getScrollOffset = function() {
+        return this.scrollOffset
+      }, t.prototype.scrollTo = function(e) {
+        this.scroller[this.isHorizontal() ? "scrollLeft" : "scrollTop"] = e, this.handleScroll_()
+      }, t.prototype.scrollToIndex = function(e) {
+        var t = this.repeater.getItemSize(),
+          n = this.repeater.itemsLength;
+        n < e && (e = n - 1), this.scrollTo(t * e)
+      }, t.prototype.resetScroll = function() {
+        this.scrollTo(0)
+      }, t.prototype.handleScroll_ = function() {
+        this.ltr || this.maxSize || (this.scroller.scrollLeft = this.scrollSize, this.maxSize = this.scroller.scrollLeft);
+        var e = this.isHorizontal() ? this.ltr ? this.scroller.scrollLeft : this.maxSize - this.scroller.scrollLeft : this.scroller.scrollTop;
+        if (!(this.scrollSize < this.size) && (e > this.scrollSize - this.size && (e = this.scrollSize - this.size), e !== this.scrollOffset)) {
+          var t = this.repeater.getItemSize();
+          if (t) {
+            var n = Math.max(0, Math.floor(e / t) - 3),
+              o = (this.isHorizontal() ? "translateX(" : "translateY(") + (!this.isHorizontal() || this.ltr ? n * t : -n * t) + "px)";
+            if (this.scrollOffset = e, this.offsetter.style.webkitTransform = o, this.offsetter.style.transform = o, this.bindTopIndex) {
+              var r = Math.floor(e / t);
+              r !== this.topIndex && r < this.repeater.getItemCount() && (this.topIndex = r, this.bindTopIndex.assign(this.$scope, r), this.$rootScope.$$phase || this.$scope.$digest())
+            }
+            this.repeater.containerUpdated()
+          }
+        }
+      }, r.prototype.link_ = function(e, t, n, o, r) {
+        this.container = e, this.transclude = t, this.repeatName = n, this.rawRepeatListExpression = o, this.extraName = r, this.sized = !1, this.repeatListExpression = be.bind(this, this.repeatListExpression_), this.container.register(this)
+      }, r.prototype.cleanupBlocks_ = function() {
+        be.forEach(this.pooledBlocks, function(e) {
+          e.element.remove()
+        })
+      }, r.prototype.readItemSize_ = function() {
+        if (!this.itemSize) {
+          this.items = this.repeatListExpression(this.$scope), this.parentNode = this.$element[0].parentNode;
+          var e = this.getBlock_(0);
+          e.element[0].parentNode || this.parentNode.appendChild(e.element[0]), this.itemSize = e.element[0][this.container.isHorizontal() ? "offsetWidth" : "offsetHeight"] || null, this.blocks[0] = e, this.poolBlock_(0), this.itemSize && this.containerUpdated()
+        }
+      }, r.prototype.repeatListExpression_ = function(e) {
+        var t = this.rawRepeatListExpression(e);
+        if (this.onDemand && t) {
+          var n = new o(t);
+          return n.$$includeIndexes(this.newStartIndex, this.newVisibleEnd), n
+        }
+        return t
+      }, r.prototype.containerUpdated = function() {
+        if (!this.itemSize) return this.unwatchItemSize_ && this.unwatchItemSize_ !== be.noop && this.unwatchItemSize_(), this.unwatchItemSize_ = this.$scope.$watchCollection(this.repeatListExpression, be.bind(this, function(e) {
+          e && e.length && this.readItemSize_()
+        })), void(this.$rootScope.$$phase || this.$scope.$digest());
+        this.sized || (this.items = this.repeatListExpression(this.$scope)), this.sized || (this.unwatchItemSize_(), this.sized = !0, this.$scope.$watchCollection(this.repeatListExpression, be.bind(this, function(e, t) {
+          this.isVirtualRepeatUpdating_ || this.virtualRepeatUpdate_(e, t)
+        }))), this.updateIndexes_(), (this.newStartIndex !== this.startIndex || this.newEndIndex !== this.endIndex || this.container.getScrollOffset() > this.container.getScrollSize()) && (this.items instanceof o && this.items.$$includeIndexes(this.newStartIndex, this.newEndIndex), this.virtualRepeatUpdate_(this.items, this.items))
+      }, r.prototype.getItemSize = function() {
+        return this.itemSize
+      }, r.prototype.getItemCount = function() {
+        return this.itemsLength
+      }, r.prototype.virtualRepeatUpdate_ = function(e, t) {
+        this.isVirtualRepeatUpdating_ = !0;
+        var n = e && e.length || 0,
+          o = !1;
+        if (this.items && n < this.items.length && 0 !== this.container.getScrollOffset()) {
+          this.items = e;
+          var r = this.container.getScrollOffset();
+          this.container.resetScroll(), this.container.scrollTo(r)
+        }
+        n !== this.itemsLength && (o = !0, this.itemsLength = n), (this.items = e) === t && !o || this.updateIndexes_(), this.parentNode = this.$element[0].parentNode, o && this.container.setScrollSize(n * this.itemSize), Object.keys(this.blocks).forEach(function(e) {
+          var t = parseInt(e, 10);
+          (t < this.newStartIndex || t >= this.newEndIndex) && this.poolBlock_(t)
+        }, this), this.$browser.$$checkUrlChange = be.noop;
+        var i, a, d = [],
+          s = [];
+        for (i = this.newStartIndex; i < this.newEndIndex && null == this.blocks[i]; i++) a = this.getBlock_(i), this.updateBlock_(a, i), d.push(a);
+        for (; null != this.blocks[i]; i++) this.updateBlock_(this.blocks[i], i);
+        for (var l = i - 1; i < this.newEndIndex; i++) a = this.getBlock_(i), this.updateBlock_(a, i), s.push(a);
+        if (d.length && this.parentNode.insertBefore(this.domFragmentFromBlocks_(d), this.$element[0].nextSibling), s.length && this.parentNode.insertBefore(this.domFragmentFromBlocks_(s), this.blocks[l] && this.blocks[l].element[0].nextSibling), this.$browser.$$checkUrlChange = this.browserCheckUrlChange, this.startIndex = this.newStartIndex, this.endIndex = this.newEndIndex, this.isFirstRender) {
+          this.isFirstRender = !1;
+          var c = this.$attrs.mdStartIndex ? this.$scope.$eval(this.$attrs.mdStartIndex) : this.container.topIndex;
+          this.$mdUtil.nextTick(function() {
+            this.container.scrollToIndex(c)
+          }.bind(this))
+        }
+        this.isVirtualRepeatUpdating_ = !1
+      }, r.prototype.getBlock_ = function(n) {
+        return this.pooledBlocks.length ? this.pooledBlocks.pop() : (this.transclude(be.bind(this, function(e, t) {
+          o = {
+            element: e,
+            new: !0,
+            scope: t
+          }, this.updateScope_(t, n), this.parentNode.appendChild(e[0])
+        })), o);
+        var o
+      }, r.prototype.updateBlock_ = function(e, t) {
+        !(this.blocks[t] = e).new && e.scope.$index === t && e.scope[this.repeatName] === this.items[t] || (e.new = !1, this.updateScope_(e.scope, t), this.$rootScope.$$phase || e.scope.$digest())
+      }, r.prototype.updateScope_ = function(e, t) {
+        e.$index = t, e[this.repeatName] = this.items && this.items[t], this.extraName && (e[this.extraName(this.$scope)] = this.items[t])
+      }, r.prototype.poolBlock_ = function(e) {
+        this.pooledBlocks.push(this.blocks[e]), this.parentNode.removeChild(this.blocks[e].element[0]), delete this.blocks[e]
+      }, r.prototype.domFragmentFromBlocks_ = function(e) {
+        var t = this.$document[0].createDocumentFragment();
+        return e.forEach(function(e) {
+          t.appendChild(e.element[0])
+        }), t
+      }, r.prototype.updateIndexes_ = function() {
+        var e = this.items ? this.items.length : 0,
+          t = Math.ceil(this.container.getSize() / this.itemSize);
+        this.newStartIndex = Math.max(0, Math.min(e - t, Math.floor(this.container.getScrollOffset() / this.itemSize))), this.newVisibleEnd = this.newStartIndex + t + 3, this.newEndIndex = Math.min(e, this.newVisibleEnd), this.newStartIndex = Math.max(0, this.newStartIndex - 3)
+      }, o.prototype.$$includeIndexes = function(e, t) {
+        for (var n = e; n < t; n++) this.hasOwnProperty(n) || (this[n] = this.model.getItemAtIndex(n));
+        this.length = this.model.getLength()
+      }, i.$inject = ["$mdUtil"]
+}(window, window.angular), window.ngMaterial = {
+  version: {
+    full: "1.2.2"
+  }
+};
\ No newline at end of file
diff --git a/public/tvox/js/angular-messages.min.js b/public/tvox/js/angular-messages.min.js
new file mode 100644
index 0000000..d0e60c9
--- /dev/null
+++ b/public/tvox/js/angular-messages.min.js
@@ -0,0 +1,181 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(z, l) {
+  'use strict';
+
+  function q(n) {
+    return ["$animate", function(u) {
+      return {
+        restrict: "AE",
+        transclude: "element",
+        priority: 1,
+        terminal: !0,
+        require: "^^ngMessages",
+        link: function(m, f, a, e, r) {
+          var b, h, s;
+          if (!n) {
+            b = f[0];
+            s = a.ngMessage || a.when;
+            a = a.ngMessageExp || a.whenExp;
+            var k = function(c) {
+              h = c ? v(c) ? c : c.split(/[\s,]+/) : null;
+              e.reRender()
+            };
+            a ? (k(m.$eval(a)), m.$watchCollection(a, k)) : k(s)
+          }
+          var g, t;
+          e.register(b, t = {
+            test: function(c) {
+              var b = h;
+              c = b ? v(b) ? 0 <= b.indexOf(c) : b.hasOwnProperty(c) : void 0;
+              return c
+            },
+            attach: function() {
+              g ||
+                r(function(c, a) {
+                  u.enter(c, null, f);
+                  g = c;
+                  var d = g.$$attachId = e.getAttachId();
+                  g.on("$destroy", function() {
+                    g && g.$$attachId === d && (e.deregister(b, n), t.detach());
+                    a.$destroy()
+                  })
+                })
+            },
+            detach: function() {
+              if (g) {
+                var c = g;
+                g = null;
+                u.leave(c)
+              }
+            }
+          }, n);
+          m.$on("$destroy", function() {
+            e.deregister(b, n)
+          })
+        }
+      }
+    }]
+  }
+  var x, v, p, y;
+  l.module("ngMessages", [], function() {
+    x = l.forEach;
+    v = l.isArray;
+    p = l.isString;
+    y = l.element
+  }).info({
+    angularVersion: "1.8.2"
+  }).directive("ngMessages", ["$animate", function(n) {
+    function u(f, a) {
+      return p(a) && 0 === a.length || m(f.$eval(a))
+    }
+
+    function m(f) {
+      return p(f) ? f.length : !!f
+    }
+    return {
+      require: "ngMessages",
+      restrict: "AE",
+      controller: ["$element", "$scope", "$attrs", function(f, a, e) {
+        function r(c, b) {
+          for (var d = b, a = []; d && d !== c;) {
+            var e = d.$$ngMessageNode;
+            if (e && e.length) return k[e];
+            d.childNodes.length && -1 === a.indexOf(d) ? (a.push(d), d = d.childNodes[d.childNodes.length - 1]) : d.previousSibling ? d = d.previousSibling : (d = d.parentNode, a.push(d))
+          }
+        }
+        var b = this,
+          h = 0,
+          s = 0;
+        this.getAttachId = function() {
+          return s++
+        };
+        var k = this.messages = {},
+          g, t;
+        this.render = function(c) {
+          c = c || {};
+          g = !1;
+          t = c;
+          for (var w = u(a, e.ngMessagesMultiple) || u(a, e.multiple), d = [], r = {}, h = 0, k = b.head, s = !1, l = 0; null != k;) {
+            l++;
+            var p = k.message,
+              q = !1;
+            s || x(c, function(b, c) {
+              m(b) && !q && (h++, p.test(c) && !r[c] && (q = r[c] = !0, p.attach()))
+            });
+            q ? s = !w : d.push(p);
+            k = k.next
+          }
+          x(d, function(c) {
+            c.detach()
+          });
+          c = d.length !== l;
+          (w = b.default && !c && 0 < h) ? b.default.attach(): b.default && b.default.detach();
+          c || w ? n.setClass(f, "ng-active", "ng-inactive") : n.setClass(f, "ng-inactive", "ng-active")
+        };
+        a.$watchCollection(e.ngMessages || e["for"], b.render);
+        this.reRender =
+          function() {
+            g || (g = !0, a.$evalAsync(function() {
+              g && t && b.render(t)
+            }))
+          };
+        this.register = function(c, a, d) {
+          if (d) b.default = a;
+          else {
+            d = h.toString();
+            k[d] = {
+              message: a
+            };
+            var e = f[0];
+            a = k[d];
+            b.head ? (e = r(e, c)) ? (a.next = e.next, e.next = a) : (a.next = b.head, b.head = a) : b.head = a;
+            c.$$ngMessageNode = d;
+            h++
+          }
+          b.reRender()
+        };
+        this.deregister = function(a, e) {
+          if (e) delete b.default;
+          else {
+            var d = a.$$ngMessageNode;
+            delete a.$$ngMessageNode;
+            var g = k[d];
+            if (g) {
+              var h = r(f[0], a);
+              h ? h.next = g.next : b.head = g.next
+            }
+            delete k[d]
+          }
+          b.reRender()
+        }
+      }]
+    }
+  }]).directive("ngMessagesInclude",
+    ["$templateRequest", "$document", "$compile", function(n, l, m) {
+      function f(a, e) {
+        var f = m.$$createComment ? m.$$createComment("ngMessagesInclude", e) : l[0].createComment(" ngMessagesInclude: " + e + " "),
+          f = y(f);
+        a.after(f);
+        a.remove()
+      }
+      return {
+        restrict: "AE",
+        require: "^^ngMessages",
+        link: function(a, e, l) {
+          var b = l.ngMessagesInclude || l.src;
+          n(b).then(function(h) {
+            a.$$destroyed || (p(h) && !h.trim() ? f(e, b) : m(h)(a, function(a) {
+              e.after(a);
+              f(e, b)
+            }))
+          })
+        }
+      }
+    }]).directive("ngMessage", q()).directive("ngMessageExp", q()).directive("ngMessageDefault",
+    q(!0))
+})(window, window.angular);
+//# sourceMappingURL=angular-messages.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/angular-resource.js b/public/tvox/js/angular-resource.js
new file mode 100644
index 0000000..c3ee796
--- /dev/null
+++ b/public/tvox/js/angular-resource.js
@@ -0,0 +1,883 @@
+/**
+ * @license AngularJS v1.5.8
+ * (c) 2010-2016 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular) {
+  'use strict';
+
+  var $resourceMinErr = angular.$$minErr('$resource');
+
+  // Helper functions and regex to lookup a dotted path on an object
+  // stopping at undefined/null.  The path must be composed of ASCII
+  // identifiers (just like $parse)
+  var MEMBER_NAME_REGEX = /^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;
+
+  function isValidDottedPath(path) {
+    return (path != null && path !== '' && path !== 'hasOwnProperty' &&
+      MEMBER_NAME_REGEX.test('.' + path));
+  }
+
+  function lookupDottedPath(obj, path) {
+    if (!isValidDottedPath(path)) {
+      throw $resourceMinErr('badmember', 'Dotted member path "@{0}" is invalid.', path);
+    }
+    var keys = path.split('.');
+    for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {
+      var key = keys[i];
+      obj = (obj !== null) ? obj[key] : undefined;
+    }
+    return obj;
+  }
+
+  /**
+   * Create a shallow copy of an object and clear other fields from the destination
+   */
+  function shallowClearAndCopy(src, dst) {
+    dst = dst || {};
+
+    angular.forEach(dst, function(value, key) {
+      delete dst[key];
+    });
+
+    for (var key in src) {
+      if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
+        dst[key] = src[key];
+      }
+    }
+
+    return dst;
+  }
+
+  /**
+   * @ngdoc module
+   * @name ngResource
+   * @description
+   *
+   * # ngResource
+   *
+   * The `ngResource` module provides interaction support with RESTful services
+   * via the $resource service.
+   *
+   *
+   * <div doc-module-components="ngResource"></div>
+   *
+   * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.
+   */
+
+  /**
+   * @ngdoc provider
+   * @name $resourceProvider
+   *
+   * @description
+   *
+   * Use `$resourceProvider` to change the default behavior of the {@link ngResource.$resource}
+   * service.
+   *
+   * ## Dependencies
+   * Requires the {@link ngResource } module to be installed.
+   *
+   */
+
+  /**
+   * @ngdoc service
+   * @name $resource
+   * @requires $http
+   * @requires ng.$log
+   * @requires $q
+   * @requires ng.$timeout
+   *
+   * @description
+   * A factory which creates a resource object that lets you interact with
+   * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.
+   *
+   * The returned resource object has action methods which provide high-level behaviors without
+   * the need to interact with the low level {@link ng.$http $http} service.
+   *
+   * Requires the {@link ngResource `ngResource`} module to be installed.
+   *
+   * By default, trailing slashes will be stripped from the calculated URLs,
+   * which can pose problems with server backends that do not expect that
+   * behavior.  This can be disabled by configuring the `$resourceProvider` like
+   * this:
+   *
+   * ```js
+       app.config(['$resourceProvider', function($resourceProvider) {
+         // Don't strip trailing slashes from calculated URLs
+         $resourceProvider.defaults.stripTrailingSlashes = false;
+       }]);
+   * ```
+   *
+   * @param {string} url A parameterized URL template with parameters prefixed by `:` as in
+   *   `/user/:username`. If you are using a URL with a port number (e.g.
+   *   `http://example.com:8080/api`), it will be respected.
+   *
+   *   If you are using a url with a suffix, just add the suffix, like this:
+   *   `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`
+   *   or even `$resource('http://example.com/resource/:resource_id.:format')`
+   *   If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
+   *   collapsed down to a single `.`.  If you need this sequence to appear and not collapse then you
+   *   can escape it with `/\.`.
+   *
+   * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
+   *   `actions` methods. If a parameter value is a function, it will be called every time
+   *   a param value needs to be obtained for a request (unless the param was overridden). The function
+   *   will be passed the current data value as an argument.
+   *
+   *   Each key value in the parameter object is first bound to url template if present and then any
+   *   excess keys are appended to the url search query after the `?`.
+   *
+   *   Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
+   *   URL `/path/greet?salutation=Hello`.
+   *
+   *   If the parameter value is prefixed with `@`, then the value for that parameter will be
+   *   extracted from the corresponding property on the `data` object (provided when calling a
+   *   "non-GET" action method).
+   *   For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of
+   *   `someParam` will be `data.someProp`.
+   *   Note that the parameter will be ignored, when calling a "GET" action method (i.e. an action
+   *   method that does not accept a request body)
+   *
+   * @param {Object.<Object>=} actions Hash with declaration of custom actions that should extend
+   *   the default set of resource actions. The declaration should be created in the format of {@link
+   *   ng.$http#usage $http.config}:
+   *
+   *       {action1: {method:?, params:?, isArray:?, headers:?, ...},
+   *        action2: {method:?, params:?, isArray:?, headers:?, ...},
+   *        ...}
+   *
+   *   Where:
+   *
+   *   - **`action`** – {string} – The name of action. This name becomes the name of the method on
+   *     your resource object.
+   *   - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,
+   *     `DELETE`, `JSONP`, etc).
+   *   - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
+   *     the parameter value is a function, it will be called every time when a param value needs to
+   *     be obtained for a request (unless the param was overridden). The function will be passed the
+   *     current data value as an argument.
+   *   - **`url`** – {string} – action specific `url` override. The url templating is supported just
+   *     like for the resource-level urls.
+   *   - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,
+   *     see `returns` section.
+   *   - **`transformRequest`** –
+   *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+   *     transform function or an array of such functions. The transform function takes the http
+   *     request body and headers and returns its transformed (typically serialized) version.
+   *     By default, transformRequest will contain one function that checks if the request data is
+   *     an object and serializes to using `angular.toJson`. To prevent this behavior, set
+   *     `transformRequest` to an empty array: `transformRequest: []`
+   *   - **`transformResponse`** –
+   *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+   *     transform function or an array of such functions. The transform function takes the http
+   *     response body and headers and returns its transformed (typically deserialized) version.
+   *     By default, transformResponse will contain one function that checks if the response looks
+   *     like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior,
+   *     set `transformResponse` to an empty array: `transformResponse: []`
+   *   - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
+   *     GET request, otherwise if a cache instance built with
+   *     {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
+   *     caching.
+   *   - **`timeout`** – `{number}` – timeout in milliseconds.<br />
+   *     **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are
+   *     **not** supported in $resource, because the same value would be used for multiple requests.
+   *     If you are looking for a way to cancel requests, you should use the `cancellable` option.
+   *   - **`cancellable`** – `{boolean}` – if set to true, the request made by a "non-instance" call
+   *     will be cancelled (if not already completed) by calling `$cancelRequest()` on the call's
+   *     return value. Calling `$cancelRequest()` for a non-cancellable or an already
+   *     completed/cancelled request will have no effect.<br />
+   *   - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the
+   *     XHR object. See
+   *     [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5)
+   *     for more information.
+   *   - **`responseType`** - `{string}` - see
+   *     [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
+   *   - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -
+   *     `response` and `responseError`. Both `response` and `responseError` interceptors get called
+   *     with `http response` object. See {@link ng.$http $http interceptors}.
+   *
+   * @param {Object} options Hash with custom settings that should extend the
+   *   default `$resourceProvider` behavior.  The supported options are:
+   *
+   *   - **`stripTrailingSlashes`** – {boolean} – If true then the trailing
+   *   slashes from any calculated URL will be stripped. (Defaults to true.)
+   *   - **`cancellable`** – {boolean} – If true, the request made by a "non-instance" call will be
+   *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return value.
+   *   This can be overwritten per action. (Defaults to false.)
+   *
+   * @returns {Object} A resource "class" object with methods for the default set of resource actions
+   *   optionally extended with custom `actions`. The default set contains these actions:
+   *   ```js
+   *   { 'get':    {method:'GET'},
+   *     'save':   {method:'POST'},
+   *     'query':  {method:'GET', isArray:true},
+   *     'remove': {method:'DELETE'},
+   *     'delete': {method:'DELETE'} };
+   *   ```
+   *
+   *   Calling these methods invoke an {@link ng.$http} with the specified http method,
+   *   destination and parameters. When the data is returned from the server then the object is an
+   *   instance of the resource class. The actions `save`, `remove` and `delete` are available on it
+   *   as  methods with the `$` prefix. This allows you to easily perform CRUD operations (create,
+   *   read, update, delete) on server-side data like this:
+   *   ```js
+   *   var User = $resource('/user/:userId', {userId:'@id'});
+   *   var user = User.get({userId:123}, function() {
+   *     user.abc = true;
+   *     user.$save();
+   *   });
+   *   ```
+   *
+   *   It is important to realize that invoking a $resource object method immediately returns an
+   *   empty reference (object or array depending on `isArray`). Once the data is returned from the
+   *   server the existing reference is populated with the actual data. This is a useful trick since
+   *   usually the resource is assigned to a model which is then rendered by the view. Having an empty
+   *   object results in no rendering, once the data arrives from the server then the object is
+   *   populated with the data and the view automatically re-renders itself showing the new data. This
+   *   means that in most cases one never has to write a callback function for the action methods.
+   *
+   *   The action methods on the class object or instance object can be invoked with the following
+   *   parameters:
+   *
+   *   - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])`
+   *   - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
+   *   - non-GET instance actions:  `instance.$action([parameters], [success], [error])`
+   *
+   *
+   *   Success callback is called with (value, responseHeaders) arguments, where the value is
+   *   the populated resource instance or collection object. The error callback is called
+   *   with (httpResponse) argument.
+   *
+   *   Class actions return empty instance (with additional properties below).
+   *   Instance actions return promise of the action.
+   *
+   *   The Resource instances and collections have these additional properties:
+   *
+   *   - `$promise`: the {@link ng.$q promise} of the original server interaction that created this
+   *     instance or collection.
+   *
+   *     On success, the promise is resolved with the same resource instance or collection object,
+   *     updated with data from server. This makes it easy to use in
+   *     {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view
+   *     rendering until the resource(s) are loaded.
+   *
+   *     On failure, the promise is rejected with the {@link ng.$http http response} object, without
+   *     the `resource` property.
+   *
+   *     If an interceptor object was provided, the promise will instead be resolved with the value
+   *     returned by the interceptor.
+   *
+   *   - `$resolved`: `true` after first server interaction is completed (either with success or
+   *      rejection), `false` before that. Knowing if the Resource has been resolved is useful in
+   *      data-binding.
+   *
+   *   The Resource instances and collections have these additional methods:
+   *
+   *   - `$cancelRequest`: If there is a cancellable, pending request related to the instance or
+   *      collection, calling this method will abort the request.
+   *
+   *   The Resource instances have these additional methods:
+   *
+   *   - `toJSON`: It returns a simple object without any of the extra properties added as part of
+   *     the Resource API. This object can be serialized through {@link angular.toJson} safely
+   *     without attaching Angular-specific fields. Notice that `JSON.stringify` (and
+   *     `angular.toJson`) automatically use this method when serializing a Resource instance
+   *     (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior)).
+   *
+   * @example
+   *
+   * # Credit card resource
+   *
+   * ```js
+       // Define CreditCard class
+       var CreditCard = $resource('/user/:userId/card/:cardId',
+        {userId:123, cardId:'@id'}, {
+         charge: {method:'POST', params:{charge:true}}
+        });
+
+       // We can retrieve a collection from the server
+       var cards = CreditCard.query(function() {
+         // GET: /user/123/card
+         // server returns: [ {id:456, number:'1234', name:'Smith'} ];
+
+         var card = cards[0];
+         // each item is an instance of CreditCard
+         expect(card instanceof CreditCard).toEqual(true);
+         card.name = "J. Smith";
+         // non GET methods are mapped onto the instances
+         card.$save();
+         // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
+         // server returns: {id:456, number:'1234', name: 'J. Smith'};
+
+         // our custom method is mapped as well.
+         card.$charge({amount:9.99});
+         // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
+       });
+
+       // we can create an instance as well
+       var newCard = new CreditCard({number:'0123'});
+       newCard.name = "Mike Smith";
+       newCard.$save();
+       // POST: /user/123/card {number:'0123', name:'Mike Smith'}
+       // server returns: {id:789, number:'0123', name: 'Mike Smith'};
+       expect(newCard.id).toEqual(789);
+   * ```
+   *
+   * The object returned from this function execution is a resource "class" which has "static" method
+   * for each action in the definition.
+   *
+   * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and
+   * `headers`.
+   *
+   * @example
+   *
+   * # User resource
+   *
+   * When the data is returned from the server then the object is an instance of the resource type and
+   * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
+   * operations (create, read, update, delete) on server-side data.
+
+     ```js
+       var User = $resource('/user/:userId', {userId:'@id'});
+       User.get({userId:123}, function(user) {
+         user.abc = true;
+         user.$save();
+       });
+     ```
+   *
+   * It's worth noting that the success callback for `get`, `query` and other methods gets passed
+   * in the response that came from the server as well as $http header getter function, so one
+   * could rewrite the above example and get access to http headers as:
+   *
+     ```js
+       var User = $resource('/user/:userId', {userId:'@id'});
+       User.get({userId:123}, function(user, getResponseHeaders){
+         user.abc = true;
+         user.$save(function(user, putResponseHeaders) {
+           //user => saved user object
+           //putResponseHeaders => $http header getter
+         });
+       });
+     ```
+   *
+   * You can also access the raw `$http` promise via the `$promise` property on the object returned
+   *
+     ```
+       var User = $resource('/user/:userId', {userId:'@id'});
+       User.get({userId:123})
+           .$promise.then(function(user) {
+             $scope.user = user;
+           });
+     ```
+   *
+   * @example
+   *
+   * # Creating a custom 'PUT' request
+   *
+   * In this example we create a custom method on our resource to make a PUT request
+   * ```js
+   *    var app = angular.module('app', ['ngResource', 'ngRoute']);
+   *
+   *    // Some APIs expect a PUT request in the format URL/object/ID
+   *    // Here we are creating an 'update' method
+   *    app.factory('Notes', ['$resource', function($resource) {
+   *    return $resource('/notes/:id', null,
+   *        {
+   *            'update': { method:'PUT' }
+   *        });
+   *    }]);
+   *
+   *    // In our controller we get the ID from the URL using ngRoute and $routeParams
+   *    // We pass in $routeParams and our Notes factory along with $scope
+   *    app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
+                                        function($scope, $routeParams, Notes) {
+   *    // First get a note object from the factory
+   *    var note = Notes.get({ id:$routeParams.id });
+   *    $id = note.id;
+   *
+   *    // Now call update passing in the ID first then the object you are updating
+   *    Notes.update({ id:$id }, note);
+   *
+   *    // This will PUT /notes/ID with the note object in the request payload
+   *    }]);
+   * ```
+   *
+   * @example
+   *
+   * # Cancelling requests
+   *
+   * If an action's configuration specifies that it is cancellable, you can cancel the request related
+   * to an instance or collection (as long as it is a result of a "non-instance" call):
+   *
+     ```js
+       // ...defining the `Hotel` resource...
+       var Hotel = $resource('/api/hotel/:id', {id: '@id'}, {
+         // Let's make the `query()` method cancellable
+         query: {method: 'get', isArray: true, cancellable: true}
+       });
+
+       // ...somewhere in the PlanVacationController...
+       ...
+       this.onDestinationChanged = function onDestinationChanged(destination) {
+         // We don't care about any pending request for hotels
+         // in a different destination any more
+         this.availableHotels.$cancelRequest();
+
+         // Let's query for hotels in '<destination>'
+         // (calls: /api/hotel?location=<destination>)
+         this.availableHotels = Hotel.query({location: destination});
+       };
+     ```
+   *
+   */
+  angular.module('ngResource', ['ng']).
+  provider('$resource', function() {
+    var PROTOCOL_AND_DOMAIN_REGEX = /^https?:\/\/[^\/]*/;
+    var provider = this;
+
+    /**
+     * @ngdoc property
+     * @name $resourceProvider#defaults
+     * @description
+     * Object containing default options used when creating `$resource` instances.
+     *
+     * The default values satisfy a wide range of usecases, but you may choose to overwrite any of
+     * them to further customize your instances. The available properties are:
+     *
+     * - **stripTrailingSlashes** – `{boolean}` – If true, then the trailing slashes from any
+     *   calculated URL will be stripped.<br />
+     *   (Defaults to true.)
+     * - **cancellable** – `{boolean}` – If true, the request made by a "non-instance" call will be
+     *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return
+     *   value. For more details, see {@link ngResource.$resource}. This can be overwritten per
+     *   resource class or action.<br />
+     *   (Defaults to false.)
+     * - **actions** - `{Object.<Object>}` - A hash with default actions declarations. Actions are
+     *   high-level methods corresponding to RESTful actions/methods on resources. An action may
+     *   specify what HTTP method to use, what URL to hit, if the return value will be a single
+     *   object or a collection (array) of objects etc. For more details, see
+     *   {@link ngResource.$resource}. The actions can also be enhanced or overwritten per resource
+     *   class.<br />
+     *   The default actions are:
+     *   ```js
+     *   {
+     *     get: {method: 'GET'},
+     *     save: {method: 'POST'},
+     *     query: {method: 'GET', isArray: true},
+     *     remove: {method: 'DELETE'},
+     *     delete: {method: 'DELETE'}
+     *   }
+     *   ```
+     *
+     * #### Example
+     *
+     * For example, you can specify a new `update` action that uses the `PUT` HTTP verb:
+     *
+     * ```js
+     *   angular.
+     *     module('myApp').
+     *     config(['resourceProvider', function ($resourceProvider) {
+     *       $resourceProvider.defaults.actions.update = {
+     *         method: 'PUT'
+     *       };
+     *     });
+     * ```
+     *
+     * Or you can even overwrite the whole `actions` list and specify your own:
+     *
+     * ```js
+     *   angular.
+     *     module('myApp').
+     *     config(['resourceProvider', function ($resourceProvider) {
+     *       $resourceProvider.defaults.actions = {
+     *         create: {method: 'POST'}
+     *         get:    {method: 'GET'},
+     *         getAll: {method: 'GET', isArray:true},
+     *         update: {method: 'PUT'},
+     *         delete: {method: 'DELETE'}
+     *       };
+     *     });
+     * ```
+     *
+     */
+    this.defaults = {
+      // Strip slashes by default
+      stripTrailingSlashes: true,
+
+      // Make non-instance requests cancellable (via `$cancelRequest()`)
+      cancellable: false,
+
+      // Default actions configuration
+      actions: {
+        'get': {
+          method: 'GET'
+        },
+        'save': {
+          method: 'POST'
+        },
+        'query': {
+          method: 'GET',
+          isArray: true
+        },
+        'remove': {
+          method: 'DELETE'
+        },
+        'delete': {
+          method: 'DELETE'
+        }
+      }
+    };
+
+    this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) {
+
+      var noop = angular.noop,
+        forEach = angular.forEach,
+        extend = angular.extend,
+        copy = angular.copy,
+        isFunction = angular.isFunction;
+
+      /**
+       * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
+       * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set
+       * (pchar) allowed in path segments:
+       *    segment       = *pchar
+       *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+       *    pct-encoded   = "%" HEXDIG HEXDIG
+       *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+       *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+       *                     / "*" / "+" / "," / ";" / "="
+       */
+      function encodeUriSegment(val) {
+        return encodeUriQuery(val, true).
+        replace(/%26/gi, '&').
+        replace(/%3D/gi, '=').
+        replace(/%2B/gi, '+');
+      }
+
+
+      /**
+       * This method is intended for encoding *key* or *value* parts of query component. We need a
+       * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't
+       * have to be encoded per http://tools.ietf.org/html/rfc3986:
+       *    query       = *( pchar / "/" / "?" )
+       *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+       *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+       *    pct-encoded   = "%" HEXDIG HEXDIG
+       *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+       *                     / "*" / "+" / "," / ";" / "="
+       */
+      function encodeUriQuery(val, pctEncodeSpaces) {
+        return encodeURIComponent(val).
+        replace(/%40/gi, '@').
+        replace(/%3A/gi, ':').
+        replace(/%24/g, '$').
+        replace(/%2C/gi, ',').
+        replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+      }
+
+      function Route(template, defaults) {
+        this.template = template;
+        this.defaults = extend({}, provider.defaults, defaults);
+        this.urlParams = {};
+      }
+
+      Route.prototype = {
+        setUrlParams: function(config, params, actionUrl) {
+          var self = this,
+            url = actionUrl || self.template,
+            val,
+            encodedVal,
+            protocolAndDomain = '';
+
+          var urlParams = self.urlParams = {};
+          forEach(url.split(/\W/), function(param) {
+            if (param === 'hasOwnProperty') {
+              throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name.");
+            }
+            if (!(new RegExp("^\\d+$").test(param)) && param &&
+              (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
+              urlParams[param] = {
+                isQueryParamValue: (new RegExp("\\?.*=:" + param + "(?:\\W|$)")).test(url)
+              };
+            }
+          });
+          url = url.replace(/\\:/g, ':');
+          url = url.replace(PROTOCOL_AND_DOMAIN_REGEX, function(match) {
+            protocolAndDomain = match;
+            return '';
+          });
+
+          params = params || {};
+          forEach(self.urlParams, function(paramInfo, urlParam) {
+            val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
+            if (angular.isDefined(val) && val !== null) {
+              if (paramInfo.isQueryParamValue) {
+                encodedVal = encodeUriQuery(val, true);
+              } else {
+                encodedVal = encodeUriSegment(val);
+              }
+              url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) {
+                return encodedVal + p1;
+              });
+            } else {
+              url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match,
+                leadingSlashes, tail) {
+                if (tail.charAt(0) == '/') {
+                  return tail;
+                } else {
+                  return leadingSlashes + tail;
+                }
+              });
+            }
+          });
+
+          // strip trailing slashes and set the url (unless this behavior is specifically disabled)
+          if (self.defaults.stripTrailingSlashes) {
+            url = url.replace(/\/+$/, '') || '/';
+          }
+
+          // then replace collapse `/.` if found in the last URL path segment before the query
+          // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`
+          url = url.replace(/\/\.(?=\w+($|\?))/, '.');
+          // replace escaped `/\.` with `/.`
+          config.url = protocolAndDomain + url.replace(/\/\\\./, '/.');
+
+
+          // set params - delegate param encoding to $http
+          forEach(params, function(value, key) {
+            if (!self.urlParams[key]) {
+              config.params = config.params || {};
+              config.params[key] = value;
+            }
+          });
+        }
+      };
+
+
+      function resourceFactory(url, paramDefaults, actions, options) {
+        var route = new Route(url, options);
+
+        actions = extend({}, provider.defaults.actions, actions);
+
+        function extractParams(data, actionParams) {
+          var ids = {};
+          actionParams = extend({}, paramDefaults, actionParams);
+          forEach(actionParams, function(value, key) {
+            if (isFunction(value)) {
+              value = value(data);
+            }
+            ids[key] = value && value.charAt && value.charAt(0) == '@' ?
+              lookupDottedPath(data, value.substr(1)) : value;
+          });
+          return ids;
+        }
+
+        function defaultResponseInterceptor(response) {
+          return response.resource;
+        }
+
+        function Resource(value) {
+          shallowClearAndCopy(value || {}, this);
+        }
+
+        Resource.prototype.toJSON = function() {
+          var data = extend({}, this);
+          delete data.$promise;
+          delete data.$resolved;
+          return data;
+        };
+
+        forEach(actions, function(action, name) {
+          var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);
+          var numericTimeout = action.timeout;
+          var cancellable = angular.isDefined(action.cancellable) ? action.cancellable :
+            (options && angular.isDefined(options.cancellable)) ? options.cancellable :
+            provider.defaults.cancellable;
+
+          if (numericTimeout && !angular.isNumber(numericTimeout)) {
+            $log.debug('ngResource:\n' +
+              '  Only numeric values are allowed as `timeout`.\n' +
+              '  Promises are not supported in $resource, because the same value would ' +
+              'be used for multiple requests. If you are looking for a way to cancel ' +
+              'requests, you should use the `cancellable` option.');
+            delete action.timeout;
+            numericTimeout = null;
+          }
+
+          Resource[name] = function(a1, a2, a3, a4) {
+            var params = {},
+              data, success, error;
+
+            /* jshint -W086 */
+            /* (purposefully fall through case statements) */
+            switch (arguments.length) {
+              case 4:
+                error = a4;
+                success = a3;
+                //fallthrough
+              case 3:
+              case 2:
+                if (isFunction(a2)) {
+                  if (isFunction(a1)) {
+                    success = a1;
+                    error = a2;
+                    break;
+                  }
+
+                  success = a2;
+                  error = a3;
+                  //fallthrough
+                } else {
+                  params = a1;
+                  data = a2;
+                  success = a3;
+                  break;
+                }
+                case 1:
+                  if (isFunction(a1)) success = a1;
+                  else if (hasBody) data = a1;
+                  else params = a1;
+                  break;
+                case 0:
+                  break;
+                default:
+                  throw $resourceMinErr('badargs',
+                    "Expected up to 4 arguments [params, data, success, error], got {0} arguments",
+                    arguments.length);
+            }
+            /* jshint +W086 */
+            /* (purposefully fall through case statements) */
+
+            var isInstanceCall = this instanceof Resource;
+            var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
+            var httpConfig = {};
+            var responseInterceptor = action.interceptor && action.interceptor.response ||
+              defaultResponseInterceptor;
+            var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||
+              undefined;
+            var timeoutDeferred;
+            var numericTimeoutPromise;
+
+            forEach(action, function(value, key) {
+              switch (key) {
+                default:
+                  httpConfig[key] = copy(value);
+                  break;
+                case 'params':
+                case 'isArray':
+                case 'interceptor':
+                case 'cancellable':
+                  break;
+              }
+            });
+
+            if (!isInstanceCall && cancellable) {
+              timeoutDeferred = $q.defer();
+              httpConfig.timeout = timeoutDeferred.promise;
+
+              if (numericTimeout) {
+                numericTimeoutPromise = $timeout(timeoutDeferred.resolve, numericTimeout);
+              }
+            }
+
+            if (hasBody) httpConfig.data = data;
+            route.setUrlParams(httpConfig,
+              extend({}, extractParams(data, action.params || {}), params),
+              action.url);
+
+            var promise = $http(httpConfig).then(function(response) {
+              var data = response.data;
+
+              if (data) {
+                // Need to convert action.isArray to boolean in case it is undefined
+                // jshint -W018
+                if (angular.isArray(data) !== (!!action.isArray)) {
+                  throw $resourceMinErr('badcfg',
+                    'Error in resource configuration for action `{0}`. Expected response to ' +
+                    'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',
+                    angular.isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);
+                }
+                // jshint +W018
+                if (action.isArray) {
+                  value.length = 0;
+                  forEach(data, function(item) {
+                    if (typeof item === "object") {
+                      value.push(new Resource(item));
+                    } else {
+                      // Valid JSON values may be string literals, and these should not be converted
+                      // into objects. These items will not have access to the Resource prototype
+                      // methods, but unfortunately there
+                      value.push(item);
+                    }
+                  });
+                } else {
+                  var promise = value.$promise; // Save the promise
+                  shallowClearAndCopy(data, value);
+                  value.$promise = promise; // Restore the promise
+                }
+              }
+              response.resource = value;
+
+              return response;
+            }, function(response) {
+              (error || noop)(response);
+              return $q.reject(response);
+            });
+
+            promise['finally'](function() {
+              value.$resolved = true;
+              if (!isInstanceCall && cancellable) {
+                value.$cancelRequest = angular.noop;
+                $timeout.cancel(numericTimeoutPromise);
+                timeoutDeferred = numericTimeoutPromise = httpConfig.timeout = null;
+              }
+            });
+
+            promise = promise.then(
+              function(response) {
+                var value = responseInterceptor(response);
+                (success || noop)(value, response.headers);
+                return value;
+              },
+              responseErrorInterceptor);
+
+            if (!isInstanceCall) {
+              // we are creating instance / collection
+              // - set the initial promise
+              // - return the instance / collection
+              value.$promise = promise;
+              value.$resolved = false;
+              if (cancellable) value.$cancelRequest = timeoutDeferred.resolve;
+
+              return value;
+            }
+
+            // instance call
+            return promise;
+          };
+
+
+          Resource.prototype['$' + name] = function(params, success, error) {
+            if (isFunction(params)) {
+              error = success;
+              success = params;
+              params = {};
+            }
+            var result = Resource[name].call(this, params, this, success, error);
+            return result.$promise || result;
+          };
+        });
+
+        Resource.bind = function(additionalParamDefaults) {
+          return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
+        };
+
+        return Resource;
+      }
+
+      return resourceFactory;
+    }];
+  });
+
+
+})(window, window.angular);
\ No newline at end of file
diff --git a/public/tvox/js/angular-sanitize.min.js b/public/tvox/js/angular-sanitize.min.js
new file mode 100644
index 0000000..7ddbf88
--- /dev/null
+++ b/public/tvox/js/angular-sanitize.min.js
@@ -0,0 +1,240 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(s, e) {
+  'use strict';
+
+  function O(e) {
+    var g = [];
+    B(g, D).chars(e);
+    return g.join("")
+  }
+  var C = e.$$minErr("$sanitize"),
+    E, g, F, G, H, q, D, I, J, B;
+  e.module("ngSanitize", []).provider("$sanitize", function() {
+    function h(a, d) {
+      return A(a.split(","), d)
+    }
+
+    function A(a, d) {
+      var c = {},
+        b;
+      for (b = 0; b < a.length; b++) c[d ? q(a[b]) : a[b]] = !0;
+      return c
+    }
+
+    function t(a, d) {
+      d && d.length && g(a, A(d))
+    }
+
+    function P(a) {
+      for (var d = {}, c = 0, b = a.length; c < b; c++) {
+        var k = a[c];
+        d[k.name] = k.value
+      }
+      return d
+    }
+
+    function K(a) {
+      return a.replace(/&/g, "&amp;").replace(Q, function(a) {
+        var c =
+          a.charCodeAt(0);
+        a = a.charCodeAt(1);
+        return "&#" + (1024 * (c - 55296) + (a - 56320) + 65536) + ";"
+      }).replace(u, function(a) {
+        return "&#" + a.charCodeAt(0) + ";"
+      }).replace(/</g, "&lt;").replace(/>/g, "&gt;")
+    }
+
+    function z(a) {
+      for (; a;) {
+        if (a.nodeType === s.Node.ELEMENT_NODE)
+          for (var d = a.attributes, c = 0, b = d.length; c < b; c++) {
+            var k = d[c],
+              f = k.name.toLowerCase();
+            if ("xmlns:ns1" === f || 0 === f.lastIndexOf("ns1:", 0)) a.removeAttributeNode(k), c--, b--
+          }(d = a.firstChild) && z(d);
+        a = v("nextSibling", a)
+      }
+    }
+
+    function v(a, d) {
+      var c = d[a];
+      if (c && I.call(d, c)) throw C("elclob",
+        d.outerHTML || d.outerText);
+      return c
+    }
+    var y = !1,
+      f = !1;
+    this.$get = ["$$sanitizeUri", function(a) {
+      y = !0;
+      f && g(m, l);
+      return function(d) {
+        var c = [];
+        J(d, B(c, function(b, c) {
+          return !/^unsafe:/.test(a(b, c))
+        }));
+        return c.join("")
+      }
+    }];
+    this.enableSvg = function(a) {
+      return H(a) ? (f = a, this) : f
+    };
+    this.addValidElements = function(a) {
+      y || (G(a) && (a = {
+        htmlElements: a
+      }), t(l, a.svgElements), t(r, a.htmlVoidElements), t(m, a.htmlVoidElements), t(m, a.htmlElements));
+      return this
+    };
+    this.addValidAttrs = function(a) {
+      y || g(L, A(a, !0));
+      return this
+    };
+    E = e.bind;
+    g = e.extend;
+    F = e.forEach;
+    G = e.isArray;
+    H = e.isDefined;
+    q = e.$$lowercase;
+    D = e.noop;
+    J = function(a, d) {
+      null === a || void 0 === a ? a = "" : "string" !== typeof a && (a = "" + a);
+      var c = M(a);
+      if (!c) return "";
+      var b = 5;
+      do {
+        if (0 === b) throw C("uinput");
+        b--;
+        a = c.innerHTML;
+        c = M(a)
+      } while (a !== c.innerHTML);
+      for (b = c.firstChild; b;) {
+        switch (b.nodeType) {
+          case 1:
+            d.start(b.nodeName.toLowerCase(), P(b.attributes));
+            break;
+          case 3:
+            d.chars(b.textContent)
+        }
+        var k;
+        if (!(k = b.firstChild) && (1 === b.nodeType && d.end(b.nodeName.toLowerCase()), k = v("nextSibling", b), !k))
+          for (; null == k;) {
+            b =
+              v("parentNode", b);
+            if (b === c) break;
+            k = v("nextSibling", b);
+            1 === b.nodeType && d.end(b.nodeName.toLowerCase())
+          }
+        b = k
+      }
+      for (; b = c.firstChild;) c.removeChild(b)
+    };
+    B = function(a, d) {
+      var c = !1,
+        b = E(a, a.push);
+      return {
+        start: function(a, f) {
+          a = q(a);
+          !c && w[a] && (c = a);
+          c || !0 !== m[a] || (b("<"), b(a), F(f, function(c, f) {
+            var e = q(f),
+              h = "img" === a && "src" === e || "background" === e;
+            !0 !== L[e] || !0 === N[e] && !d(c, h) || (b(" "), b(f), b('="'), b(K(c)), b('"'))
+          }), b(">"))
+        },
+        end: function(a) {
+          a = q(a);
+          c || !0 !== m[a] || !0 === r[a] || (b("</"), b(a), b(">"));
+          a == c && (c = !1)
+        },
+        chars: function(a) {
+          c ||
+            b(K(a))
+        }
+      }
+    };
+    I = s.Node.prototype.contains || function(a) {
+      return !!(this.compareDocumentPosition(a) & 16)
+    };
+    var Q = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+      u = /([^#-~ |!])/g,
+      r = h("area,br,col,hr,img,wbr"),
+      x = h("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),
+      p = h("rp,rt"),
+      n = g({}, p, x),
+      x = g({}, x, h("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul")),
+      p = g({}, p, h("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),
+      l = h("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan"),
+      w = h("script,style"),
+      m = g({}, r, x, p, n),
+      N = h("background,cite,href,longdesc,src,xlink:href,xml:base"),
+      n = h("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"),
+      p = h("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",
+        !0),
+      L = g({}, N, p, n),
+      M = function(a, d) {
+        function c(b) {
+          b = "<remove></remove>" + b;
+          try {
+            var c = (new a.DOMParser).parseFromString(b, "text/html").body;
+            c.firstChild.remove();
+            return c
+          } catch (d) {}
+        }
+        var b;
+        try {
+          b = !!c("")
+        } catch (f) {
+          b = !1
+        }
+        if (b) return c;
+        if (!d || !d.implementation) throw C("noinert");
+        b = d.implementation.createHTMLDocument("inert");
+        var e = (b.documentElement || b.getDocumentElement()).querySelector("body");
+        return function(a) {
+          e.innerHTML = a;
+          d.documentMode && z(e);
+          return e
+        }
+      }(s, s.document)
+  }).info({
+    angularVersion: "1.8.2"
+  });
+  e.module("ngSanitize").filter("linky", ["$sanitize", function(h) {
+    var g = /((s?ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
+      t = /^mailto:/i,
+      q = e.$$minErr("linky"),
+      s = e.isDefined,
+      z = e.isFunction,
+      v = e.isObject,
+      y = e.isString;
+    return function(f, e, u) {
+      function r(e) {
+        e && l.push(O(e))
+      }
+
+      function x(f, h) {
+        var g, a = p(f);
+        l.push("<a ");
+        for (g in a) l.push(g + '="' + a[g] + '" ');
+        !s(e) || "target" in a || l.push('target="', e, '" ');
+        l.push('href="', f.replace(/"/g, "&quot;"), '">');
+        r(h);
+        l.push("</a>")
+      }
+      if (null ==
+        f || "" === f) return f;
+      if (!y(f)) throw q("notstring", f);
+      for (var p = z(u) ? u : v(u) ? function() {
+          return u
+        } : function() {
+          return {}
+        }, n = f, l = [], w, m; f = n.match(g);) w = f[0], f[2] || f[4] || (w = (f[3] ? "http://" : "mailto:") + w), m = f.index, r(n.substr(0, m)), x(w, f[0].replace(t, "")), n = n.substring(m + f[0].length);
+      r(n);
+      return h(l.join(""))
+    }
+  }])
+})(window, window.angular);
+//# sourceMappingURL=angular-sanitize.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/angular.min.js b/public/tvox/js/angular.min.js
new file mode 100644
index 0000000..474b4dc
--- /dev/null
+++ b/public/tvox/js/angular.min.js
@@ -0,0 +1,9845 @@
+/*
+ AngularJS v1.8.2
+ (c) 2010-2020 Google LLC. http://angularjs.org
+ License: MIT
+*/
+(function(z) {
+  'use strict';
+
+  function ve(a) {
+    if (D(a)) w(a.objectMaxDepth) && (Xb.objectMaxDepth = Yb(a.objectMaxDepth) ? a.objectMaxDepth : NaN), w(a.urlErrorParamsEnabled) && Ga(a.urlErrorParamsEnabled) && (Xb.urlErrorParamsEnabled = a.urlErrorParamsEnabled);
+    else return Xb
+  }
+
+  function Yb(a) {
+    return X(a) && 0 < a
+  }
+
+  function F(a, b) {
+    b = b || Error;
+    return function() {
+      var d = arguments[0],
+        c;
+      c = "[" + (a ? a + ":" : "") + d + "] http://errors.angularjs.org/1.8.2/" + (a ? a + "/" : "") + d;
+      for (d = 1; d < arguments.length; d++) {
+        c = c + (1 == d ? "?" : "&") + "p" + (d - 1) + "=";
+        var e = encodeURIComponent,
+          f;
+        f = arguments[d];
+        f = "function" == typeof f ? f.toString().replace(/ \{[\s\S]*$/, "") : "undefined" == typeof f ? "undefined" : "string" != typeof f ? JSON.stringify(f) : f;
+        c += e(f)
+      }
+      return new b(c)
+    }
+  }
+
+  function za(a) {
+    if (null == a || $a(a)) return !1;
+    if (H(a) || C(a) || x && a instanceof x) return !0;
+    var b = "length" in Object(a) && a.length;
+    return X(b) && (0 <= b && b - 1 in a || "function" === typeof a.item)
+  }
+
+  function r(a, b, d) {
+    var c, e;
+    if (a)
+      if (B(a))
+        for (c in a) "prototype" !== c && "length" !== c && "name" !== c && a.hasOwnProperty(c) && b.call(d, a[c], c, a);
+      else if (H(a) ||
+      za(a)) {
+      var f = "object" !== typeof a;
+      c = 0;
+      for (e = a.length; c < e; c++)(f || c in a) && b.call(d, a[c], c, a)
+    } else if (a.forEach && a.forEach !== r) a.forEach(b, d, a);
+    else if (Pc(a))
+      for (c in a) b.call(d, a[c], c, a);
+    else if ("function" === typeof a.hasOwnProperty)
+      for (c in a) a.hasOwnProperty(c) && b.call(d, a[c], c, a);
+    else
+      for (c in a) ta.call(a, c) && b.call(d, a[c], c, a);
+    return a
+  }
+
+  function Qc(a, b, d) {
+    for (var c = Object.keys(a).sort(), e = 0; e < c.length; e++) b.call(d, a[c[e]], c[e]);
+    return c
+  }
+
+  function Zb(a) {
+    return function(b, d) {
+      a(d, b)
+    }
+  }
+
+  function we() {
+    return ++qb
+  }
+
+  function $b(a, b, d) {
+    for (var c = a.$$hashKey, e = 0, f = b.length; e < f; ++e) {
+      var g = b[e];
+      if (D(g) || B(g))
+        for (var k = Object.keys(g), h = 0, l = k.length; h < l; h++) {
+          var m = k[h],
+            p = g[m];
+          d && D(p) ? ha(p) ? a[m] = new Date(p.valueOf()) : ab(p) ? a[m] = new RegExp(p) : p.nodeName ? a[m] = p.cloneNode(!0) : ac(p) ? a[m] = p.clone() : "__proto__" !== m && (D(a[m]) || (a[m] = H(p) ? [] : {}), $b(a[m], [p], !0)) : a[m] = p
+        }
+    }
+    c ? a.$$hashKey = c : delete a.$$hashKey;
+    return a
+  }
+
+  function S(a) {
+    return $b(a, Ha.call(arguments, 1), !1)
+  }
+
+  function xe(a) {
+    return $b(a, Ha.call(arguments, 1), !0)
+  }
+
+  function fa(a) {
+    return parseInt(a,
+      10)
+  }
+
+  function bc(a, b) {
+    return S(Object.create(a), b)
+  }
+
+  function E() {}
+
+  function Ta(a) {
+    return a
+  }
+
+  function ia(a) {
+    return function() {
+      return a
+    }
+  }
+
+  function cc(a) {
+    return B(a.toString) && a.toString !== la
+  }
+
+  function A(a) {
+    return "undefined" === typeof a
+  }
+
+  function w(a) {
+    return "undefined" !== typeof a
+  }
+
+  function D(a) {
+    return null !== a && "object" === typeof a
+  }
+
+  function Pc(a) {
+    return null !== a && "object" === typeof a && !Rc(a)
+  }
+
+  function C(a) {
+    return "string" === typeof a
+  }
+
+  function X(a) {
+    return "number" === typeof a
+  }
+
+  function ha(a) {
+    return "[object Date]" === la.call(a)
+  }
+
+  function H(a) {
+    return Array.isArray(a) || a instanceof Array
+  }
+
+  function dc(a) {
+    switch (la.call(a)) {
+      case "[object Error]":
+        return !0;
+      case "[object Exception]":
+        return !0;
+      case "[object DOMException]":
+        return !0;
+      default:
+        return a instanceof Error
+    }
+  }
+
+  function B(a) {
+    return "function" === typeof a
+  }
+
+  function ab(a) {
+    return "[object RegExp]" === la.call(a)
+  }
+
+  function $a(a) {
+    return a && a.window === a
+  }
+
+  function bb(a) {
+    return a && a.$evalAsync && a.$watch
+  }
+
+  function Ga(a) {
+    return "boolean" === typeof a
+  }
+
+  function ye(a) {
+    return a && X(a.length) && ze.test(la.call(a))
+  }
+
+  function ac(a) {
+    return !(!a || !(a.nodeName || a.prop && a.attr && a.find))
+  }
+
+  function Ae(a) {
+    var b = {};
+    a = a.split(",");
+    var d;
+    for (d = 0; d < a.length; d++) b[a[d]] = !0;
+    return b
+  }
+
+  function ua(a) {
+    return K(a.nodeName || a[0] && a[0].nodeName)
+  }
+
+  function cb(a, b) {
+    var d = a.indexOf(b);
+    0 <= d && a.splice(d, 1);
+    return d
+  }
+
+  function Ia(a, b, d) {
+    function c(a, b, c) {
+      c--;
+      if (0 > c) return "...";
+      var d = b.$$hashKey,
+        f;
+      if (H(a)) {
+        f = 0;
+        for (var g = a.length; f < g; f++) b.push(e(a[f], c))
+      } else if (Pc(a))
+        for (f in a) b[f] = e(a[f], c);
+      else if (a && "function" === typeof a.hasOwnProperty)
+        for (f in a) a.hasOwnProperty(f) &&
+          (b[f] = e(a[f], c));
+      else
+        for (f in a) ta.call(a, f) && (b[f] = e(a[f], c));
+      d ? b.$$hashKey = d : delete b.$$hashKey;
+      return b
+    }
+
+    function e(a, b) {
+      if (!D(a)) return a;
+      var d = g.indexOf(a);
+      if (-1 !== d) return k[d];
+      if ($a(a) || bb(a)) throw oa("cpws");
+      var d = !1,
+        e = f(a);
+      void 0 === e && (e = H(a) ? [] : Object.create(Rc(a)), d = !0);
+      g.push(a);
+      k.push(e);
+      return d ? c(a, e, b) : e
+    }
+
+    function f(a) {
+      switch (la.call(a)) {
+        case "[object Int8Array]":
+        case "[object Int16Array]":
+        case "[object Int32Array]":
+        case "[object Float32Array]":
+        case "[object Float64Array]":
+        case "[object Uint8Array]":
+        case "[object Uint8ClampedArray]":
+        case "[object Uint16Array]":
+        case "[object Uint32Array]":
+          return new a.constructor(e(a.buffer),
+            a.byteOffset, a.length);
+        case "[object ArrayBuffer]":
+          if (!a.slice) {
+            var b = new ArrayBuffer(a.byteLength);
+            (new Uint8Array(b)).set(new Uint8Array(a));
+            return b
+          }
+          return a.slice(0);
+        case "[object Boolean]":
+        case "[object Number]":
+        case "[object String]":
+        case "[object Date]":
+          return new a.constructor(a.valueOf());
+        case "[object RegExp]":
+          return b = new RegExp(a.source, a.toString().match(/[^/]*$/)[0]), b.lastIndex = a.lastIndex, b;
+        case "[object Blob]":
+          return new a.constructor([a], {
+            type: a.type
+          })
+      }
+      if (B(a.cloneNode)) return a.cloneNode(!0)
+    }
+    var g = [],
+      k = [];
+    d = Yb(d) ? d : NaN;
+    if (b) {
+      if (ye(b) || "[object ArrayBuffer]" === la.call(b)) throw oa("cpta");
+      if (a === b) throw oa("cpi");
+      H(b) ? b.length = 0 : r(b, function(a, c) {
+        "$$hashKey" !== c && delete b[c]
+      });
+      g.push(a);
+      k.push(b);
+      return c(a, b, d)
+    }
+    return e(a, d)
+  }
+
+  function ec(a, b) {
+    return a === b || a !== a && b !== b
+  }
+
+  function va(a, b) {
+    if (a === b) return !0;
+    if (null === a || null === b) return !1;
+    if (a !== a && b !== b) return !0;
+    var d = typeof a,
+      c;
+    if (d === typeof b && "object" === d)
+      if (H(a)) {
+        if (!H(b)) return !1;
+        if ((d = a.length) === b.length) {
+          for (c = 0; c < d; c++)
+            if (!va(a[c],
+                b[c])) return !1;
+          return !0
+        }
+      } else {
+        if (ha(a)) return ha(b) ? ec(a.getTime(), b.getTime()) : !1;
+        if (ab(a)) return ab(b) ? a.toString() === b.toString() : !1;
+        if (bb(a) || bb(b) || $a(a) || $a(b) || H(b) || ha(b) || ab(b)) return !1;
+        d = T();
+        for (c in a)
+          if ("$" !== c.charAt(0) && !B(a[c])) {
+            if (!va(a[c], b[c])) return !1;
+            d[c] = !0
+          } for (c in b)
+          if (!(c in d) && "$" !== c.charAt(0) && w(b[c]) && !B(b[c])) return !1;
+        return !0
+      } return !1
+  }
+
+  function db(a, b, d) {
+    return a.concat(Ha.call(b, d))
+  }
+
+  function Va(a, b) {
+    var d = 2 < arguments.length ? Ha.call(arguments, 2) : [];
+    return !B(b) || b instanceof
+    RegExp ? b : d.length ? function() {
+      return arguments.length ? b.apply(a, db(d, arguments, 0)) : b.apply(a, d)
+    } : function() {
+      return arguments.length ? b.apply(a, arguments) : b.call(a)
+    }
+  }
+
+  function Sc(a, b) {
+    var d = b;
+    "string" === typeof a && "$" === a.charAt(0) && "$" === a.charAt(1) ? d = void 0 : $a(b) ? d = "$WINDOW" : b && z.document === b ? d = "$DOCUMENT" : bb(b) && (d = "$SCOPE");
+    return d
+  }
+
+  function eb(a, b) {
+    if (!A(a)) return X(b) || (b = b ? 2 : null), JSON.stringify(a, Sc, b)
+  }
+
+  function Tc(a) {
+    return C(a) ? JSON.parse(a) : a
+  }
+
+  function fc(a, b) {
+    a = a.replace(Be, "");
+    var d = Date.parse("Jan 01, 1970 00:00:00 " +
+      a) / 6E4;
+    return Y(d) ? b : d
+  }
+
+  function Uc(a, b) {
+    a = new Date(a.getTime());
+    a.setMinutes(a.getMinutes() + b);
+    return a
+  }
+
+  function gc(a, b, d) {
+    d = d ? -1 : 1;
+    var c = a.getTimezoneOffset();
+    b = fc(b, c);
+    return Uc(a, d * (b - c))
+  }
+
+  function Aa(a) {
+    a = x(a).clone().empty();
+    var b = x("<div></div>").append(a).html();
+    try {
+      return a[0].nodeType === Pa ? K(b) : b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/, function(a, b) {
+        return "<" + K(b)
+      })
+    } catch (d) {
+      return K(b)
+    }
+  }
+
+  function Vc(a) {
+    try {
+      return decodeURIComponent(a)
+    } catch (b) {}
+  }
+
+  function hc(a) {
+    var b = {};
+    r((a || "").split("&"),
+      function(a) {
+        var c, e, f;
+        a && (e = a = a.replace(/\+/g, "%20"), c = a.indexOf("="), -1 !== c && (e = a.substring(0, c), f = a.substring(c + 1)), e = Vc(e), w(e) && (f = w(f) ? Vc(f) : !0, ta.call(b, e) ? H(b[e]) ? b[e].push(f) : b[e] = [b[e], f] : b[e] = f))
+      });
+    return b
+  }
+
+  function Ce(a) {
+    var b = [];
+    r(a, function(a, c) {
+      H(a) ? r(a, function(a) {
+        b.push(ba(c, !0) + (!0 === a ? "" : "=" + ba(a, !0)))
+      }) : b.push(ba(c, !0) + (!0 === a ? "" : "=" + ba(a, !0)))
+    });
+    return b.length ? b.join("&") : ""
+  }
+
+  function ic(a) {
+    return ba(a, !0).replace(/%26/gi, "&").replace(/%3D/gi, "=").replace(/%2B/gi, "+")
+  }
+
+  function ba(a,
+    b) {
+    return encodeURIComponent(a).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%3B/gi, ";").replace(/%20/g, b ? "%20" : "+")
+  }
+
+  function De(a, b) {
+    var d, c, e = Qa.length;
+    for (c = 0; c < e; ++c)
+      if (d = Qa[c] + b, C(d = a.getAttribute(d))) return d;
+    return null
+  }
+
+  function Ee(a, b) {
+    var d, c, e = {};
+    r(Qa, function(b) {
+      b += "app";
+      !d && a.hasAttribute && a.hasAttribute(b) && (d = a, c = a.getAttribute(b))
+    });
+    r(Qa, function(b) {
+      b += "app";
+      var e;
+      !d && (e = a.querySelector("[" + b.replace(":", "\\:") + "]")) && (d = e, c = e.getAttribute(b))
+    });
+    d && (Fe ? (e.strictDi = null !== De(d, "strict-di"), b(d, c ? [c] : [], e)) : z.console.error("AngularJS: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match."))
+  }
+
+  function Wc(a, b, d) {
+    D(d) || (d = {});
+    d = S({
+      strictDi: !1
+    }, d);
+    var c = function() {
+        a = x(a);
+        if (a.injector()) {
+          var c = a[0] === z.document ? "document" : Aa(a);
+          throw oa("btstrpd", c.replace(/</, "&lt;").replace(/>/, "&gt;"));
+        }
+        b = b || [];
+        b.unshift(["$provide", function(b) {
+          b.value("$rootElement", a)
+        }]);
+        d.debugInfoEnabled && b.push(["$compileProvider",
+          function(a) {
+            a.debugInfoEnabled(!0)
+          }
+        ]);
+        b.unshift("ng");
+        c = fb(b, d.strictDi);
+        c.invoke(["$rootScope", "$rootElement", "$compile", "$injector", function(a, b, c, d) {
+          a.$apply(function() {
+            b.data("$injector", d);
+            c(b)(a)
+          })
+        }]);
+        return c
+      },
+      e = /^NG_ENABLE_DEBUG_INFO!/,
+      f = /^NG_DEFER_BOOTSTRAP!/;
+    z && e.test(z.name) && (d.debugInfoEnabled = !0, z.name = z.name.replace(e, ""));
+    if (z && !f.test(z.name)) return c();
+    z.name = z.name.replace(f, "");
+    ca.resumeBootstrap = function(a) {
+      r(a, function(a) {
+        b.push(a)
+      });
+      return c()
+    };
+    B(ca.resumeDeferredBootstrap) &&
+      ca.resumeDeferredBootstrap()
+  }
+
+  function Ge() {
+    z.name = "NG_ENABLE_DEBUG_INFO!" + z.name;
+    z.location.reload()
+  }
+
+  function He(a) {
+    a = ca.element(a).injector();
+    if (!a) throw oa("test");
+    return a.get("$$testability")
+  }
+
+  function Xc(a, b) {
+    b = b || "_";
+    return a.replace(Ie, function(a, c) {
+      return (c ? b : "") + a.toLowerCase()
+    })
+  }
+
+  function Je() {
+    var a;
+    if (!Yc) {
+      var b = rb();
+      (sb = A(b) ? z.jQuery : b ? z[b] : void 0) && sb.fn.on ? (x = sb, S(sb.fn, {
+          scope: Wa.scope,
+          isolateScope: Wa.isolateScope,
+          controller: Wa.controller,
+          injector: Wa.injector,
+          inheritedData: Wa.inheritedData
+        })) :
+        x = U;
+      a = x.cleanData;
+      x.cleanData = function(b) {
+        for (var c, e = 0, f; null != (f = b[e]); e++)(c = (x._data(f) || {}).events) && c.$destroy && x(f).triggerHandler("$destroy");
+        a(b)
+      };
+      ca.element = x;
+      Yc = !0
+    }
+  }
+
+  function Ke() {
+    U.legacyXHTMLReplacement = !0
+  }
+
+  function gb(a, b, d) {
+    if (!a) throw oa("areq", b || "?", d || "required");
+    return a
+  }
+
+  function tb(a, b, d) {
+    d && H(a) && (a = a[a.length - 1]);
+    gb(B(a), b, "not a function, got " + (a && "object" === typeof a ? a.constructor.name || "Object" : typeof a));
+    return a
+  }
+
+  function Ja(a, b) {
+    if ("hasOwnProperty" === a) throw oa("badname",
+      b);
+  }
+
+  function Le(a, b, d) {
+    if (!b) return a;
+    b = b.split(".");
+    for (var c, e = a, f = b.length, g = 0; g < f; g++) c = b[g], a && (a = (e = a)[c]);
+    return !d && B(a) ? Va(e, a) : a
+  }
+
+  function ub(a) {
+    for (var b = a[0], d = a[a.length - 1], c, e = 1; b !== d && (b = b.nextSibling); e++)
+      if (c || a[e] !== b) c || (c = x(Ha.call(a, 0, e))), c.push(b);
+    return c || a
+  }
+
+  function T() {
+    return Object.create(null)
+  }
+
+  function jc(a) {
+    if (null == a) return "";
+    switch (typeof a) {
+      case "string":
+        break;
+      case "number":
+        a = "" + a;
+        break;
+      default:
+        a = !cc(a) || H(a) || ha(a) ? eb(a) : a.toString()
+    }
+    return a
+  }
+
+  function Me(a) {
+    function b(a,
+      b, c) {
+      return a[b] || (a[b] = c())
+    }
+    var d = F("$injector"),
+      c = F("ng");
+    a = b(a, "angular", Object);
+    a.$$minErr = a.$$minErr || F;
+    return b(a, "module", function() {
+      var a = {};
+      return function(f, g, k) {
+        var h = {};
+        if ("hasOwnProperty" === f) throw c("badname", "module");
+        g && a.hasOwnProperty(f) && (a[f] = null);
+        return b(a, f, function() {
+          function a(b, c, d, f) {
+            f || (f = e);
+            return function() {
+              f[d || "push"]([b, c, arguments]);
+              return t
+            }
+          }
+
+          function b(a, c, d) {
+            d || (d = e);
+            return function(b, e) {
+              e && B(e) && (e.$$moduleName = f);
+              d.push([a, c, arguments]);
+              return t
+            }
+          }
+          if (!g) throw d("nomod",
+            f);
+          var e = [],
+            n = [],
+            s = [],
+            G = a("$injector", "invoke", "push", n),
+            t = {
+              _invokeQueue: e,
+              _configBlocks: n,
+              _runBlocks: s,
+              info: function(a) {
+                if (w(a)) {
+                  if (!D(a)) throw c("aobj", "value");
+                  h = a;
+                  return this
+                }
+                return h
+              },
+              requires: g,
+              name: f,
+              provider: b("$provide", "provider"),
+              factory: b("$provide", "factory"),
+              service: b("$provide", "service"),
+              value: a("$provide", "value"),
+              constant: a("$provide", "constant", "unshift"),
+              decorator: b("$provide", "decorator", n),
+              animation: b("$animateProvider", "register"),
+              filter: b("$filterProvider", "register"),
+              controller: b("$controllerProvider",
+                "register"),
+              directive: b("$compileProvider", "directive"),
+              component: b("$compileProvider", "component"),
+              config: G,
+              run: function(a) {
+                s.push(a);
+                return this
+              }
+            };
+          k && G(k);
+          return t
+        })
+      }
+    })
+  }
+
+  function ja(a, b) {
+    if (H(a)) {
+      b = b || [];
+      for (var d = 0, c = a.length; d < c; d++) b[d] = a[d]
+    } else if (D(a))
+      for (d in b = b || {}, a)
+        if ("$" !== d.charAt(0) || "$" !== d.charAt(1)) b[d] = a[d];
+    return b || a
+  }
+
+  function Ne(a, b) {
+    var d = [];
+    Yb(b) && (a = ca.copy(a, null, b));
+    return JSON.stringify(a, function(a, b) {
+      b = Sc(a, b);
+      if (D(b)) {
+        if (0 <= d.indexOf(b)) return "...";
+        d.push(b)
+      }
+      return b
+    })
+  }
+
+  function Oe(a) {
+    S(a, {
+      errorHandlingConfig: ve,
+      bootstrap: Wc,
+      copy: Ia,
+      extend: S,
+      merge: xe,
+      equals: va,
+      element: x,
+      forEach: r,
+      injector: fb,
+      noop: E,
+      bind: Va,
+      toJson: eb,
+      fromJson: Tc,
+      identity: Ta,
+      isUndefined: A,
+      isDefined: w,
+      isString: C,
+      isFunction: B,
+      isObject: D,
+      isNumber: X,
+      isElement: ac,
+      isArray: H,
+      version: Pe,
+      isDate: ha,
+      callbacks: {
+        $$counter: 0
+      },
+      getTestability: He,
+      reloadWithDebugInfo: Ge,
+      UNSAFE_restoreLegacyJqLiteXHTMLReplacement: Ke,
+      $$minErr: F,
+      $$csp: Ba,
+      $$encodeUriSegment: ic,
+      $$encodeUriQuery: ba,
+      $$lowercase: K,
+      $$stringify: jc,
+      $$uppercase: vb
+    });
+    lc = Me(z);
+    lc("ng", ["ngLocale"], ["$provide", function(a) {
+      a.provider({
+        $$sanitizeUri: Qe
+      });
+      a.provider("$compile", Zc).directive({
+        a: Re,
+        input: $c,
+        textarea: $c,
+        form: Se,
+        script: Te,
+        select: Ue,
+        option: Ve,
+        ngBind: We,
+        ngBindHtml: Xe,
+        ngBindTemplate: Ye,
+        ngClass: Ze,
+        ngClassEven: $e,
+        ngClassOdd: af,
+        ngCloak: bf,
+        ngController: cf,
+        ngForm: df,
+        ngHide: ef,
+        ngIf: ff,
+        ngInclude: gf,
+        ngInit: hf,
+        ngNonBindable: jf,
+        ngPluralize: kf,
+        ngRef: lf,
+        ngRepeat: mf,
+        ngShow: nf,
+        ngStyle: of ,
+        ngSwitch: pf,
+        ngSwitchWhen: qf,
+        ngSwitchDefault: rf,
+        ngOptions: sf,
+        ngTransclude: tf,
+        ngModel: uf,
+        ngList: vf,
+        ngChange: wf,
+        pattern: ad,
+        ngPattern: ad,
+        required: bd,
+        ngRequired: bd,
+        minlength: cd,
+        ngMinlength: cd,
+        maxlength: dd,
+        ngMaxlength: dd,
+        ngValue: xf,
+        ngModelOptions: yf
+      }).directive({
+        ngInclude: zf,
+        input: Af
+      }).directive(wb).directive(ed);
+      a.provider({
+        $anchorScroll: Bf,
+        $animate: Cf,
+        $animateCss: Df,
+        $$animateJs: Ef,
+        $$animateQueue: Ff,
+        $$AnimateRunner: Gf,
+        $$animateAsyncRun: Hf,
+        $browser: If,
+        $cacheFactory: Jf,
+        $controller: Kf,
+        $document: Lf,
+        $$isDocumentHidden: Mf,
+        $exceptionHandler: Nf,
+        $filter: fd,
+        $$forceReflow: Of,
+        $interpolate: Pf,
+        $interval: Qf,
+        $$intervalFactory: Rf,
+        $http: Sf,
+        $httpParamSerializer: Tf,
+        $httpParamSerializerJQLike: Uf,
+        $httpBackend: Vf,
+        $xhrFactory: Wf,
+        $jsonpCallbacks: Xf,
+        $location: Yf,
+        $log: Zf,
+        $parse: $f,
+        $rootScope: ag,
+        $q: bg,
+        $$q: cg,
+        $sce: dg,
+        $sceDelegate: eg,
+        $sniffer: fg,
+        $$taskTrackerFactory: gg,
+        $templateCache: hg,
+        $templateRequest: ig,
+        $$testability: jg,
+        $timeout: kg,
+        $window: lg,
+        $$rAF: mg,
+        $$jqLite: ng,
+        $$Map: og,
+        $$cookieReader: pg
+      })
+    }]).info({
+      angularVersion: "1.8.2"
+    })
+  }
+
+  function xb(a, b) {
+    return b.toUpperCase()
+  }
+
+  function yb(a) {
+    return a.replace(qg, xb)
+  }
+
+  function mc(a) {
+    a =
+      a.nodeType;
+    return 1 === a || !a || 9 === a
+  }
+
+  function gd(a, b) {
+    var d, c, e, f = b.createDocumentFragment(),
+      g = [],
+      k;
+    if (nc.test(a)) {
+      d = f.appendChild(b.createElement("div"));
+      c = (rg.exec(a) || ["", ""])[1].toLowerCase();
+      e = U.legacyXHTMLReplacement ? a.replace(sg, "<$1></$2>") : a;
+      if (10 > wa)
+        for (c = hb[c] || hb._default, d.innerHTML = c[1] + e + c[2], k = c[0]; k--;) d = d.firstChild;
+      else {
+        c = qa[c] || [];
+        for (k = c.length; - 1 < --k;) d.appendChild(z.document.createElement(c[k])), d = d.firstChild;
+        d.innerHTML = e
+      }
+      g = db(g, d.childNodes);
+      d = f.firstChild;
+      d.textContent = ""
+    } else g.push(b.createTextNode(a));
+    f.textContent = "";
+    f.innerHTML = "";
+    r(g, function(a) {
+      f.appendChild(a)
+    });
+    return f
+  }
+
+  function U(a) {
+    if (a instanceof U) return a;
+    var b;
+    C(a) && (a = V(a), b = !0);
+    if (!(this instanceof U)) {
+      if (b && "<" !== a.charAt(0)) throw oc("nosel");
+      return new U(a)
+    }
+    if (b) {
+      b = z.document;
+      var d;
+      a = (d = tg.exec(a)) ? [b.createElement(d[1])] : (d = gd(a, b)) ? d.childNodes : [];
+      pc(this, a)
+    } else B(a) ? hd(a) : pc(this, a)
+  }
+
+  function qc(a) {
+    return a.cloneNode(!0)
+  }
+
+  function zb(a, b) {
+    !b && mc(a) && x.cleanData([a]);
+    a.querySelectorAll && x.cleanData(a.querySelectorAll("*"))
+  }
+
+  function id(a) {
+    for (var b in a) return !1;
+    return !0
+  }
+
+  function jd(a) {
+    var b = a.ng339,
+      d = b && Ka[b],
+      c = d && d.events,
+      d = d && d.data;
+    d && !id(d) || c && !id(c) || (delete Ka[b], a.ng339 = void 0)
+  }
+
+  function kd(a, b, d, c) {
+    if (w(c)) throw oc("offargs");
+    var e = (c = Ab(a)) && c.events,
+      f = c && c.handle;
+    if (f) {
+      if (b) {
+        var g = function(b) {
+          var c = e[b];
+          w(d) && cb(c || [], d);
+          w(d) && c && 0 < c.length || (a.removeEventListener(b, f), delete e[b])
+        };
+        r(b.split(" "), function(a) {
+          g(a);
+          Bb[a] && g(Bb[a])
+        })
+      } else
+        for (b in e) "$destroy" !== b && a.removeEventListener(b, f), delete e[b];
+      jd(a)
+    }
+  }
+
+  function rc(a, b) {
+    var d = a.ng339;
+    if (d =
+      d && Ka[d]) b ? delete d.data[b] : d.data = {}, jd(a)
+  }
+
+  function Ab(a, b) {
+    var d = a.ng339,
+      d = d && Ka[d];
+    b && !d && (a.ng339 = d = ++ug, d = Ka[d] = {
+      events: {},
+      data: {},
+      handle: void 0
+    });
+    return d
+  }
+
+  function sc(a, b, d) {
+    if (mc(a)) {
+      var c, e = w(d),
+        f = !e && b && !D(b),
+        g = !b;
+      a = (a = Ab(a, !f)) && a.data;
+      if (e) a[yb(b)] = d;
+      else {
+        if (g) return a;
+        if (f) return a && a[yb(b)];
+        for (c in b) a[yb(c)] = b[c]
+      }
+    }
+  }
+
+  function Cb(a, b) {
+    return a.getAttribute ? -1 < (" " + (a.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " ").indexOf(" " + b + " ") : !1
+  }
+
+  function Db(a, b) {
+    if (b && a.setAttribute) {
+      var d =
+        (" " + (a.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " "),
+        c = d;
+      r(b.split(" "), function(a) {
+        a = V(a);
+        c = c.replace(" " + a + " ", " ")
+      });
+      c !== d && a.setAttribute("class", V(c))
+    }
+  }
+
+  function Eb(a, b) {
+    if (b && a.setAttribute) {
+      var d = (" " + (a.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " "),
+        c = d;
+      r(b.split(" "), function(a) {
+        a = V(a); - 1 === c.indexOf(" " + a + " ") && (c += a + " ")
+      });
+      c !== d && a.setAttribute("class", V(c))
+    }
+  }
+
+  function pc(a, b) {
+    if (b)
+      if (b.nodeType) a[a.length++] = b;
+      else {
+        var d = b.length;
+        if ("number" === typeof d && b.window !== b) {
+          if (d)
+            for (var c =
+                0; c < d; c++) a[a.length++] = b[c]
+        } else a[a.length++] = b
+      }
+  }
+
+  function ld(a, b) {
+    return Fb(a, "$" + (b || "ngController") + "Controller")
+  }
+
+  function Fb(a, b, d) {
+    9 === a.nodeType && (a = a.documentElement);
+    for (b = H(b) ? b : [b]; a;) {
+      for (var c = 0, e = b.length; c < e; c++)
+        if (w(d = x.data(a, b[c]))) return d;
+      a = a.parentNode || 11 === a.nodeType && a.host
+    }
+  }
+
+  function md(a) {
+    for (zb(a, !0); a.firstChild;) a.removeChild(a.firstChild)
+  }
+
+  function Gb(a, b) {
+    b || zb(a);
+    var d = a.parentNode;
+    d && d.removeChild(a)
+  }
+
+  function vg(a, b) {
+    b = b || z;
+    if ("complete" === b.document.readyState) b.setTimeout(a);
+    else x(b).on("load", a)
+  }
+
+  function hd(a) {
+    function b() {
+      z.document.removeEventListener("DOMContentLoaded", b);
+      z.removeEventListener("load", b);
+      a()
+    }
+    "complete" === z.document.readyState ? z.setTimeout(a) : (z.document.addEventListener("DOMContentLoaded", b), z.addEventListener("load", b))
+  }
+
+  function nd(a, b) {
+    var d = Hb[b.toLowerCase()];
+    return d && od[ua(a)] && d
+  }
+
+  function wg(a, b) {
+    var d = function(c, d) {
+      c.isDefaultPrevented = function() {
+        return c.defaultPrevented
+      };
+      var f = b[d || c.type],
+        g = f ? f.length : 0;
+      if (g) {
+        if (A(c.immediatePropagationStopped)) {
+          var k =
+            c.stopImmediatePropagation;
+          c.stopImmediatePropagation = function() {
+            c.immediatePropagationStopped = !0;
+            c.stopPropagation && c.stopPropagation();
+            k && k.call(c)
+          }
+        }
+        c.isImmediatePropagationStopped = function() {
+          return !0 === c.immediatePropagationStopped
+        };
+        var h = f.specialHandlerWrapper || xg;
+        1 < g && (f = ja(f));
+        for (var l = 0; l < g; l++) c.isImmediatePropagationStopped() || h(a, c, f[l])
+      }
+    };
+    d.elem = a;
+    return d
+  }
+
+  function xg(a, b, d) {
+    d.call(a, b)
+  }
+
+  function yg(a, b, d) {
+    var c = b.relatedTarget;
+    c && (c === a || zg.call(a, c)) || d.call(a, b)
+  }
+
+  function ng() {
+    this.$get =
+      function() {
+        return S(U, {
+          hasClass: function(a, b) {
+            a.attr && (a = a[0]);
+            return Cb(a, b)
+          },
+          addClass: function(a, b) {
+            a.attr && (a = a[0]);
+            return Eb(a, b)
+          },
+          removeClass: function(a, b) {
+            a.attr && (a = a[0]);
+            return Db(a, b)
+          }
+        })
+      }
+  }
+
+  function La(a, b) {
+    var d = a && a.$$hashKey;
+    if (d) return "function" === typeof d && (d = a.$$hashKey()), d;
+    d = typeof a;
+    return d = "function" === d || "object" === d && null !== a ? a.$$hashKey = d + ":" + (b || we)() : d + ":" + a
+  }
+
+  function pd() {
+    this._keys = [];
+    this._values = [];
+    this._lastKey = NaN;
+    this._lastIndex = -1
+  }
+
+  function qd(a) {
+    a = Function.prototype.toString.call(a).replace(Ag,
+      "");
+    return a.match(Bg) || a.match(Cg)
+  }
+
+  function Dg(a) {
+    return (a = qd(a)) ? "function(" + (a[1] || "").replace(/[\s\r\n]+/, " ") + ")" : "fn"
+  }
+
+  function fb(a, b) {
+    function d(a) {
+      return function(b, c) {
+        if (D(b)) r(b, Zb(a));
+        else return a(b, c)
+      }
+    }
+
+    function c(a, b) {
+      Ja(a, "service");
+      if (B(b) || H(b)) b = n.instantiate(b);
+      if (!b.$get) throw Ca("pget", a);
+      return p[a + "Provider"] = b
+    }
+
+    function e(a, b) {
+      return function() {
+        var c = t.invoke(b, this);
+        if (A(c)) throw Ca("undef", a);
+        return c
+      }
+    }
+
+    function f(a, b, d) {
+      return c(a, {
+        $get: !1 !== d ? e(a, b) : b
+      })
+    }
+
+    function g(a) {
+      gb(A(a) ||
+        H(a), "modulesToLoad", "not an array");
+      var b = [],
+        c;
+      r(a, function(a) {
+        function d(a) {
+          var b, c;
+          b = 0;
+          for (c = a.length; b < c; b++) {
+            var e = a[b],
+              f = n.get(e[0]);
+            f[e[1]].apply(f, e[2])
+          }
+        }
+        if (!m.get(a)) {
+          m.set(a, !0);
+          try {
+            C(a) ? (c = lc(a), t.modules[a] = c, b = b.concat(g(c.requires)).concat(c._runBlocks), d(c._invokeQueue), d(c._configBlocks)) : B(a) ? b.push(n.invoke(a)) : H(a) ? b.push(n.invoke(a)) : tb(a, "module")
+          } catch (e) {
+            throw H(a) && (a = a[a.length - 1]), e.message && e.stack && -1 === e.stack.indexOf(e.message) && (e = e.message + "\n" + e.stack), Ca("modulerr",
+              a, e.stack || e.message || e);
+          }
+        }
+      });
+      return b
+    }
+
+    function k(a, c) {
+      function d(b, e) {
+        if (a.hasOwnProperty(b)) {
+          if (a[b] === h) throw Ca("cdep", b + " <- " + l.join(" <- "));
+          return a[b]
+        }
+        try {
+          return l.unshift(b), a[b] = h, a[b] = c(b, e), a[b]
+        } catch (f) {
+          throw a[b] === h && delete a[b], f;
+        } finally {
+          l.shift()
+        }
+      }
+
+      function e(a, c, f) {
+        var g = [];
+        a = fb.$$annotate(a, b, f);
+        for (var h = 0, k = a.length; h < k; h++) {
+          var l = a[h];
+          if ("string" !== typeof l) throw Ca("itkn", l);
+          g.push(c && c.hasOwnProperty(l) ? c[l] : d(l, f))
+        }
+        return g
+      }
+      return {
+        invoke: function(a, b, c, d) {
+          "string" === typeof c &&
+            (d = c, c = null);
+          c = e(a, c, d);
+          H(a) && (a = a[a.length - 1]);
+          d = a;
+          if (wa || "function" !== typeof d) d = !1;
+          else {
+            var f = d.$$ngIsClass;
+            Ga(f) || (f = d.$$ngIsClass = /^class\b/.test(Function.prototype.toString.call(d)));
+            d = f
+          }
+          return d ? (c.unshift(null), new(Function.prototype.bind.apply(a, c))) : a.apply(b, c)
+        },
+        instantiate: function(a, b, c) {
+          var d = H(a) ? a[a.length - 1] : a;
+          a = e(a, b, c);
+          a.unshift(null);
+          return new(Function.prototype.bind.apply(d, a))
+        },
+        get: d,
+        annotate: fb.$$annotate,
+        has: function(b) {
+          return p.hasOwnProperty(b + "Provider") || a.hasOwnProperty(b)
+        }
+      }
+    }
+    b = !0 === b;
+    var h = {},
+      l = [],
+      m = new Ib,
+      p = {
+        $provide: {
+          provider: d(c),
+          factory: d(f),
+          service: d(function(a, b) {
+            return f(a, ["$injector", function(a) {
+              return a.instantiate(b)
+            }])
+          }),
+          value: d(function(a, b) {
+            return f(a, ia(b), !1)
+          }),
+          constant: d(function(a, b) {
+            Ja(a, "constant");
+            p[a] = b;
+            s[a] = b
+          }),
+          decorator: function(a, b) {
+            var c = n.get(a + "Provider"),
+              d = c.$get;
+            c.$get = function() {
+              var a = t.invoke(d, c);
+              return t.invoke(b, null, {
+                $delegate: a
+              })
+            }
+          }
+        }
+      },
+      n = p.$injector = k(p, function(a, b) {
+        ca.isString(b) && l.push(b);
+        throw Ca("unpr", l.join(" <- "));
+      }),
+      s = {},
+      G = k(s, function(a, b) {
+        var c = n.get(a + "Provider", b);
+        return t.invoke(c.$get, c, void 0, a)
+      }),
+      t = G;
+    p.$injectorProvider = {
+      $get: ia(G)
+    };
+    t.modules = n.modules = T();
+    var N = g(a),
+      t = G.get("$injector");
+    t.strictDi = b;
+    r(N, function(a) {
+      a && t.invoke(a)
+    });
+    t.loadNewModules = function(a) {
+      r(g(a), function(a) {
+        a && t.invoke(a)
+      })
+    };
+    return t
+  }
+
+  function Bf() {
+    var a = !0;
+    this.disableAutoScrolling = function() {
+      a = !1
+    };
+    this.$get = ["$window", "$location", "$rootScope", function(b, d, c) {
+      function e(a) {
+        var b = null;
+        Array.prototype.some.call(a, function(a) {
+          if ("a" ===
+            ua(a)) return b = a, !0
+        });
+        return b
+      }
+
+      function f(a) {
+        if (a) {
+          a.scrollIntoView();
+          var c;
+          c = g.yOffset;
+          B(c) ? c = c() : ac(c) ? (c = c[0], c = "fixed" !== b.getComputedStyle(c).position ? 0 : c.getBoundingClientRect().bottom) : X(c) || (c = 0);
+          c && (a = a.getBoundingClientRect().top, b.scrollBy(0, a - c))
+        } else b.scrollTo(0, 0)
+      }
+
+      function g(a) {
+        a = C(a) ? a : X(a) ? a.toString() : d.hash();
+        var b;
+        a ? (b = k.getElementById(a)) ? f(b) : (b = e(k.getElementsByName(a))) ? f(b) : "top" === a && f(null) : f(null)
+      }
+      var k = b.document;
+      a && c.$watch(function() {
+        return d.hash()
+      }, function(a, b) {
+        a ===
+          b && "" === a || vg(function() {
+            c.$evalAsync(g)
+          })
+      });
+      return g
+    }]
+  }
+
+  function ib(a, b) {
+    if (!a && !b) return "";
+    if (!a) return b;
+    if (!b) return a;
+    H(a) && (a = a.join(" "));
+    H(b) && (b = b.join(" "));
+    return a + " " + b
+  }
+
+  function Eg(a) {
+    C(a) && (a = a.split(" "));
+    var b = T();
+    r(a, function(a) {
+      a.length && (b[a] = !0)
+    });
+    return b
+  }
+
+  function ra(a) {
+    return D(a) ? a : {}
+  }
+
+  function Fg(a, b, d, c, e) {
+    function f() {
+      pa = null;
+      k()
+    }
+
+    function g() {
+      t = y();
+      t = A(t) ? null : t;
+      va(t, P) && (t = P);
+      N = P = t
+    }
+
+    function k() {
+      var a = N;
+      g();
+      if (v !== h.url() || a !== t) v = h.url(), N = t, r(J, function(a) {
+        a(h.url(), t)
+      })
+    }
+    var h = this,
+      l = a.location,
+      m = a.history,
+      p = a.setTimeout,
+      n = a.clearTimeout,
+      s = {},
+      G = e(d);
+    h.isMock = !1;
+    h.$$completeOutstandingRequest = G.completeTask;
+    h.$$incOutstandingRequestCount = G.incTaskCount;
+    h.notifyWhenNoOutstandingRequests = G.notifyWhenNoPendingTasks;
+    var t, N, v = l.href,
+      kc = b.find("base"),
+      pa = null,
+      y = c.history ? function() {
+        try {
+          return m.state
+        } catch (a) {}
+      } : E;
+    g();
+    h.url = function(b, d, e) {
+      A(e) && (e = null);
+      l !== a.location && (l = a.location);
+      m !== a.history && (m = a.history);
+      if (b) {
+        var f = N === e;
+        b = ga(b).href;
+        if (v === b && (!c.history || f)) return h;
+        var k = v && Da(v) === Da(b);
+        v = b;
+        N = e;
+        !c.history || k && f ? (k || (pa = b), d ? l.replace(b) : k ? (d = l, e = b, f = e.indexOf("#"), e = -1 === f ? "" : e.substr(f), d.hash = e) : l.href = b, l.href !== b && (pa = b)) : (m[d ? "replaceState" : "pushState"](e, "", b), g());
+        pa && (pa = b);
+        return h
+      }
+      return (pa || l.href).replace(/#$/, "")
+    };
+    h.state = function() {
+      return t
+    };
+    var J = [],
+      I = !1,
+      P = null;
+    h.onUrlChange = function(b) {
+      if (!I) {
+        if (c.history) x(a).on("popstate", f);
+        x(a).on("hashchange", f);
+        I = !0
+      }
+      J.push(b);
+      return b
+    };
+    h.$$applicationDestroyed = function() {
+      x(a).off("hashchange popstate",
+        f)
+    };
+    h.$$checkUrlChange = k;
+    h.baseHref = function() {
+      var a = kc.attr("href");
+      return a ? a.replace(/^(https?:)?\/\/[^/]*/, "") : ""
+    };
+    h.defer = function(a, b, c) {
+      var d;
+      b = b || 0;
+      c = c || G.DEFAULT_TASK_TYPE;
+      G.incTaskCount(c);
+      d = p(function() {
+        delete s[d];
+        G.completeTask(a, c)
+      }, b);
+      s[d] = c;
+      return d
+    };
+    h.defer.cancel = function(a) {
+      if (s.hasOwnProperty(a)) {
+        var b = s[a];
+        delete s[a];
+        n(a);
+        G.completeTask(E, b);
+        return !0
+      }
+      return !1
+    }
+  }
+
+  function If() {
+    this.$get = ["$window", "$log", "$sniffer", "$document", "$$taskTrackerFactory", function(a, b, d, c, e) {
+      return new Fg(a,
+        c, b, d, e)
+    }]
+  }
+
+  function Jf() {
+    this.$get = function() {
+      function a(a, c) {
+        function e(a) {
+          a !== p && (n ? n === a && (n = a.n) : n = a, f(a.n, a.p), f(a, p), p = a, p.n = null)
+        }
+
+        function f(a, b) {
+          a !== b && (a && (a.p = b), b && (b.n = a))
+        }
+        if (a in b) throw F("$cacheFactory")("iid", a);
+        var g = 0,
+          k = S({}, c, {
+            id: a
+          }),
+          h = T(),
+          l = c && c.capacity || Number.MAX_VALUE,
+          m = T(),
+          p = null,
+          n = null;
+        return b[a] = {
+          put: function(a, b) {
+            if (!A(b)) {
+              if (l < Number.MAX_VALUE) {
+                var c = m[a] || (m[a] = {
+                  key: a
+                });
+                e(c)
+              }
+              a in h || g++;
+              h[a] = b;
+              g > l && this.remove(n.key);
+              return b
+            }
+          },
+          get: function(a) {
+            if (l < Number.MAX_VALUE) {
+              var b =
+                m[a];
+              if (!b) return;
+              e(b)
+            }
+            return h[a]
+          },
+          remove: function(a) {
+            if (l < Number.MAX_VALUE) {
+              var b = m[a];
+              if (!b) return;
+              b === p && (p = b.p);
+              b === n && (n = b.n);
+              f(b.n, b.p);
+              delete m[a]
+            }
+            a in h && (delete h[a], g--)
+          },
+          removeAll: function() {
+            h = T();
+            g = 0;
+            m = T();
+            p = n = null
+          },
+          destroy: function() {
+            m = k = h = null;
+            delete b[a]
+          },
+          info: function() {
+            return S({}, k, {
+              size: g
+            })
+          }
+        }
+      }
+      var b = {};
+      a.info = function() {
+        var a = {};
+        r(b, function(b, e) {
+          a[e] = b.info()
+        });
+        return a
+      };
+      a.get = function(a) {
+        return b[a]
+      };
+      return a
+    }
+  }
+
+  function hg() {
+    this.$get = ["$cacheFactory", function(a) {
+      return a("templates")
+    }]
+  }
+
+  function Zc(a, b) {
+    function d(a, b, c) {
+      var d = /^([@&]|[=<](\*?))(\??)\s*([\w$]*)$/,
+        e = T();
+      r(a, function(a, f) {
+        a = a.trim();
+        if (a in p) e[f] = p[a];
+        else {
+          var g = a.match(d);
+          if (!g) throw $("iscp", b, f, a, c ? "controller bindings definition" : "isolate scope definition");
+          e[f] = {
+            mode: g[1][0],
+            collection: "*" === g[2],
+            optional: "?" === g[3],
+            attrName: g[4] || f
+          };
+          g[4] && (p[a] = e[f])
+        }
+      });
+      return e
+    }
+
+    function c(a) {
+      var b = a.charAt(0);
+      if (!b || b !== K(b)) throw $("baddir", a);
+      if (a !== a.trim()) throw $("baddir", a);
+    }
+
+    function e(a) {
+      var b = a.require || a.controller &&
+        a.name;
+      !H(b) && D(b) && r(b, function(a, c) {
+        var d = a.match(l);
+        a.substring(d[0].length) || (b[c] = d[0] + c)
+      });
+      return b
+    }
+    var f = {},
+      g = /^\s*directive:\s*([\w-]+)\s+(.*)$/,
+      k = /(([\w-]+)(?::([^;]+))?;?)/,
+      h = Ae("ngSrc,ngSrcset,src,srcset"),
+      l = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/,
+      m = /^(on[a-z]+|formaction)$/,
+      p = T();
+    this.directive = function pa(b, d) {
+      gb(b, "name");
+      Ja(b, "directive");
+      C(b) ? (c(b), gb(d, "directiveFactory"), f.hasOwnProperty(b) || (f[b] = [], a.factory(b + "Directive", ["$injector", "$exceptionHandler", function(a, c) {
+        var d = [];
+        r(f[b], function(f,
+          g) {
+          try {
+            var h = a.invoke(f);
+            B(h) ? h = {
+              compile: ia(h)
+            } : !h.compile && h.link && (h.compile = ia(h.link));
+            h.priority = h.priority || 0;
+            h.index = g;
+            h.name = h.name || b;
+            h.require = e(h);
+            var k = h,
+              l = h.restrict;
+            if (l && (!C(l) || !/[EACM]/.test(l))) throw $("badrestrict", l, b);
+            k.restrict = l || "EA";
+            h.$$moduleName = f.$$moduleName;
+            d.push(h)
+          } catch (m) {
+            c(m)
+          }
+        });
+        return d
+      }])), f[b].push(d)) : r(b, Zb(pa));
+      return this
+    };
+    this.component = function y(a, b) {
+      function c(a) {
+        function e(b) {
+          return B(b) || H(b) ? function(c, d) {
+              return a.invoke(b, this, {
+                $element: c,
+                $attrs: d
+              })
+            } :
+            b
+        }
+        var f = b.template || b.templateUrl ? b.template : "",
+          g = {
+            controller: d,
+            controllerAs: Gg(b.controller) || b.controllerAs || "$ctrl",
+            template: e(f),
+            templateUrl: e(b.templateUrl),
+            transclude: b.transclude,
+            scope: {},
+            bindToController: b.bindings || {},
+            restrict: "E",
+            require: b.require
+          };
+        r(b, function(a, b) {
+          "$" === b.charAt(0) && (g[b] = a)
+        });
+        return g
+      }
+      if (!C(a)) return r(a, Zb(Va(this, y))), this;
+      var d = b.controller || function() {};
+      r(b, function(a, b) {
+        "$" === b.charAt(0) && (c[b] = a, B(d) && (d[b] = a))
+      });
+      c.$inject = ["$injector"];
+      return this.directive(a,
+        c)
+    };
+    this.aHrefSanitizationTrustedUrlList = function(a) {
+      return w(a) ? (b.aHrefSanitizationTrustedUrlList(a), this) : b.aHrefSanitizationTrustedUrlList()
+    };
+    Object.defineProperty(this, "aHrefSanitizationWhitelist", {
+      get: function() {
+        return this.aHrefSanitizationTrustedUrlList
+      },
+      set: function(a) {
+        this.aHrefSanitizationTrustedUrlList = a
+      }
+    });
+    this.imgSrcSanitizationTrustedUrlList = function(a) {
+      return w(a) ? (b.imgSrcSanitizationTrustedUrlList(a), this) : b.imgSrcSanitizationTrustedUrlList()
+    };
+    Object.defineProperty(this, "imgSrcSanitizationWhitelist", {
+      get: function() {
+        return this.imgSrcSanitizationTrustedUrlList
+      },
+      set: function(a) {
+        this.imgSrcSanitizationTrustedUrlList = a
+      }
+    });
+    var n = !0;
+    this.debugInfoEnabled = function(a) {
+      return w(a) ? (n = a, this) : n
+    };
+    var s = !1;
+    this.strictComponentBindingsEnabled = function(a) {
+      return w(a) ? (s = a, this) : s
+    };
+    var G = 10;
+    this.onChangesTtl = function(a) {
+      return arguments.length ? (G = a, this) : G
+    };
+    var t = !0;
+    this.commentDirectivesEnabled = function(a) {
+      return arguments.length ? (t = a, this) : t
+    };
+    var N = !0;
+    this.cssClassDirectivesEnabled = function(a) {
+      return arguments.length ?
+        (N = a, this) : N
+    };
+    var v = T();
+    this.addPropertySecurityContext = function(a, b, c) {
+      var d = a.toLowerCase() + "|" + b.toLowerCase();
+      if (d in v && v[d] !== c) throw $("ctxoverride", a, b, v[d], c);
+      v[d] = c;
+      return this
+    };
+    (function() {
+      function a(b, c) {
+        r(c, function(a) {
+          v[a.toLowerCase()] = b
+        })
+      }
+      a(W.HTML, ["iframe|srcdoc", "*|innerHTML", "*|outerHTML"]);
+      a(W.CSS, ["*|style"]);
+      a(W.URL, "area|href area|ping a|href a|ping blockquote|cite body|background del|cite input|src ins|cite q|cite".split(" "));
+      a(W.MEDIA_URL, "audio|src img|src img|srcset source|src source|srcset track|src video|src video|poster".split(" "));
+      a(W.RESOURCE_URL, "*|formAction applet|code applet|codebase base|href embed|src frame|src form|action head|profile html|manifest iframe|src link|href media|src object|codebase object|data script|src".split(" "))
+    })();
+    this.$get = ["$injector", "$interpolate", "$exceptionHandler", "$templateRequest", "$parse", "$controller", "$rootScope", "$sce", "$animate", function(a, b, c, e, p, M, L, u, R) {
+      function q() {
+        try {
+          if (!--Ja) throw Ua = void 0, $("infchng", G);
+          L.$apply(function() {
+            for (var a = 0, b = Ua.length; a < b; ++a) try {
+              Ua[a]()
+            } catch (d) {
+              c(d)
+            }
+            Ua =
+              void 0
+          })
+        } finally {
+          Ja++
+        }
+      }
+
+      function ma(a, b) {
+        if (!a) return a;
+        if (!C(a)) throw $("srcset", b, a.toString());
+        for (var c = "", d = V(a), e = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/, e = /\s/.test(d) ? e : /(,)/, d = d.split(e), e = Math.floor(d.length / 2), f = 0; f < e; f++) var g = 2 * f,
+          c = c + u.getTrustedMediaUrl(V(d[g])),
+          c = c + (" " + V(d[g + 1]));
+        d = V(d[2 * f]).split(/\s/);
+        c += u.getTrustedMediaUrl(V(d[0]));
+        2 === d.length && (c += " " + V(d[1]));
+        return c
+      }
+
+      function w(a, b) {
+        if (b) {
+          var c = Object.keys(b),
+            d, e, f;
+          d = 0;
+          for (e = c.length; d < e; d++) f = c[d], this[f] = b[f]
+        } else this.$attr = {};
+        this.$$element = a
+      }
+
+      function O(a, b, c) {
+        Fa.innerHTML = "<span " + b + ">";
+        b = Fa.firstChild.attributes;
+        var d = b[0];
+        b.removeNamedItem(d.name);
+        d.value = c;
+        a.attributes.setNamedItem(d)
+      }
+
+      function sa(a, b) {
+        try {
+          a.addClass(b)
+        } catch (c) {}
+      }
+
+      function da(a, b, c, d, e) {
+        a instanceof x || (a = x(a));
+        var f = Xa(a, b, a, c, d, e);
+        da.$$addScopeClass(a);
+        var g = null;
+        return function(b, c, d) {
+          if (!a) throw $("multilink");
+          gb(b, "scope");
+          e && e.needsNewScope && (b = b.$parent.$new());
+          d = d || {};
+          var h = d.parentBoundTranscludeFn,
+            k = d.transcludeControllers;
+          d = d.futureParentElement;
+          h && h.$$boundTransclude && (h = h.$$boundTransclude);
+          g || (g = (d = d && d[0]) ? "foreignobject" !== ua(d) && la.call(d).match(/SVG/) ? "svg" : "html" : "html");
+          d = "html" !== g ? x(ja(g, x("<div></div>").append(a).html())) : c ? Wa.clone.call(a) : a;
+          if (k)
+            for (var l in k) d.data("$" + l + "Controller", k[l].instance);
+          da.$$addScopeInfo(d, b);
+          c && c(d, b);
+          f && f(b, d, d, h);
+          c || (a = f = null);
+          return d
+        }
+      }
+
+      function Xa(a, b, c, d, e, f) {
+        function g(a, c, d, e) {
+          var f, k, l, m, p, I, t;
+          if (n)
+            for (t = Array(c.length), m = 0; m < h.length; m += 3) f = h[m], t[f] = c[f];
+          else t = c;
+          m = 0;
+          for (p = h.length; m <
+            p;) k = t[h[m++]], c = h[m++], f = h[m++], c ? (c.scope ? (l = a.$new(), da.$$addScopeInfo(x(k), l)) : l = a, I = c.transcludeOnThisElement ? ka(a, c.transclude, e) : !c.templateOnThisElement && e ? e : !e && b ? ka(a, b) : null, c(f, l, k, d, I)) : f && f(a, k.childNodes, void 0, e)
+        }
+        for (var h = [], k = H(a) || a instanceof x, l, m, p, I, n, t = 0; t < a.length; t++) {
+          l = new w;
+          11 === wa && jb(a, t, k);
+          m = tc(a[t], [], l, 0 === t ? d : void 0, e);
+          (f = m.length ? aa(m, a[t], l, b, c, null, [], [], f) : null) && f.scope && da.$$addScopeClass(l.$$element);
+          l = f && f.terminal || !(p = a[t].childNodes) || !p.length ? null : Xa(p,
+            f ? (f.transcludeOnThisElement || !f.templateOnThisElement) && f.transclude : b);
+          if (f || l) h.push(t, f, l), I = !0, n = n || f;
+          f = null
+        }
+        return I ? g : null
+      }
+
+      function jb(a, b, c) {
+        var d = a[b],
+          e = d.parentNode,
+          f;
+        if (d.nodeType === Pa)
+          for (;;) {
+            f = e ? d.nextSibling : a[b + 1];
+            if (!f || f.nodeType !== Pa) break;
+            d.nodeValue += f.nodeValue;
+            f.parentNode && f.parentNode.removeChild(f);
+            c && f === a[b + 1] && a.splice(b + 1, 1)
+          }
+      }
+
+      function ka(a, b, c) {
+        function d(e, f, g, h, k) {
+          e || (e = a.$new(!1, k), e.$$transcluded = !0);
+          return b(e, f, {
+            parentBoundTranscludeFn: c,
+            transcludeControllers: g,
+            futureParentElement: h
+          })
+        }
+        var e = d.$$slots = T(),
+          f;
+        for (f in b.$$slots) e[f] = b.$$slots[f] ? ka(a, b.$$slots[f], c) : null;
+        return d
+      }
+
+      function tc(a, b, d, e, f) {
+        var g = d.$attr,
+          h;
+        switch (a.nodeType) {
+          case 1:
+            h = ua(a);
+            Y(b, xa(h), "E", e, f);
+            for (var l, m, n, t, J, s = a.attributes, v = 0, G = s && s.length; v < G; v++) {
+              var P = !1,
+                N = !1,
+                r = !1,
+                y = !1,
+                u = !1,
+                M;
+              l = s[v];
+              m = l.name;
+              t = l.value;
+              n = xa(m.toLowerCase());
+              (J = n.match(Ra)) ? (r = "Attr" === J[1], y = "Prop" === J[1], u = "On" === J[1], m = m.replace(rd, "").toLowerCase().substr(4 + J[1].length).replace(/_(.)/g, function(a, b) {
+                return b.toUpperCase()
+              })) :
+              (M = n.match(Sa)) && ca(M[1]) && (P = m, N = m.substr(0, m.length - 5) + "end", m = m.substr(0, m.length - 6));
+              if (y || u) d[n] = t, g[n] = l.name, y ? Ea(a, b, n, m) : b.push(sd(p, L, c, n, m, !1));
+              else {
+                n = xa(m.toLowerCase());
+                g[n] = m;
+                if (r || !d.hasOwnProperty(n)) d[n] = t, nd(a, n) && (d[n] = !0);
+                Ia(a, b, t, n, r);
+                Y(b, n, "A", e, f, P, N)
+              }
+            }
+            "input" === h && "hidden" === a.getAttribute("type") && a.setAttribute("autocomplete", "off");
+            if (!Qa) break;
+            g = a.className;
+            D(g) && (g = g.animVal);
+            if (C(g) && "" !== g)
+              for (; a = k.exec(g);) n = xa(a[2]), Y(b, n, "C", e, f) && (d[n] = V(a[3])), g = g.substr(a.index +
+                a[0].length);
+            break;
+          case Pa:
+            na(b, a.nodeValue);
+            break;
+          case 8:
+            if (!Oa) break;
+            F(a, b, d, e, f)
+        }
+        b.sort(ia);
+        return b
+      }
+
+      function F(a, b, c, d, e) {
+        try {
+          var f = g.exec(a.nodeValue);
+          if (f) {
+            var h = xa(f[1]);
+            Y(b, h, "M", d, e) && (c[h] = V(f[2]))
+          }
+        } catch (k) {}
+      }
+
+      function U(a, b, c) {
+        var d = [],
+          e = 0;
+        if (b && a.hasAttribute && a.hasAttribute(b)) {
+          do {
+            if (!a) throw $("uterdir", b, c);
+            1 === a.nodeType && (a.hasAttribute(b) && e++, a.hasAttribute(c) && e--);
+            d.push(a);
+            a = a.nextSibling
+          } while (0 < e)
+        } else d.push(a);
+        return x(d)
+      }
+
+      function W(a, b, c) {
+        return function(d, e, f, g, h) {
+          e = U(e[0],
+            b, c);
+          return a(d, e, f, g, h)
+        }
+      }
+
+      function Z(a, b, c, d, e, f) {
+        var g;
+        return a ? da(b, c, d, e, f) : function() {
+          g || (g = da(b, c, d, e, f), b = c = f = null);
+          return g.apply(this, arguments)
+        }
+      }
+
+      function aa(a, b, d, e, f, g, h, k, l) {
+        function m(a, b, c, d) {
+          if (a) {
+            c && (a = W(a, c, d));
+            a.require = u.require;
+            a.directiveName = Q;
+            if (s === u || u.$$isolateScope) a = Ba(a, {
+              isolateScope: !0
+            });
+            h.push(a)
+          }
+          if (b) {
+            c && (b = W(b, c, d));
+            b.require = u.require;
+            b.directiveName = Q;
+            if (s === u || u.$$isolateScope) b = Ba(b, {
+              isolateScope: !0
+            });
+            k.push(b)
+          }
+        }
+
+        function p(a, e, f, g, l) {
+          function m(a, b, c, d) {
+            var e;
+            bb(a) ||
+              (d = c, c = b, b = a, a = void 0);
+            N && (e = P);
+            c || (c = N ? Q.parent() : Q);
+            if (d) {
+              var f = l.$$slots[d];
+              if (f) return f(a, b, e, c, R);
+              if (A(f)) throw $("noslot", d, Aa(Q));
+            } else return l(a, b, e, c, R)
+          }
+          var n, u, L, y, G, P, M, Q;
+          b === f ? (g = d, Q = d.$$element) : (Q = x(f), g = new w(Q, d));
+          G = e;
+          s ? y = e.$new(!0) : t && (G = e.$parent);
+          l && (M = m, M.$$boundTransclude = l, M.isSlotFilled = function(a) {
+            return !!l.$$slots[a]
+          });
+          J && (P = ea(Q, g, M, J, y, e, s));
+          s && (da.$$addScopeInfo(Q, y, !0, !(v && (v === s || v === s.$$originalDirective))), da.$$addScopeClass(Q, !0), y.$$isolateBindings = s.$$isolateBindings,
+            u = Da(e, g, y, y.$$isolateBindings, s), u.removeWatches && y.$on("$destroy", u.removeWatches));
+          for (n in P) {
+            u = J[n];
+            L = P[n];
+            var Hg = u.$$bindings.bindToController;
+            L.instance = L();
+            Q.data("$" + u.name + "Controller", L.instance);
+            L.bindingInfo = Da(G, g, L.instance, Hg, u)
+          }
+          r(J, function(a, b) {
+            var c = a.require;
+            a.bindToController && !H(c) && D(c) && S(P[b].instance, X(b, c, Q, P))
+          });
+          r(P, function(a) {
+            var b = a.instance;
+            if (B(b.$onChanges)) try {
+              b.$onChanges(a.bindingInfo.initialChanges)
+            } catch (d) {
+              c(d)
+            }
+            if (B(b.$onInit)) try {
+              b.$onInit()
+            } catch (e) {
+              c(e)
+            }
+            B(b.$doCheck) &&
+              (G.$watch(function() {
+                b.$doCheck()
+              }), b.$doCheck());
+            B(b.$onDestroy) && G.$on("$destroy", function() {
+              b.$onDestroy()
+            })
+          });
+          n = 0;
+          for (u = h.length; n < u; n++) L = h[n], Ca(L, L.isolateScope ? y : e, Q, g, L.require && X(L.directiveName, L.require, Q, P), M);
+          var R = e;
+          s && (s.template || null === s.templateUrl) && (R = y);
+          a && a(R, f.childNodes, void 0, l);
+          for (n = k.length - 1; 0 <= n; n--) L = k[n], Ca(L, L.isolateScope ? y : e, Q, g, L.require && X(L.directiveName, L.require, Q, P), M);
+          r(P, function(a) {
+            a = a.instance;
+            B(a.$postLink) && a.$postLink()
+          })
+        }
+        l = l || {};
+        for (var n = -Number.MAX_VALUE,
+            t = l.newScopeDirective, J = l.controllerDirectives, s = l.newIsolateScopeDirective, v = l.templateDirective, L = l.nonTlbTranscludeDirective, G = !1, P = !1, N = l.hasElementTranscludeDirective, y = d.$$element = x(b), u, Q, M, R = e, q, ma = !1, Jb = !1, O, sa = 0, C = a.length; sa < C; sa++) {
+          u = a[sa];
+          var E = u.$$start,
+            jb = u.$$end;
+          E && (y = U(b, E, jb));
+          M = void 0;
+          if (n > u.priority) break;
+          if (O = u.scope) u.templateUrl || (D(O) ? (ba("new/isolated scope", s || t, u, y), s = u) : ba("new/isolated scope", s, u, y)), t = t || u;
+          Q = u.name;
+          if (!ma && (u.replace && (u.templateUrl || u.template) || u.transclude &&
+              !u.$$tlb)) {
+            for (O = sa + 1; ma = a[O++];)
+              if (ma.transclude && !ma.$$tlb || ma.replace && (ma.templateUrl || ma.template)) {
+                Jb = !0;
+                break
+              } ma = !0
+          }!u.templateUrl && u.controller && (J = J || T(), ba("'" + Q + "' controller", J[Q], u, y), J[Q] = u);
+          if (O = u.transclude)
+            if (G = !0, u.$$tlb || (ba("transclusion", L, u, y), L = u), "element" === O) N = !0, n = u.priority, M = y, y = d.$$element = x(da.$$createComment(Q, d[Q])), b = y[0], oa(f, Ha.call(M, 0), b), R = Z(Jb, M, e, n, g && g.name, {
+              nonTlbTranscludeDirective: L
+            });
+            else {
+              var ka = T();
+              if (D(O)) {
+                M = z.document.createDocumentFragment();
+                var Xa =
+                  T(),
+                  F = T();
+                r(O, function(a, b) {
+                  var c = "?" === a.charAt(0);
+                  a = c ? a.substring(1) : a;
+                  Xa[a] = b;
+                  ka[b] = null;
+                  F[b] = c
+                });
+                r(y.contents(), function(a) {
+                  var b = Xa[xa(ua(a))];
+                  b ? (F[b] = !0, ka[b] = ka[b] || z.document.createDocumentFragment(), ka[b].appendChild(a)) : M.appendChild(a)
+                });
+                r(F, function(a, b) {
+                  if (!a) throw $("reqslot", b);
+                });
+                for (var K in ka) ka[K] && (R = x(ka[K].childNodes), ka[K] = Z(Jb, R, e));
+                M = x(M.childNodes)
+              } else M = x(qc(b)).contents();
+              y.empty();
+              R = Z(Jb, M, e, void 0, void 0, {
+                needsNewScope: u.$$isolateScope || u.$$newScope
+              });
+              R.$$slots = ka
+            } if (u.template)
+            if (P = !0, ba("template", v, u, y), v = u, O = B(u.template) ? u.template(y, d) : u.template, O = Na(O), u.replace) {
+              g = u;
+              M = nc.test(O) ? td(ja(u.templateNamespace, V(O))) : [];
+              b = M[0];
+              if (1 !== M.length || 1 !== b.nodeType) throw $("tplrt", Q, "");
+              oa(f, y, b);
+              C = {
+                $attr: {}
+              };
+              O = tc(b, [], C);
+              var Ig = a.splice(sa + 1, a.length - (sa + 1));
+              (s || t) && fa(O, s, t);
+              a = a.concat(O).concat(Ig);
+              ga(d, C);
+              C = a.length
+            } else y.html(O);
+          if (u.templateUrl) P = !0, ba("template", v, u, y), v = u, u.replace && (g = u), p = ha(a.splice(sa, a.length - sa), y, d, f, G && R, h, k, {
+            controllerDirectives: J,
+            newScopeDirective: t !==
+              u && t,
+            newIsolateScopeDirective: s,
+            templateDirective: v,
+            nonTlbTranscludeDirective: L
+          }), C = a.length;
+          else if (u.compile) try {
+            q = u.compile(y, d, R);
+            var Y = u.$$originalDirective || u;
+            B(q) ? m(null, Va(Y, q), E, jb) : q && m(Va(Y, q.pre), Va(Y, q.post), E, jb)
+          } catch (ca) {
+            c(ca, Aa(y))
+          }
+          u.terminal && (p.terminal = !0, n = Math.max(n, u.priority))
+        }
+        p.scope = t && !0 === t.scope;
+        p.transcludeOnThisElement = G;
+        p.templateOnThisElement = P;
+        p.transclude = R;
+        l.hasElementTranscludeDirective = N;
+        return p
+      }
+
+      function X(a, b, c, d) {
+        var e;
+        if (C(b)) {
+          var f = b.match(l);
+          b = b.substring(f[0].length);
+          var g = f[1] || f[3],
+            f = "?" === f[2];
+          "^^" === g ? c = c.parent() : e = (e = d && d[b]) && e.instance;
+          if (!e) {
+            var h = "$" + b + "Controller";
+            e = "^^" === g && c[0] && 9 === c[0].nodeType ? null : g ? c.inheritedData(h) : c.data(h)
+          }
+          if (!e && !f) throw $("ctreq", b, a);
+        } else if (H(b))
+          for (e = [], g = 0, f = b.length; g < f; g++) e[g] = X(a, b[g], c, d);
+        else D(b) && (e = {}, r(b, function(b, f) {
+          e[f] = X(a, b, c, d)
+        }));
+        return e || null
+      }
+
+      function ea(a, b, c, d, e, f, g) {
+        var h = T(),
+          k;
+        for (k in d) {
+          var l = d[k],
+            m = {
+              $scope: l === g || l.$$isolateScope ? e : f,
+              $element: a,
+              $attrs: b,
+              $transclude: c
+            },
+            p = l.controller;
+          "@" ===
+          p && (p = b[l.name]);
+          m = M(p, m, !0, l.controllerAs);
+          h[l.name] = m;
+          a.data("$" + l.name + "Controller", m.instance)
+        }
+        return h
+      }
+
+      function fa(a, b, c) {
+        for (var d = 0, e = a.length; d < e; d++) a[d] = bc(a[d], {
+          $$isolateScope: b,
+          $$newScope: c
+        })
+      }
+
+      function Y(b, c, e, g, h, k, l) {
+        if (c === h) return null;
+        var m = null;
+        if (f.hasOwnProperty(c)) {
+          h = a.get(c + "Directive");
+          for (var p = 0, n = h.length; p < n; p++)
+            if (c = h[p], (A(g) || g > c.priority) && -1 !== c.restrict.indexOf(e)) {
+              k && (c = bc(c, {
+                $$start: k,
+                $$end: l
+              }));
+              if (!c.$$bindings) {
+                var I = m = c,
+                  t = c.name,
+                  u = {
+                    isolateScope: null,
+                    bindToController: null
+                  };
+                D(I.scope) && (!0 === I.bindToController ? (u.bindToController = d(I.scope, t, !0), u.isolateScope = {}) : u.isolateScope = d(I.scope, t, !1));
+                D(I.bindToController) && (u.bindToController = d(I.bindToController, t, !0));
+                if (u.bindToController && !I.controller) throw $("noctrl", t);
+                m = m.$$bindings = u;
+                D(m.isolateScope) && (c.$$isolateBindings = m.isolateScope)
+              }
+              b.push(c);
+              m = c
+            }
+        }
+        return m
+      }
+
+      function ca(b) {
+        if (f.hasOwnProperty(b))
+          for (var c = a.get(b + "Directive"), d = 0, e = c.length; d < e; d++)
+            if (b = c[d], b.multiElement) return !0;
+        return !1
+      }
+
+      function ga(a, b) {
+        var c =
+          b.$attr,
+          d = a.$attr;
+        r(a, function(d, e) {
+          "$" !== e.charAt(0) && (b[e] && b[e] !== d && (d = d.length ? d + (("style" === e ? ";" : " ") + b[e]) : b[e]), a.$set(e, d, !0, c[e]))
+        });
+        r(b, function(b, e) {
+          a.hasOwnProperty(e) || "$" === e.charAt(0) || (a[e] = b, "class" !== e && "style" !== e && (d[e] = c[e]))
+        })
+      }
+
+      function ha(a, b, d, f, g, h, k, l) {
+        var m = [],
+          p, n, t = b[0],
+          u = a.shift(),
+          J = bc(u, {
+            templateUrl: null,
+            transclude: null,
+            replace: null,
+            $$originalDirective: u
+          }),
+          s = B(u.templateUrl) ? u.templateUrl(b, d) : u.templateUrl,
+          L = u.templateNamespace;
+        b.empty();
+        e(s).then(function(c) {
+          var e,
+            I;
+          c = Na(c);
+          if (u.replace) {
+            c = nc.test(c) ? td(ja(L, V(c))) : [];
+            e = c[0];
+            if (1 !== c.length || 1 !== e.nodeType) throw $("tplrt", u.name, s);
+            c = {
+              $attr: {}
+            };
+            oa(f, b, e);
+            var v = tc(e, [], c);
+            D(u.scope) && fa(v, !0);
+            a = v.concat(a);
+            ga(d, c)
+          } else e = t, b.html(c);
+          a.unshift(J);
+          p = aa(a, e, d, g, b, u, h, k, l);
+          r(f, function(a, c) {
+            a === e && (f[c] = b[0])
+          });
+          for (n = Xa(b[0].childNodes, g); m.length;) {
+            c = m.shift();
+            I = m.shift();
+            var y = m.shift(),
+              P = m.shift(),
+              v = b[0];
+            if (!c.$$destroyed) {
+              if (I !== t) {
+                var G = I.className;
+                l.hasElementTranscludeDirective && u.replace || (v = qc(e));
+                oa(y,
+                  x(I), v);
+                sa(x(v), G)
+              }
+              I = p.transcludeOnThisElement ? ka(c, p.transclude, P) : P;
+              p(n, c, v, f, I)
+            }
+          }
+          m = null
+        }).catch(function(a) {
+          dc(a) && c(a)
+        });
+        return function(a, b, c, d, e) {
+          a = e;
+          b.$$destroyed || (m ? m.push(b, c, d, a) : (p.transcludeOnThisElement && (a = ka(b, p.transclude, e)), p(n, b, c, d, a)))
+        }
+      }
+
+      function ia(a, b) {
+        var c = b.priority - a.priority;
+        return 0 !== c ? c : a.name !== b.name ? a.name < b.name ? -1 : 1 : a.index - b.index
+      }
+
+      function ba(a, b, c, d) {
+        function e(a) {
+          return a ? " (module: " + a + ")" : ""
+        }
+        if (b) throw $("multidir", b.name, e(b.$$moduleName), c.name, e(c.$$moduleName),
+          a, Aa(d));
+      }
+
+      function na(a, c) {
+        var d = b(c, !0);
+        d && a.push({
+          priority: 0,
+          compile: function(a) {
+            a = a.parent();
+            var b = !!a.length;
+            b && da.$$addBindingClass(a);
+            return function(a, c) {
+              var e = c.parent();
+              b || da.$$addBindingClass(e);
+              da.$$addBindingInfo(e, d.expressions);
+              a.$watch(d, function(a) {
+                c[0].nodeValue = a
+              })
+            }
+          }
+        })
+      }
+
+      function ja(a, b) {
+        a = K(a || "html");
+        switch (a) {
+          case "svg":
+          case "math":
+            var c = z.document.createElement("div");
+            c.innerHTML = "<" + a + ">" + b + "</" + a + ">";
+            return c.childNodes[0].childNodes;
+          default:
+            return b
+        }
+      }
+
+      function qa(a, b) {
+        if ("srcdoc" ===
+          b) return u.HTML;
+        if ("src" === b || "ngSrc" === b) return -1 === ["img", "video", "audio", "source", "track"].indexOf(a) ? u.RESOURCE_URL : u.MEDIA_URL;
+        if ("xlinkHref" === b) return "image" === a ? u.MEDIA_URL : "a" === a ? u.URL : u.RESOURCE_URL;
+        if ("form" === a && "action" === b || "base" === a && "href" === b || "link" === a && "href" === b) return u.RESOURCE_URL;
+        if ("a" === a && ("href" === b || "ngHref" === b)) return u.URL
+      }
+
+      function ya(a, b) {
+        var c = b.toLowerCase();
+        return v[a + "|" + c] || v["*|" + c]
+      }
+
+      function za(a) {
+        return ma(u.valueOf(a), "ng-prop-srcset")
+      }
+
+      function Ea(a, b, c,
+        d) {
+        if (m.test(d)) throw $("nodomevents");
+        a = ua(a);
+        var e = ya(a, d),
+          f = Ta;
+        "srcset" !== d || "img" !== a && "source" !== a ? e && (f = u.getTrusted.bind(u, e)) : f = za;
+        b.push({
+          priority: 100,
+          compile: function(a, b) {
+            var e = p(b[c]),
+              g = p(b[c], function(a) {
+                return u.valueOf(a)
+              });
+            return {
+              pre: function(a, b) {
+                function c() {
+                  var g = e(a);
+                  b[0][d] = f(g)
+                }
+                c();
+                a.$watch(g, c)
+              }
+            }
+          }
+        })
+      }
+
+      function Ia(a, c, d, e, f) {
+        var g = ua(a),
+          k = qa(g, e),
+          l = h[e] || f,
+          p = b(d, !f, k, l);
+        if (p) {
+          if ("multiple" === e && "select" === g) throw $("selmulti", Aa(a));
+          if (m.test(e)) throw $("nodomevents");
+          c.push({
+            priority: 100,
+            compile: function() {
+              return {
+                pre: function(a, c, f) {
+                  c = f.$$observers || (f.$$observers = T());
+                  var g = f[e];
+                  g !== d && (p = g && b(g, !0, k, l), d = g);
+                  p && (f[e] = p(a), (c[e] || (c[e] = [])).$$inter = !0, (f.$$observers && f.$$observers[e].$$scope || a).$watch(p, function(a, b) {
+                    "class" === e && a !== b ? f.$updateClass(a, b) : f.$set(e, a)
+                  }))
+                }
+              }
+            }
+          })
+        }
+      }
+
+      function oa(a, b, c) {
+        var d = b[0],
+          e = b.length,
+          f = d.parentNode,
+          g, h;
+        if (a)
+          for (g = 0, h = a.length; g < h; g++)
+            if (a[g] === d) {
+              a[g++] = c;
+              h = g + e - 1;
+              for (var k = a.length; g < k; g++, h++) h < k ? a[g] = a[h] : delete a[g];
+              a.length -= e - 1;
+              a.context === d &&
+                (a.context = c);
+              break
+            } f && f.replaceChild(c, d);
+        a = z.document.createDocumentFragment();
+        for (g = 0; g < e; g++) a.appendChild(b[g]);
+        x.hasData(d) && (x.data(c, x.data(d)), x(d).off("$destroy"));
+        x.cleanData(a.querySelectorAll("*"));
+        for (g = 1; g < e; g++) delete b[g];
+        b[0] = c;
+        b.length = 1
+      }
+
+      function Ba(a, b) {
+        return S(function() {
+          return a.apply(null, arguments)
+        }, a, b)
+      }
+
+      function Ca(a, b, d, e, f, g) {
+        try {
+          a(b, d, e, f, g)
+        } catch (h) {
+          c(h, Aa(d))
+        }
+      }
+
+      function ra(a, b) {
+        if (s) throw $("missingattr", a, b);
+      }
+
+      function Da(a, c, d, e, f) {
+        function g(b, c, e) {
+          B(d.$onChanges) &&
+            !ec(c, e) && (Ua || (a.$$postDigest(q), Ua = []), m || (m = {}, Ua.push(h)), m[b] && (e = m[b].previousValue), m[b] = new Kb(e, c))
+        }
+
+        function h() {
+          d.$onChanges(m);
+          m = void 0
+        }
+        var k = [],
+          l = {},
+          m;
+        r(e, function(e, h) {
+          var m = e.attrName,
+            n = e.optional,
+            I, t, u, s;
+          switch (e.mode) {
+            case "@":
+              n || ta.call(c, m) || (ra(m, f.name), d[h] = c[m] = void 0);
+              n = c.$observe(m, function(a) {
+                if (C(a) || Ga(a)) g(h, a, d[h]), d[h] = a
+              });
+              c.$$observers[m].$$scope = a;
+              I = c[m];
+              C(I) ? d[h] = b(I)(a) : Ga(I) && (d[h] = I);
+              l[h] = new Kb(uc, d[h]);
+              k.push(n);
+              break;
+            case "=":
+              if (!ta.call(c, m)) {
+                if (n) break;
+                ra(m,
+                  f.name);
+                c[m] = void 0
+              }
+              if (n && !c[m]) break;
+              t = p(c[m]);
+              s = t.literal ? va : ec;
+              u = t.assign || function() {
+                I = d[h] = t(a);
+                throw $("nonassign", c[m], m, f.name);
+              };
+              I = d[h] = t(a);
+              n = function(b) {
+                s(b, d[h]) || (s(b, I) ? u(a, b = d[h]) : d[h] = b);
+                return I = b
+              };
+              n.$stateful = !0;
+              n = e.collection ? a.$watchCollection(c[m], n) : a.$watch(p(c[m], n), null, t.literal);
+              k.push(n);
+              break;
+            case "<":
+              if (!ta.call(c, m)) {
+                if (n) break;
+                ra(m, f.name);
+                c[m] = void 0
+              }
+              if (n && !c[m]) break;
+              t = p(c[m]);
+              var v = t.literal,
+                L = d[h] = t(a);
+              l[h] = new Kb(uc, d[h]);
+              n = a[e.collection ? "$watchCollection" : "$watch"](t,
+                function(a, b) {
+                  if (b === a) {
+                    if (b === L || v && va(b, L)) return;
+                    b = L
+                  }
+                  g(h, a, b);
+                  d[h] = a
+                });
+              k.push(n);
+              break;
+            case "&":
+              n || ta.call(c, m) || ra(m, f.name);
+              t = c.hasOwnProperty(m) ? p(c[m]) : E;
+              if (t === E && n) break;
+              d[h] = function(b) {
+                return t(a, b)
+              }
+          }
+        });
+        return {
+          initialChanges: l,
+          removeWatches: k.length && function() {
+            for (var a = 0, b = k.length; a < b; ++a) k[a]()
+          }
+        }
+      }
+      var Ma = /^\w/,
+        Fa = z.document.createElement("div"),
+        Oa = t,
+        Qa = N,
+        Ja = G,
+        Ua;
+      w.prototype = {
+        $normalize: xa,
+        $addClass: function(a) {
+          a && 0 < a.length && R.addClass(this.$$element, a)
+        },
+        $removeClass: function(a) {
+          a &&
+            0 < a.length && R.removeClass(this.$$element, a)
+        },
+        $updateClass: function(a, b) {
+          var c = ud(a, b);
+          c && c.length && R.addClass(this.$$element, c);
+          (c = ud(b, a)) && c.length && R.removeClass(this.$$element, c)
+        },
+        $set: function(a, b, d, e) {
+          var f = nd(this.$$element[0], a),
+            g = vd[a],
+            h = a;
+          f ? (this.$$element.prop(a, b), e = f) : g && (this[g] = b, h = g);
+          this[a] = b;
+          e ? this.$attr[a] = e : (e = this.$attr[a]) || (this.$attr[a] = e = Xc(a, "-"));
+          "img" === ua(this.$$element) && "srcset" === a && (this[a] = b = ma(b, "$set('srcset', value)"));
+          !1 !== d && (null === b || A(b) ? this.$$element.removeAttr(e) :
+            Ma.test(e) ? f && !1 === b ? this.$$element.removeAttr(e) : this.$$element.attr(e, b) : O(this.$$element[0], e, b));
+          (a = this.$$observers) && r(a[h], function(a) {
+            try {
+              a(b)
+            } catch (d) {
+              c(d)
+            }
+          })
+        },
+        $observe: function(a, b) {
+          var c = this,
+            d = c.$$observers || (c.$$observers = T()),
+            e = d[a] || (d[a] = []);
+          e.push(b);
+          L.$evalAsync(function() {
+            e.$$inter || !c.hasOwnProperty(a) || A(c[a]) || b(c[a])
+          });
+          return function() {
+            cb(e, b)
+          }
+        }
+      };
+      var Ka = b.startSymbol(),
+        La = b.endSymbol(),
+        Na = "{{" === Ka && "}}" === La ? Ta : function(a) {
+          return a.replace(/\{\{/g, Ka).replace(/}}/g, La)
+        },
+        Ra =
+        /^ng(Attr|Prop|On)([A-Z].*)$/,
+        Sa = /^(.+)Start$/;
+      da.$$addBindingInfo = n ? function(a, b) {
+        var c = a.data("$binding") || [];
+        H(b) ? c = c.concat(b) : c.push(b);
+        a.data("$binding", c)
+      } : E;
+      da.$$addBindingClass = n ? function(a) {
+        sa(a, "ng-binding")
+      } : E;
+      da.$$addScopeInfo = n ? function(a, b, c, d) {
+        a.data(c ? d ? "$isolateScopeNoTemplate" : "$isolateScope" : "$scope", b)
+      } : E;
+      da.$$addScopeClass = n ? function(a, b) {
+        sa(a, b ? "ng-isolate-scope" : "ng-scope")
+      } : E;
+      da.$$createComment = function(a, b) {
+        var c = "";
+        n && (c = " " + (a || "") + ": ", b && (c += b + " "));
+        return z.document.createComment(c)
+      };
+      return da
+    }]
+  }
+
+  function Kb(a, b) {
+    this.previousValue = a;
+    this.currentValue = b
+  }
+
+  function xa(a) {
+    return a.replace(rd, "").replace(Jg, function(a, d, c) {
+      return c ? d.toUpperCase() : d
+    })
+  }
+
+  function ud(a, b) {
+    var d = "",
+      c = a.split(/\s+/),
+      e = b.split(/\s+/),
+      f = 0;
+    a: for (; f < c.length; f++) {
+      for (var g = c[f], k = 0; k < e.length; k++)
+        if (g === e[k]) continue a;
+      d += (0 < d.length ? " " : "") + g
+    }
+    return d
+  }
+
+  function td(a) {
+    a = x(a);
+    var b = a.length;
+    if (1 >= b) return a;
+    for (; b--;) {
+      var d = a[b];
+      (8 === d.nodeType || d.nodeType === Pa && "" === d.nodeValue.trim()) && Kg.call(a, b, 1)
+    }
+    return a
+  }
+
+  function Gg(a, b) {
+    if (b && C(b)) return b;
+    if (C(a)) {
+      var d = wd.exec(a);
+      if (d) return d[3]
+    }
+  }
+
+  function Kf() {
+    var a = {};
+    this.has = function(b) {
+      return a.hasOwnProperty(b)
+    };
+    this.register = function(b, d) {
+      Ja(b, "controller");
+      D(b) ? S(a, b) : a[b] = d
+    };
+    this.$get = ["$injector", function(b) {
+      function d(a, b, d, g) {
+        if (!a || !D(a.$scope)) throw F("$controller")("noscp", g, b);
+        a.$scope[b] = d
+      }
+      return function(c, e, f, g) {
+        var k, h, l;
+        f = !0 === f;
+        g && C(g) && (l = g);
+        if (C(c)) {
+          g = c.match(wd);
+          if (!g) throw xd("ctrlfmt", c);
+          h = g[1];
+          l = l || g[3];
+          c = a.hasOwnProperty(h) ? a[h] : Le(e.$scope,
+            h, !0);
+          if (!c) throw xd("ctrlreg", h);
+          tb(c, h, !0)
+        }
+        if (f) return f = (H(c) ? c[c.length - 1] : c).prototype, k = Object.create(f || null), l && d(e, l, k, h || c.name), S(function() {
+          var a = b.invoke(c, k, e, h);
+          a !== k && (D(a) || B(a)) && (k = a, l && d(e, l, k, h || c.name));
+          return k
+        }, {
+          instance: k,
+          identifier: l
+        });
+        k = b.instantiate(c, e, h);
+        l && d(e, l, k, h || c.name);
+        return k
+      }
+    }]
+  }
+
+  function Lf() {
+    this.$get = ["$window", function(a) {
+      return x(a.document)
+    }]
+  }
+
+  function Mf() {
+    this.$get = ["$document", "$rootScope", function(a, b) {
+      function d() {
+        e = c.hidden
+      }
+      var c = a[0],
+        e = c && c.hidden;
+      a.on("visibilitychange", d);
+      b.$on("$destroy", function() {
+        a.off("visibilitychange", d)
+      });
+      return function() {
+        return e
+      }
+    }]
+  }
+
+  function Nf() {
+    this.$get = ["$log", function(a) {
+      return function(b, d) {
+        a.error.apply(a, arguments)
+      }
+    }]
+  }
+
+  function vc(a) {
+    return D(a) ? ha(a) ? a.toISOString() : eb(a) : a
+  }
+
+  function Tf() {
+    this.$get = function() {
+      return function(a) {
+        if (!a) return "";
+        var b = [];
+        Qc(a, function(a, c) {
+          null === a || A(a) || B(a) || (H(a) ? r(a, function(a) {
+            b.push(ba(c) + "=" + ba(vc(a)))
+          }) : b.push(ba(c) + "=" + ba(vc(a))))
+        });
+        return b.join("&")
+      }
+    }
+  }
+
+  function Uf() {
+    this.$get =
+      function() {
+        return function(a) {
+          function b(a, e, f) {
+            H(a) ? r(a, function(a, c) {
+              b(a, e + "[" + (D(a) ? c : "") + "]")
+            }) : D(a) && !ha(a) ? Qc(a, function(a, c) {
+              b(a, e + (f ? "" : "[") + c + (f ? "" : "]"))
+            }) : (B(a) && (a = a()), d.push(ba(e) + "=" + (null == a ? "" : ba(vc(a)))))
+          }
+          if (!a) return "";
+          var d = [];
+          b(a, "", !0);
+          return d.join("&")
+        }
+      }
+  }
+
+  function wc(a, b) {
+    if (C(a)) {
+      var d = a.replace(Lg, "").trim();
+      if (d) {
+        var c = b("Content-Type"),
+          c = c && 0 === c.indexOf(yd),
+          e;
+        (e = c) || (e = (e = d.match(Mg)) && Ng[e[0]].test(d));
+        if (e) try {
+          a = Tc(d)
+        } catch (f) {
+          if (!c) return a;
+          throw Lb("baddata", a, f);
+        }
+      }
+    }
+    return a
+  }
+
+  function zd(a) {
+    var b = T(),
+      d;
+    C(a) ? r(a.split("\n"), function(a) {
+      d = a.indexOf(":");
+      var e = K(V(a.substr(0, d)));
+      a = V(a.substr(d + 1));
+      e && (b[e] = b[e] ? b[e] + ", " + a : a)
+    }) : D(a) && r(a, function(a, d) {
+      var f = K(d),
+        g = V(a);
+      f && (b[f] = b[f] ? b[f] + ", " + g : g)
+    });
+    return b
+  }
+
+  function Ad(a) {
+    var b;
+    return function(d) {
+      b || (b = zd(a));
+      return d ? (d = b[K(d)], void 0 === d && (d = null), d) : b
+    }
+  }
+
+  function Bd(a, b, d, c) {
+    if (B(c)) return c(a, b, d);
+    r(c, function(c) {
+      a = c(a, b, d)
+    });
+    return a
+  }
+
+  function Sf() {
+    var a = this.defaults = {
+        transformResponse: [wc],
+        transformRequest: [function(a) {
+          return D(a) &&
+            "[object File]" !== la.call(a) && "[object Blob]" !== la.call(a) && "[object FormData]" !== la.call(a) ? eb(a) : a
+        }],
+        headers: {
+          common: {
+            Accept: "application/json, text/plain, */*"
+          },
+          post: ja(xc),
+          put: ja(xc),
+          patch: ja(xc)
+        },
+        xsrfCookieName: "XSRF-TOKEN",
+        xsrfHeaderName: "X-XSRF-TOKEN",
+        paramSerializer: "$httpParamSerializer",
+        jsonpCallbackParam: "callback"
+      },
+      b = !1;
+    this.useApplyAsync = function(a) {
+      return w(a) ? (b = !!a, this) : b
+    };
+    var d = this.interceptors = [],
+      c = this.xsrfTrustedOrigins = [];
+    Object.defineProperty(this, "xsrfWhitelistedOrigins", {
+      get: function() {
+        return this.xsrfTrustedOrigins
+      },
+      set: function(a) {
+        this.xsrfTrustedOrigins = a
+      }
+    });
+    this.$get = ["$browser", "$httpBackend", "$$cookieReader", "$cacheFactory", "$rootScope", "$q", "$injector", "$sce", function(e, f, g, k, h, l, m, p) {
+      function n(b) {
+        function c(a, b) {
+          for (var d = 0, e = b.length; d < e;) {
+            var f = b[d++],
+              g = b[d++];
+            a = a.then(f, g)
+          }
+          b.length = 0;
+          return a
+        }
+
+        function d(a, b) {
+          var c, e = {};
+          r(a, function(a, d) {
+            B(a) ? (c = a(b), null != c && (e[d] = c)) : e[d] = a
+          });
+          return e
+        }
+
+        function f(a) {
+          var b = S({}, a);
+          b.data = Bd(a.data, a.headers, a.status, g.transformResponse);
+          a = a.status;
+          return 200 <= a && 300 > a ? b : l.reject(b)
+        }
+        if (!D(b)) throw F("$http")("badreq", b);
+        if (!C(p.valueOf(b.url))) throw F("$http")("badreq", b.url);
+        var g = S({
+          method: "get",
+          transformRequest: a.transformRequest,
+          transformResponse: a.transformResponse,
+          paramSerializer: a.paramSerializer,
+          jsonpCallbackParam: a.jsonpCallbackParam
+        }, b);
+        g.headers = function(b) {
+          var c = a.headers,
+            e = S({}, b.headers),
+            f, g, h, c = S({}, c.common, c[K(b.method)]);
+          a: for (f in c) {
+            g = K(f);
+            for (h in e)
+              if (K(h) === g) continue a;
+            e[f] = c[f]
+          }
+          return d(e, ja(b))
+        }(b);
+        g.method =
+          vb(g.method);
+        g.paramSerializer = C(g.paramSerializer) ? m.get(g.paramSerializer) : g.paramSerializer;
+        e.$$incOutstandingRequestCount("$http");
+        var h = [],
+          k = [];
+        b = l.resolve(g);
+        r(v, function(a) {
+          (a.request || a.requestError) && h.unshift(a.request, a.requestError);
+          (a.response || a.responseError) && k.push(a.response, a.responseError)
+        });
+        b = c(b, h);
+        b = b.then(function(b) {
+          var c = b.headers,
+            d = Bd(b.data, Ad(c), void 0, b.transformRequest);
+          A(d) && r(c, function(a, b) {
+            "content-type" === K(b) && delete c[b]
+          });
+          A(b.withCredentials) && !A(a.withCredentials) &&
+            (b.withCredentials = a.withCredentials);
+          return s(b, d).then(f, f)
+        });
+        b = c(b, k);
+        return b = b.finally(function() {
+          e.$$completeOutstandingRequest(E, "$http")
+        })
+      }
+
+      function s(c, d) {
+        function e(a) {
+          if (a) {
+            var c = {};
+            r(a, function(a, d) {
+              c[d] = function(c) {
+                function d() {
+                  a(c)
+                }
+                b ? h.$applyAsync(d) : h.$$phase ? d() : h.$apply(d)
+              }
+            });
+            return c
+          }
+        }
+
+        function k(a, c, d, e, f) {
+          function g() {
+            m(c, a, d, e, f)
+          }
+          R && (200 <= a && 300 > a ? R.put(O, [a, c, zd(d), e, f]) : R.remove(O));
+          b ? h.$applyAsync(g) : (g(), h.$$phase || h.$apply())
+        }
+
+        function m(a, b, d, e, f) {
+          b = -1 <= b ? b : 0;
+          (200 <= b && 300 >
+            b ? L.resolve : L.reject)({
+            data: a,
+            status: b,
+            headers: Ad(d),
+            config: c,
+            statusText: e,
+            xhrStatus: f
+          })
+        }
+
+        function s(a) {
+          m(a.data, a.status, ja(a.headers()), a.statusText, a.xhrStatus)
+        }
+
+        function v() {
+          var a = n.pendingRequests.indexOf(c); - 1 !== a && n.pendingRequests.splice(a, 1)
+        }
+        var L = l.defer(),
+          u = L.promise,
+          R, q, ma = c.headers,
+          x = "jsonp" === K(c.method),
+          O = c.url;
+        x ? O = p.getTrustedResourceUrl(O) : C(O) || (O = p.valueOf(O));
+        O = G(O, c.paramSerializer(c.params));
+        x && (O = t(O, c.jsonpCallbackParam));
+        n.pendingRequests.push(c);
+        u.then(v, v);
+        !c.cache && !a.cache ||
+          !1 === c.cache || "GET" !== c.method && "JSONP" !== c.method || (R = D(c.cache) ? c.cache : D(a.cache) ? a.cache : N);
+        R && (q = R.get(O), w(q) ? q && B(q.then) ? q.then(s, s) : H(q) ? m(q[1], q[0], ja(q[2]), q[3], q[4]) : m(q, 200, {}, "OK", "complete") : R.put(O, u));
+        A(q) && ((q = kc(c.url) ? g()[c.xsrfCookieName || a.xsrfCookieName] : void 0) && (ma[c.xsrfHeaderName || a.xsrfHeaderName] = q), f(c.method, O, d, k, ma, c.timeout, c.withCredentials, c.responseType, e(c.eventHandlers), e(c.uploadEventHandlers)));
+        return u
+      }
+
+      function G(a, b) {
+        0 < b.length && (a += (-1 === a.indexOf("?") ?
+          "?" : "&") + b);
+        return a
+      }
+
+      function t(a, b) {
+        var c = a.split("?");
+        if (2 < c.length) throw Lb("badjsonp", a);
+        c = hc(c[1]);
+        r(c, function(c, d) {
+          if ("JSON_CALLBACK" === c) throw Lb("badjsonp", a);
+          if (d === b) throw Lb("badjsonp", b, a);
+        });
+        return a += (-1 === a.indexOf("?") ? "?" : "&") + b + "=JSON_CALLBACK"
+      }
+      var N = k("$http");
+      a.paramSerializer = C(a.paramSerializer) ? m.get(a.paramSerializer) : a.paramSerializer;
+      var v = [];
+      r(d, function(a) {
+        v.unshift(C(a) ? m.get(a) : m.invoke(a))
+      });
+      var kc = Og(c);
+      n.pendingRequests = [];
+      (function(a) {
+        r(arguments, function(a) {
+          n[a] =
+            function(b, c) {
+              return n(S({}, c || {}, {
+                method: a,
+                url: b
+              }))
+            }
+        })
+      })("get", "delete", "head", "jsonp");
+      (function(a) {
+        r(arguments, function(a) {
+          n[a] = function(b, c, d) {
+            return n(S({}, d || {}, {
+              method: a,
+              url: b,
+              data: c
+            }))
+          }
+        })
+      })("post", "put", "patch");
+      n.defaults = a;
+      return n
+    }]
+  }
+
+  function Wf() {
+    this.$get = function() {
+      return function() {
+        return new z.XMLHttpRequest
+      }
+    }
+  }
+
+  function Vf() {
+    this.$get = ["$browser", "$jsonpCallbacks", "$document", "$xhrFactory", function(a, b, d, c) {
+      return Pg(a, c, a.defer, b, d[0])
+    }]
+  }
+
+  function Pg(a, b, d, c, e) {
+    function f(a, b, d) {
+      a = a.replace("JSON_CALLBACK",
+        b);
+      var f = e.createElement("script"),
+        m = null;
+      f.type = "text/javascript";
+      f.src = a;
+      f.async = !0;
+      m = function(a) {
+        f.removeEventListener("load", m);
+        f.removeEventListener("error", m);
+        e.body.removeChild(f);
+        f = null;
+        var g = -1,
+          s = "unknown";
+        a && ("load" !== a.type || c.wasCalled(b) || (a = {
+          type: "error"
+        }), s = a.type, g = "error" === a.type ? 404 : 200);
+        d && d(g, s)
+      };
+      f.addEventListener("load", m);
+      f.addEventListener("error", m);
+      e.body.appendChild(f);
+      return m
+    }
+    return function(e, k, h, l, m, p, n, s, G, t) {
+      function N(a) {
+        J = "timeout" === a;
+        pa && pa();
+        y && y.abort()
+      }
+
+      function v(a,
+        b, c, e, f, g) {
+        w(P) && d.cancel(P);
+        pa = y = null;
+        a(b, c, e, f, g)
+      }
+      k = k || a.url();
+      if ("jsonp" === K(e)) var q = c.createCallback(k),
+        pa = f(k, q, function(a, b) {
+          var d = 200 === a && c.getResponse(q);
+          v(l, a, d, "", b, "complete");
+          c.removeCallback(q)
+        });
+      else {
+        var y = b(e, k),
+          J = !1;
+        y.open(e, k, !0);
+        r(m, function(a, b) {
+          w(a) && y.setRequestHeader(b, a)
+        });
+        y.onload = function() {
+          var a = y.statusText || "",
+            b = "response" in y ? y.response : y.responseText,
+            c = 1223 === y.status ? 204 : y.status;
+          0 === c && (c = b ? 200 : "file" === ga(k).protocol ? 404 : 0);
+          v(l, c, b, y.getAllResponseHeaders(), a, "complete")
+        };
+        y.onerror = function() {
+          v(l, -1, null, null, "", "error")
+        };
+        y.ontimeout = function() {
+          v(l, -1, null, null, "", "timeout")
+        };
+        y.onabort = function() {
+          v(l, -1, null, null, "", J ? "timeout" : "abort")
+        };
+        r(G, function(a, b) {
+          y.addEventListener(b, a)
+        });
+        r(t, function(a, b) {
+          y.upload.addEventListener(b, a)
+        });
+        n && (y.withCredentials = !0);
+        if (s) try {
+          y.responseType = s
+        } catch (I) {
+          if ("json" !== s) throw I;
+        }
+        y.send(A(h) ? null : h)
+      }
+      if (0 < p) var P = d(function() {
+        N("timeout")
+      }, p);
+      else p && B(p.then) && p.then(function() {
+        N(w(p.$$timeoutId) ? "timeout" : "abort")
+      })
+    }
+  }
+
+  function Pf() {
+    var a =
+      "{{",
+      b = "}}";
+    this.startSymbol = function(b) {
+      return b ? (a = b, this) : a
+    };
+    this.endSymbol = function(a) {
+      return a ? (b = a, this) : b
+    };
+    this.$get = ["$parse", "$exceptionHandler", "$sce", function(d, c, e) {
+      function f(a) {
+        return "\\\\\\" + a
+      }
+
+      function g(c) {
+        return c.replace(p, a).replace(n, b)
+      }
+
+      function k(a, b, c, d) {
+        var e = a.$watch(function(a) {
+          e();
+          return d(a)
+        }, b, c);
+        return e
+      }
+
+      function h(f, h, n, p) {
+        function v(a) {
+          try {
+            return a = n && !r ? e.getTrusted(n, a) : e.valueOf(a), p && !w(a) ? a : jc(a)
+          } catch (b) {
+            c(Ma.interr(f, b))
+          }
+        }
+        var r = n === e.URL || n === e.MEDIA_URL;
+        if (!f.length ||
+          -1 === f.indexOf(a)) {
+          if (h) return;
+          h = g(f);
+          r && (h = e.getTrusted(n, h));
+          h = ia(h);
+          h.exp = f;
+          h.expressions = [];
+          h.$$watchDelegate = k;
+          return h
+        }
+        p = !!p;
+        for (var q, y, J = 0, I = [], P, Q = f.length, M = [], L = [], u; J < Q;)
+          if (-1 !== (q = f.indexOf(a, J)) && -1 !== (y = f.indexOf(b, q + l))) J !== q && M.push(g(f.substring(J, q))), J = f.substring(q + l, y), I.push(J), J = y + m, L.push(M.length), M.push("");
+          else {
+            J !== Q && M.push(g(f.substring(J)));
+            break
+          } u = 1 === M.length && 1 === L.length;
+        var R = r && u ? void 0 : v;
+        P = I.map(function(a) {
+          return d(a, R)
+        });
+        if (!h || I.length) {
+          var x = function(a) {
+            for (var b =
+                0, c = I.length; b < c; b++) {
+              if (p && A(a[b])) return;
+              M[L[b]] = a[b]
+            }
+            if (r) return e.getTrusted(n, u ? M[0] : M.join(""));
+            n && 1 < M.length && Ma.throwNoconcat(f);
+            return M.join("")
+          };
+          return S(function(a) {
+            var b = 0,
+              d = I.length,
+              e = Array(d);
+            try {
+              for (; b < d; b++) e[b] = P[b](a);
+              return x(e)
+            } catch (g) {
+              c(Ma.interr(f, g))
+            }
+          }, {
+            exp: f,
+            expressions: I,
+            $$watchDelegate: function(a, b) {
+              var c;
+              return a.$watchGroup(P, function(d, e) {
+                var f = x(d);
+                b.call(this, f, d !== e ? c : f, a);
+                c = f
+              })
+            }
+          })
+        }
+      }
+      var l = a.length,
+        m = b.length,
+        p = new RegExp(a.replace(/./g, f), "g"),
+        n = new RegExp(b.replace(/./g,
+          f), "g");
+      h.startSymbol = function() {
+        return a
+      };
+      h.endSymbol = function() {
+        return b
+      };
+      return h
+    }]
+  }
+
+  function Qf() {
+    this.$get = ["$$intervalFactory", "$window", function(a, b) {
+      var d = {},
+        c = function(a) {
+          b.clearInterval(a);
+          delete d[a]
+        },
+        e = a(function(a, c, e) {
+          a = b.setInterval(a, c);
+          d[a] = e;
+          return a
+        }, c);
+      e.cancel = function(a) {
+        if (!a) return !1;
+        if (!a.hasOwnProperty("$$intervalId")) throw Qg("badprom");
+        if (!d.hasOwnProperty(a.$$intervalId)) return !1;
+        a = a.$$intervalId;
+        var b = d[a],
+          e = b.promise;
+        e.$$state && (e.$$state.pur = !0);
+        b.reject("canceled");
+        c(a);
+        return !0
+      };
+      return e
+    }]
+  }
+
+  function Rf() {
+    this.$get = ["$browser", "$q", "$$q", "$rootScope", function(a, b, d, c) {
+      return function(e, f) {
+        return function(g, k, h, l) {
+          function m() {
+            p ? g.apply(null, n) : g(s)
+          }
+          var p = 4 < arguments.length,
+            n = p ? Ha.call(arguments, 4) : [],
+            s = 0,
+            G = w(l) && !l,
+            t = (G ? d : b).defer(),
+            r = t.promise;
+          h = w(h) ? h : 0;
+          r.$$intervalId = e(function() {
+            G ? a.defer(m) : c.$evalAsync(m);
+            t.notify(s++);
+            0 < h && s >= h && (t.resolve(s), f(r.$$intervalId));
+            G || c.$apply()
+          }, k, t, G);
+          return r
+        }
+      }
+    }]
+  }
+
+  function Cd(a, b) {
+    var d = ga(a);
+    b.$$protocol = d.protocol;
+    b.$$host =
+      d.hostname;
+    b.$$port = fa(d.port) || Rg[d.protocol] || null
+  }
+
+  function Dd(a, b, d) {
+    if (Sg.test(a)) throw kb("badpath", a);
+    var c = "/" !== a.charAt(0);
+    c && (a = "/" + a);
+    a = ga(a);
+    for (var c = (c && "/" === a.pathname.charAt(0) ? a.pathname.substring(1) : a.pathname).split("/"), e = c.length; e--;) c[e] = decodeURIComponent(c[e]), d && (c[e] = c[e].replace(/\//g, "%2F"));
+    d = c.join("/");
+    b.$$path = d;
+    b.$$search = hc(a.search);
+    b.$$hash = decodeURIComponent(a.hash);
+    b.$$path && "/" !== b.$$path.charAt(0) && (b.$$path = "/" + b.$$path)
+  }
+
+  function yc(a, b) {
+    return a.slice(0,
+      b.length) === b
+  }
+
+  function ya(a, b) {
+    if (yc(b, a)) return b.substr(a.length)
+  }
+
+  function Da(a) {
+    var b = a.indexOf("#");
+    return -1 === b ? a : a.substr(0, b)
+  }
+
+  function zc(a, b, d) {
+    this.$$html5 = !0;
+    d = d || "";
+    Cd(a, this);
+    this.$$parse = function(a) {
+      var d = ya(b, a);
+      if (!C(d)) throw kb("ipthprfx", a, b);
+      Dd(d, this, !0);
+      this.$$path || (this.$$path = "/");
+      this.$$compose()
+    };
+    this.$$normalizeUrl = function(a) {
+      return b + a.substr(1)
+    };
+    this.$$parseLinkUrl = function(c, e) {
+      if (e && "#" === e[0]) return this.hash(e.slice(1)), !0;
+      var f, g;
+      w(f = ya(a, c)) ? (g = f, g = d && w(f = ya(d, f)) ?
+        b + (ya("/", f) || f) : a + g) : w(f = ya(b, c)) ? g = b + f : b === c + "/" && (g = b);
+      g && this.$$parse(g);
+      return !!g
+    }
+  }
+
+  function Ac(a, b, d) {
+    Cd(a, this);
+    this.$$parse = function(c) {
+      var e = ya(a, c) || ya(b, c),
+        f;
+      A(e) || "#" !== e.charAt(0) ? this.$$html5 ? f = e : (f = "", A(e) && (a = c, this.replace())) : (f = ya(d, e), A(f) && (f = e));
+      Dd(f, this, !1);
+      c = this.$$path;
+      var e = a,
+        g = /^\/[A-Z]:(\/.*)/;
+      yc(f, e) && (f = f.replace(e, ""));
+      g.exec(f) || (c = (f = g.exec(c)) ? f[1] : c);
+      this.$$path = c;
+      this.$$compose()
+    };
+    this.$$normalizeUrl = function(b) {
+      return a + (b ? d + b : "")
+    };
+    this.$$parseLinkUrl = function(b,
+      d) {
+      return Da(a) === Da(b) ? (this.$$parse(b), !0) : !1
+    }
+  }
+
+  function Ed(a, b, d) {
+    this.$$html5 = !0;
+    Ac.apply(this, arguments);
+    this.$$parseLinkUrl = function(c, e) {
+      if (e && "#" === e[0]) return this.hash(e.slice(1)), !0;
+      var f, g;
+      a === Da(c) ? f = c : (g = ya(b, c)) ? f = a + d + g : b === c + "/" && (f = b);
+      f && this.$$parse(f);
+      return !!f
+    };
+    this.$$normalizeUrl = function(b) {
+      return a + d + b
+    }
+  }
+
+  function Mb(a) {
+    return function() {
+      return this[a]
+    }
+  }
+
+  function Fd(a, b) {
+    return function(d) {
+      if (A(d)) return this[a];
+      this[a] = b(d);
+      this.$$compose();
+      return this
+    }
+  }
+
+  function Yf() {
+    var a = "!",
+      b = {
+        enabled: !1,
+        requireBase: !0,
+        rewriteLinks: !0
+      };
+    this.hashPrefix = function(b) {
+      return w(b) ? (a = b, this) : a
+    };
+    this.html5Mode = function(a) {
+      if (Ga(a)) return b.enabled = a, this;
+      if (D(a)) {
+        Ga(a.enabled) && (b.enabled = a.enabled);
+        Ga(a.requireBase) && (b.requireBase = a.requireBase);
+        if (Ga(a.rewriteLinks) || C(a.rewriteLinks)) b.rewriteLinks = a.rewriteLinks;
+        return this
+      }
+      return b
+    };
+    this.$get = ["$rootScope", "$browser", "$sniffer", "$rootElement", "$window", function(d, c, e, f, g) {
+      function k(a, b) {
+        return a === b || ga(a).href === ga(b).href
+      }
+
+      function h(a,
+        b, d) {
+        var e = m.url(),
+          f = m.$$state;
+        try {
+          c.url(a, b, d), m.$$state = c.state()
+        } catch (g) {
+          throw m.url(e), m.$$state = f, g;
+        }
+      }
+
+      function l(a, b) {
+        d.$broadcast("$locationChangeSuccess", m.absUrl(), a, m.$$state, b)
+      }
+      var m, p;
+      p = c.baseHref();
+      var n = c.url(),
+        s;
+      if (b.enabled) {
+        if (!p && b.requireBase) throw kb("nobase");
+        s = n.substring(0, n.indexOf("/", n.indexOf("//") + 2)) + (p || "/");
+        p = e.history ? zc : Ed
+      } else s = Da(n), p = Ac;
+      var r = s.substr(0, Da(s).lastIndexOf("/") + 1);
+      m = new p(s, r, "#" + a);
+      m.$$parseLinkUrl(n, n);
+      m.$$state = c.state();
+      var t = /^\s*(javascript|mailto):/i;
+      f.on("click", function(a) {
+        var e = b.rewriteLinks;
+        if (e && !a.ctrlKey && !a.metaKey && !a.shiftKey && 2 !== a.which && 2 !== a.button) {
+          for (var g = x(a.target);
+            "a" !== ua(g[0]);)
+            if (g[0] === f[0] || !(g = g.parent())[0]) return;
+          if (!C(e) || !A(g.attr(e))) {
+            var e = g.prop("href"),
+              h = g.attr("href") || g.attr("xlink:href");
+            D(e) && "[object SVGAnimatedString]" === e.toString() && (e = ga(e.animVal).href);
+            t.test(e) || !e || g.attr("target") || a.isDefaultPrevented() || !m.$$parseLinkUrl(e, h) || (a.preventDefault(), m.absUrl() !== c.url() && d.$apply())
+          }
+        }
+      });
+      m.absUrl() !==
+        n && c.url(m.absUrl(), !0);
+      var N = !0;
+      c.onUrlChange(function(a, b) {
+        yc(a, r) ? (d.$evalAsync(function() {
+          var c = m.absUrl(),
+            e = m.$$state,
+            f;
+          m.$$parse(a);
+          m.$$state = b;
+          f = d.$broadcast("$locationChangeStart", a, c, b, e).defaultPrevented;
+          m.absUrl() === a && (f ? (m.$$parse(c), m.$$state = e, h(c, !1, e)) : (N = !1, l(c, e)))
+        }), d.$$phase || d.$digest()) : g.location.href = a
+      });
+      d.$watch(function() {
+        if (N || m.$$urlUpdatedByLocation) {
+          m.$$urlUpdatedByLocation = !1;
+          var a = c.url(),
+            b = m.absUrl(),
+            f = c.state(),
+            g = m.$$replace,
+            n = !k(a, b) || m.$$html5 && e.history && f !==
+            m.$$state;
+          if (N || n) N = !1, d.$evalAsync(function() {
+            var b = m.absUrl(),
+              c = d.$broadcast("$locationChangeStart", b, a, m.$$state, f).defaultPrevented;
+            m.absUrl() === b && (c ? (m.$$parse(a), m.$$state = f) : (n && h(b, g, f === m.$$state ? null : m.$$state), l(a, f)))
+          })
+        }
+        m.$$replace = !1
+      });
+      return m
+    }]
+  }
+
+  function Zf() {
+    var a = !0,
+      b = this;
+    this.debugEnabled = function(b) {
+      return w(b) ? (a = b, this) : a
+    };
+    this.$get = ["$window", function(d) {
+      function c(a) {
+        dc(a) && (a.stack && f ? a = a.message && -1 === a.stack.indexOf(a.message) ? "Error: " + a.message + "\n" + a.stack : a.stack : a.sourceURL &&
+          (a = a.message + "\n" + a.sourceURL + ":" + a.line));
+        return a
+      }
+
+      function e(a) {
+        var b = d.console || {},
+          e = b[a] || b.log || E;
+        return function() {
+          var a = [];
+          r(arguments, function(b) {
+            a.push(c(b))
+          });
+          return Function.prototype.apply.call(e, b, a)
+        }
+      }
+      var f = wa || /\bEdge\//.test(d.navigator && d.navigator.userAgent);
+      return {
+        log: e("log"),
+        info: e("info"),
+        warn: e("warn"),
+        error: e("error"),
+        debug: function() {
+          var c = e("debug");
+          return function() {
+            a && c.apply(b, arguments)
+          }
+        }()
+      }
+    }]
+  }
+
+  function Tg(a) {
+    return a + ""
+  }
+
+  function Ug(a, b) {
+    return "undefined" !== typeof a ? a :
+      b
+  }
+
+  function Gd(a, b) {
+    return "undefined" === typeof a ? b : "undefined" === typeof b ? a : a + b
+  }
+
+  function Vg(a, b) {
+    switch (a.type) {
+      case q.MemberExpression:
+        if (a.computed) return !1;
+        break;
+      case q.UnaryExpression:
+        return 1;
+      case q.BinaryExpression:
+        return "+" !== a.operator ? 1 : !1;
+      case q.CallExpression:
+        return !1
+    }
+    return void 0 === b ? Hd : b
+  }
+
+  function Z(a, b, d) {
+    var c, e, f = a.isPure = Vg(a, d);
+    switch (a.type) {
+      case q.Program:
+        c = !0;
+        r(a.body, function(a) {
+          Z(a.expression, b, f);
+          c = c && a.expression.constant
+        });
+        a.constant = c;
+        break;
+      case q.Literal:
+        a.constant = !0;
+        a.toWatch = [];
+        break;
+      case q.UnaryExpression:
+        Z(a.argument, b, f);
+        a.constant = a.argument.constant;
+        a.toWatch = a.argument.toWatch;
+        break;
+      case q.BinaryExpression:
+        Z(a.left, b, f);
+        Z(a.right, b, f);
+        a.constant = a.left.constant && a.right.constant;
+        a.toWatch = a.left.toWatch.concat(a.right.toWatch);
+        break;
+      case q.LogicalExpression:
+        Z(a.left, b, f);
+        Z(a.right, b, f);
+        a.constant = a.left.constant && a.right.constant;
+        a.toWatch = a.constant ? [] : [a];
+        break;
+      case q.ConditionalExpression:
+        Z(a.test, b, f);
+        Z(a.alternate, b, f);
+        Z(a.consequent, b, f);
+        a.constant = a.test.constant &&
+          a.alternate.constant && a.consequent.constant;
+        a.toWatch = a.constant ? [] : [a];
+        break;
+      case q.Identifier:
+        a.constant = !1;
+        a.toWatch = [a];
+        break;
+      case q.MemberExpression:
+        Z(a.object, b, f);
+        a.computed && Z(a.property, b, f);
+        a.constant = a.object.constant && (!a.computed || a.property.constant);
+        a.toWatch = a.constant ? [] : [a];
+        break;
+      case q.CallExpression:
+        c = d = a.filter ? !b(a.callee.name).$stateful : !1;
+        e = [];
+        r(a.arguments, function(a) {
+          Z(a, b, f);
+          c = c && a.constant;
+          e.push.apply(e, a.toWatch)
+        });
+        a.constant = c;
+        a.toWatch = d ? e : [a];
+        break;
+      case q.AssignmentExpression:
+        Z(a.left,
+          b, f);
+        Z(a.right, b, f);
+        a.constant = a.left.constant && a.right.constant;
+        a.toWatch = [a];
+        break;
+      case q.ArrayExpression:
+        c = !0;
+        e = [];
+        r(a.elements, function(a) {
+          Z(a, b, f);
+          c = c && a.constant;
+          e.push.apply(e, a.toWatch)
+        });
+        a.constant = c;
+        a.toWatch = e;
+        break;
+      case q.ObjectExpression:
+        c = !0;
+        e = [];
+        r(a.properties, function(a) {
+          Z(a.value, b, f);
+          c = c && a.value.constant;
+          e.push.apply(e, a.value.toWatch);
+          a.computed && (Z(a.key, b, !1), c = c && a.key.constant, e.push.apply(e, a.key.toWatch))
+        });
+        a.constant = c;
+        a.toWatch = e;
+        break;
+      case q.ThisExpression:
+        a.constant = !1;
+        a.toWatch = [];
+        break;
+      case q.LocalsExpression:
+        a.constant = !1, a.toWatch = []
+    }
+  }
+
+  function Id(a) {
+    if (1 === a.length) {
+      a = a[0].expression;
+      var b = a.toWatch;
+      return 1 !== b.length ? b : b[0] !== a ? b : void 0
+    }
+  }
+
+  function Jd(a) {
+    return a.type === q.Identifier || a.type === q.MemberExpression
+  }
+
+  function Kd(a) {
+    if (1 === a.body.length && Jd(a.body[0].expression)) return {
+      type: q.AssignmentExpression,
+      left: a.body[0].expression,
+      right: {
+        type: q.NGValueParameter
+      },
+      operator: "="
+    }
+  }
+
+  function Ld(a) {
+    this.$filter = a
+  }
+
+  function Md(a) {
+    this.$filter = a
+  }
+
+  function Nb(a, b, d) {
+    this.ast =
+      new q(a, d);
+    this.astCompiler = d.csp ? new Md(b) : new Ld(b)
+  }
+
+  function Bc(a) {
+    return B(a.valueOf) ? a.valueOf() : Wg.call(a)
+  }
+
+  function $f() {
+    var a = T(),
+      b = {
+        "true": !0,
+        "false": !1,
+        "null": null,
+        undefined: void 0
+      },
+      d, c;
+    this.addLiteral = function(a, c) {
+      b[a] = c
+    };
+    this.setIdentifierFns = function(a, b) {
+      d = a;
+      c = b;
+      return this
+    };
+    this.$get = ["$filter", function(e) {
+      function f(b, c) {
+        var d, f;
+        switch (typeof b) {
+          case "string":
+            return f = b = b.trim(), d = a[f], d || (d = new Ob(G), d = (new Nb(d, e, G)).parse(b), a[f] = p(d)), s(d, c);
+          case "function":
+            return s(b, c);
+          default:
+            return s(E,
+              c)
+        }
+      }
+
+      function g(a, b, c) {
+        return null == a || null == b ? a === b : "object" !== typeof a || (a = Bc(a), "object" !== typeof a || c) ? a === b || a !== a && b !== b : !1
+      }
+
+      function k(a, b, c, d, e) {
+        var f = d.inputs,
+          h;
+        if (1 === f.length) {
+          var k = g,
+            f = f[0];
+          return a.$watch(function(a) {
+            var b = f(a);
+            g(b, k, f.isPure) || (h = d(a, void 0, void 0, [b]), k = b && Bc(b));
+            return h
+          }, b, c, e)
+        }
+        for (var l = [], m = [], n = 0, p = f.length; n < p; n++) l[n] = g, m[n] = null;
+        return a.$watch(function(a) {
+          for (var b = !1, c = 0, e = f.length; c < e; c++) {
+            var k = f[c](a);
+            if (b || (b = !g(k, l[c], f[c].isPure))) m[c] = k, l[c] = k && Bc(k)
+          }
+          b &&
+            (h = d(a, void 0, void 0, m));
+          return h
+        }, b, c, e)
+      }
+
+      function h(a, b, c, d, e) {
+        function f() {
+          h(m) && k()
+        }
+
+        function g(a, b, c, d) {
+          m = u && d ? d[0] : n(a, b, c, d);
+          h(m) && a.$$postDigest(f);
+          return s(m)
+        }
+        var h = d.literal ? l : w,
+          k, m, n = d.$$intercepted || d,
+          s = d.$$interceptor || Ta,
+          u = d.inputs && !n.inputs;
+        g.literal = d.literal;
+        g.constant = d.constant;
+        g.inputs = d.inputs;
+        p(g);
+        return k = a.$watch(g, b, c, e)
+      }
+
+      function l(a) {
+        var b = !0;
+        r(a, function(a) {
+          w(a) || (b = !1)
+        });
+        return b
+      }
+
+      function m(a, b, c, d) {
+        var e = a.$watch(function(a) {
+          e();
+          return d(a)
+        }, b, c);
+        return e
+      }
+
+      function p(a) {
+        a.constant ?
+          a.$$watchDelegate = m : a.oneTime ? a.$$watchDelegate = h : a.inputs && (a.$$watchDelegate = k);
+        return a
+      }
+
+      function n(a, b) {
+        function c(d) {
+          return b(a(d))
+        }
+        c.$stateful = a.$stateful || b.$stateful;
+        c.$$pure = a.$$pure && b.$$pure;
+        return c
+      }
+
+      function s(a, b) {
+        if (!b) return a;
+        a.$$interceptor && (b = n(a.$$interceptor, b), a = a.$$intercepted);
+        var c = !1,
+          d = function(d, e, f, g) {
+            d = c && g ? g[0] : a(d, e, f, g);
+            return b(d)
+          };
+        d.$$intercepted = a;
+        d.$$interceptor = b;
+        d.literal = a.literal;
+        d.oneTime = a.oneTime;
+        d.constant = a.constant;
+        b.$stateful || (c = !a.inputs, d.inputs = a.inputs ?
+          a.inputs : [a], b.$$pure || (d.inputs = d.inputs.map(function(a) {
+            return a.isPure === Hd ? function(b) {
+              return a(b)
+            } : a
+          })));
+        return p(d)
+      }
+      var G = {
+        csp: Ba().noUnsafeEval,
+        literals: Ia(b),
+        isIdentifierStart: B(d) && d,
+        isIdentifierContinue: B(c) && c
+      };
+      f.$$getAst = function(a) {
+        var b = new Ob(G);
+        return (new Nb(b, e, G)).getAst(a).ast
+      };
+      return f
+    }]
+  }
+
+  function bg() {
+    var a = !0;
+    this.$get = ["$rootScope", "$exceptionHandler", function(b, d) {
+      return Nd(function(a) {
+        b.$evalAsync(a)
+      }, d, a)
+    }];
+    this.errorOnUnhandledRejections = function(b) {
+      return w(b) ? (a = b, this) :
+        a
+    }
+  }
+
+  function cg() {
+    var a = !0;
+    this.$get = ["$browser", "$exceptionHandler", function(b, d) {
+      return Nd(function(a) {
+        b.defer(a)
+      }, d, a)
+    }];
+    this.errorOnUnhandledRejections = function(b) {
+      return w(b) ? (a = b, this) : a
+    }
+  }
+
+  function Nd(a, b, d) {
+    function c() {
+      return new e
+    }
+
+    function e() {
+      var a = this.promise = new f;
+      this.resolve = function(b) {
+        h(a, b)
+      };
+      this.reject = function(b) {
+        m(a, b)
+      };
+      this.notify = function(b) {
+        n(a, b)
+      }
+    }
+
+    function f() {
+      this.$$state = {
+        status: 0
+      }
+    }
+
+    function g() {
+      for (; !w && x.length;) {
+        var a = x.shift();
+        if (!a.pur) {
+          a.pur = !0;
+          var c = a.value,
+            c = "Possibly unhandled rejection: " +
+            ("function" === typeof c ? c.toString().replace(/ \{[\s\S]*$/, "") : A(c) ? "undefined" : "string" !== typeof c ? Ne(c, void 0) : c);
+          dc(a.value) ? b(a.value, c) : b(c)
+        }
+      }
+    }
+
+    function k(c) {
+      !d || c.pending || 2 !== c.status || c.pur || (0 === w && 0 === x.length && a(g), x.push(c));
+      !c.processScheduled && c.pending && (c.processScheduled = !0, ++w, a(function() {
+        var e, f, k;
+        k = c.pending;
+        c.processScheduled = !1;
+        c.pending = void 0;
+        try {
+          for (var l = 0, n = k.length; l < n; ++l) {
+            c.pur = !0;
+            f = k[l][0];
+            e = k[l][c.status];
+            try {
+              B(e) ? h(f, e(c.value)) : 1 === c.status ? h(f, c.value) : m(f, c.value)
+            } catch (p) {
+              m(f,
+                p), p && !0 === p.$$passToExceptionHandler && b(p)
+            }
+          }
+        } finally {
+          --w, d && 0 === w && a(g)
+        }
+      }))
+    }
+
+    function h(a, b) {
+      a.$$state.status || (b === a ? p(a, v("qcycle", b)) : l(a, b))
+    }
+
+    function l(a, b) {
+      function c(b) {
+        g || (g = !0, l(a, b))
+      }
+
+      function d(b) {
+        g || (g = !0, p(a, b))
+      }
+
+      function e(b) {
+        n(a, b)
+      }
+      var f, g = !1;
+      try {
+        if (D(b) || B(b)) f = b.then;
+        B(f) ? (a.$$state.status = -1, f.call(b, c, d, e)) : (a.$$state.value = b, a.$$state.status = 1, k(a.$$state))
+      } catch (h) {
+        d(h)
+      }
+    }
+
+    function m(a, b) {
+      a.$$state.status || p(a, b)
+    }
+
+    function p(a, b) {
+      a.$$state.value = b;
+      a.$$state.status = 2;
+      k(a.$$state)
+    }
+
+    function n(c,
+      d) {
+      var e = c.$$state.pending;
+      0 >= c.$$state.status && e && e.length && a(function() {
+        for (var a, c, f = 0, g = e.length; f < g; f++) {
+          c = e[f][0];
+          a = e[f][3];
+          try {
+            n(c, B(a) ? a(d) : d)
+          } catch (h) {
+            b(h)
+          }
+        }
+      })
+    }
+
+    function s(a) {
+      var b = new f;
+      m(b, a);
+      return b
+    }
+
+    function G(a, b, c) {
+      var d = null;
+      try {
+        B(c) && (d = c())
+      } catch (e) {
+        return s(e)
+      }
+      return d && B(d.then) ? d.then(function() {
+        return b(a)
+      }, s) : b(a)
+    }
+
+    function t(a, b, c, d) {
+      var e = new f;
+      h(e, a);
+      return e.then(b, c, d)
+    }
+
+    function q(a) {
+      if (!B(a)) throw v("norslvr", a);
+      var b = new f;
+      a(function(a) {
+        h(b, a)
+      }, function(a) {
+        m(b, a)
+      });
+      return b
+    }
+    var v = F("$q", TypeError),
+      w = 0,
+      x = [];
+    S(f.prototype, {
+      then: function(a, b, c) {
+        if (A(a) && A(b) && A(c)) return this;
+        var d = new f;
+        this.$$state.pending = this.$$state.pending || [];
+        this.$$state.pending.push([d, a, b, c]);
+        0 < this.$$state.status && k(this.$$state);
+        return d
+      },
+      "catch": function(a) {
+        return this.then(null, a)
+      },
+      "finally": function(a, b) {
+        return this.then(function(b) {
+          return G(b, y, a)
+        }, function(b) {
+          return G(b, s, a)
+        }, b)
+      }
+    });
+    var y = t;
+    q.prototype = f.prototype;
+    q.defer = c;
+    q.reject = s;
+    q.when = t;
+    q.resolve = y;
+    q.all = function(a) {
+      var b = new f,
+        c =
+        0,
+        d = H(a) ? [] : {};
+      r(a, function(a, e) {
+        c++;
+        t(a).then(function(a) {
+          d[e] = a;
+          --c || h(b, d)
+        }, function(a) {
+          m(b, a)
+        })
+      });
+      0 === c && h(b, d);
+      return b
+    };
+    q.race = function(a) {
+      var b = c();
+      r(a, function(a) {
+        t(a).then(b.resolve, b.reject)
+      });
+      return b.promise
+    };
+    return q
+  }
+
+  function mg() {
+    this.$get = ["$window", "$timeout", function(a, b) {
+      var d = a.requestAnimationFrame || a.webkitRequestAnimationFrame,
+        c = a.cancelAnimationFrame || a.webkitCancelAnimationFrame || a.webkitCancelRequestAnimationFrame,
+        e = !!d,
+        f = e ? function(a) {
+          var b = d(a);
+          return function() {
+            c(b)
+          }
+        } :
+        function(a) {
+          var c = b(a, 16.66, !1);
+          return function() {
+            b.cancel(c)
+          }
+        };
+      f.supported = e;
+      return f
+    }]
+  }
+
+  function ag() {
+    function a(a) {
+      function b() {
+        this.$$watchers = this.$$nextSibling = this.$$childHead = this.$$childTail = null;
+        this.$$listeners = {};
+        this.$$listenerCount = {};
+        this.$$watchersCount = 0;
+        this.$id = ++qb;
+        this.$$ChildScope = null;
+        this.$$suspended = !1
+      }
+      b.prototype = a;
+      return b
+    }
+    var b = 10,
+      d = F("$rootScope"),
+      c = null,
+      e = null;
+    this.digestTtl = function(a) {
+      arguments.length && (b = a);
+      return b
+    };
+    this.$get = ["$exceptionHandler", "$parse", "$browser",
+      function(f, g, k) {
+        function h(a) {
+          a.currentScope.$$destroyed = !0
+        }
+
+        function l(a) {
+          9 === wa && (a.$$childHead && l(a.$$childHead), a.$$nextSibling && l(a.$$nextSibling));
+          a.$parent = a.$$nextSibling = a.$$prevSibling = a.$$childHead = a.$$childTail = a.$root = a.$$watchers = null
+        }
+
+        function m() {
+          this.$id = ++qb;
+          this.$$phase = this.$parent = this.$$watchers = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null;
+          this.$root = this;
+          this.$$suspended = this.$$destroyed = !1;
+          this.$$listeners = {};
+          this.$$listenerCount = {};
+          this.$$watchersCount =
+            0;
+          this.$$isolateBindings = null
+        }
+
+        function p(a) {
+          if (v.$$phase) throw d("inprog", v.$$phase);
+          v.$$phase = a
+        }
+
+        function n(a, b) {
+          do a.$$watchersCount += b; while (a = a.$parent)
+        }
+
+        function s(a, b, c) {
+          do a.$$listenerCount[c] -= b, 0 === a.$$listenerCount[c] && delete a.$$listenerCount[c]; while (a = a.$parent)
+        }
+
+        function G() {}
+
+        function t() {
+          for (; y.length;) try {
+            y.shift()()
+          } catch (a) {
+            f(a)
+          }
+          e = null
+        }
+
+        function q() {
+          null === e && (e = k.defer(function() {
+            v.$apply(t)
+          }, null, "$applyAsync"))
+        }
+        m.prototype = {
+          constructor: m,
+          $new: function(b, c) {
+            var d;
+            c = c || this;
+            b ? (d = new m,
+              d.$root = this.$root) : (this.$$ChildScope || (this.$$ChildScope = a(this)), d = new this.$$ChildScope);
+            d.$parent = c;
+            d.$$prevSibling = c.$$childTail;
+            c.$$childHead ? (c.$$childTail.$$nextSibling = d, c.$$childTail = d) : c.$$childHead = c.$$childTail = d;
+            (b || c !== this) && d.$on("$destroy", h);
+            return d
+          },
+          $watch: function(a, b, d, e) {
+            var f = g(a);
+            b = B(b) ? b : E;
+            if (f.$$watchDelegate) return f.$$watchDelegate(this, b, d, f, a);
+            var h = this,
+              k = h.$$watchers,
+              l = {
+                fn: b,
+                last: G,
+                get: f,
+                exp: e || a,
+                eq: !!d
+              };
+            c = null;
+            k || (k = h.$$watchers = [], k.$$digestWatchIndex = -1);
+            k.unshift(l);
+            k.$$digestWatchIndex++;
+            n(this, 1);
+            return function() {
+              var a = cb(k, l);
+              0 <= a && (n(h, -1), a < k.$$digestWatchIndex && k.$$digestWatchIndex--);
+              c = null
+            }
+          },
+          $watchGroup: function(a, b) {
+            function c() {
+              h = !1;
+              try {
+                k ? (k = !1, b(e, e, g)) : b(e, d, g)
+              } finally {
+                for (var f = 0; f < a.length; f++) d[f] = e[f]
+              }
+            }
+            var d = Array(a.length),
+              e = Array(a.length),
+              f = [],
+              g = this,
+              h = !1,
+              k = !0;
+            if (!a.length) {
+              var l = !0;
+              g.$evalAsync(function() {
+                l && b(e, e, g)
+              });
+              return function() {
+                l = !1
+              }
+            }
+            if (1 === a.length) return this.$watch(a[0], function(a, c, f) {
+              e[0] = a;
+              d[0] = c;
+              b(e, a === c ? e : d, f)
+            });
+            r(a, function(a,
+              b) {
+              var d = g.$watch(a, function(a) {
+                e[b] = a;
+                h || (h = !0, g.$evalAsync(c))
+              });
+              f.push(d)
+            });
+            return function() {
+              for (; f.length;) f.shift()()
+            }
+          },
+          $watchCollection: function(a, b) {
+            function c(a) {
+              e = a;
+              var b, d, g, h;
+              if (!A(e)) {
+                if (D(e))
+                  if (za(e))
+                    for (f !== n && (f = n, t = f.length = 0, l++), a = e.length, t !== a && (l++, f.length = t = a), b = 0; b < a; b++) h = f[b], g = e[b], d = h !== h && g !== g, d || h === g || (l++, f[b] = g);
+                  else {
+                    f !== p && (f = p = {}, t = 0, l++);
+                    a = 0;
+                    for (b in e) ta.call(e, b) && (a++, g = e[b], h = f[b], b in f ? (d = h !== h && g !== g, d || h === g || (l++, f[b] = g)) : (t++, f[b] = g, l++));
+                    if (t > a)
+                      for (b in l++,
+                        f) ta.call(e, b) || (t--, delete f[b])
+                  }
+                else f !== e && (f = e, l++);
+                return l
+              }
+            }
+            c.$$pure = g(a).literal;
+            c.$stateful = !c.$$pure;
+            var d = this,
+              e, f, h, k = 1 < b.length,
+              l = 0,
+              m = g(a, c),
+              n = [],
+              p = {},
+              s = !0,
+              t = 0;
+            return this.$watch(m, function() {
+              s ? (s = !1, b(e, e, d)) : b(e, h, d);
+              if (k)
+                if (D(e))
+                  if (za(e)) {
+                    h = Array(e.length);
+                    for (var a = 0; a < e.length; a++) h[a] = e[a]
+                  } else
+                    for (a in h = {}, e) ta.call(e, a) && (h[a] = e[a]);
+              else h = e
+            })
+          },
+          $digest: function() {
+            var a, g, h, l, m, n, s, r = b,
+              q, y = w.length ? v : this,
+              N = [],
+              A, z;
+            p("$digest");
+            k.$$checkUrlChange();
+            this === v && null !== e && (k.defer.cancel(e),
+              t());
+            c = null;
+            do {
+              s = !1;
+              q = y;
+              for (n = 0; n < w.length; n++) {
+                try {
+                  z = w[n], l = z.fn, l(z.scope, z.locals)
+                } catch (C) {
+                  f(C)
+                }
+                c = null
+              }
+              w.length = 0;
+              a: do {
+                if (n = !q.$$suspended && q.$$watchers)
+                  for (n.$$digestWatchIndex = n.length; n.$$digestWatchIndex--;) try {
+                    if (a = n[n.$$digestWatchIndex])
+                      if (m = a.get, (g = m(q)) !== (h = a.last) && !(a.eq ? va(g, h) : Y(g) && Y(h))) s = !0, c = a, a.last = a.eq ? Ia(g, null) : g, l = a.fn, l(g, h === G ? g : h, q), 5 > r && (A = 4 - r, N[A] || (N[A] = []), N[A].push({
+                        msg: B(a.exp) ? "fn: " + (a.exp.name || a.exp.toString()) : a.exp,
+                        newVal: g,
+                        oldVal: h
+                      }));
+                      else if (a === c) {
+                      s = !1;
+                      break a
+                    }
+                  } catch (E) {
+                    f(E)
+                  }
+                if (!(n = !q.$$suspended && q.$$watchersCount && q.$$childHead || q !== y && q.$$nextSibling))
+                  for (; q !== y && !(n = q.$$nextSibling);) q = q.$parent
+              } while (q = n);
+              if ((s || w.length) && !r--) throw v.$$phase = null, d("infdig", b, N);
+            } while (s || w.length);
+            for (v.$$phase = null; J < x.length;) try {
+              x[J++]()
+            } catch (D) {
+              f(D)
+            }
+            x.length = J = 0;
+            k.$$checkUrlChange()
+          },
+          $suspend: function() {
+            this.$$suspended = !0
+          },
+          $isSuspended: function() {
+            return this.$$suspended
+          },
+          $resume: function() {
+            this.$$suspended = !1
+          },
+          $destroy: function() {
+            if (!this.$$destroyed) {
+              var a =
+                this.$parent;
+              this.$broadcast("$destroy");
+              this.$$destroyed = !0;
+              this === v && k.$$applicationDestroyed();
+              n(this, -this.$$watchersCount);
+              for (var b in this.$$listenerCount) s(this, this.$$listenerCount[b], b);
+              a && a.$$childHead === this && (a.$$childHead = this.$$nextSibling);
+              a && a.$$childTail === this && (a.$$childTail = this.$$prevSibling);
+              this.$$prevSibling && (this.$$prevSibling.$$nextSibling = this.$$nextSibling);
+              this.$$nextSibling && (this.$$nextSibling.$$prevSibling = this.$$prevSibling);
+              this.$destroy = this.$digest = this.$apply =
+                this.$evalAsync = this.$applyAsync = E;
+              this.$on = this.$watch = this.$watchGroup = function() {
+                return E
+              };
+              this.$$listeners = {};
+              this.$$nextSibling = null;
+              l(this)
+            }
+          },
+          $eval: function(a, b) {
+            return g(a)(this, b)
+          },
+          $evalAsync: function(a, b) {
+            v.$$phase || w.length || k.defer(function() {
+              w.length && v.$digest()
+            }, null, "$evalAsync");
+            w.push({
+              scope: this,
+              fn: g(a),
+              locals: b
+            })
+          },
+          $$postDigest: function(a) {
+            x.push(a)
+          },
+          $apply: function(a) {
+            try {
+              p("$apply");
+              try {
+                return this.$eval(a)
+              } finally {
+                v.$$phase = null
+              }
+            } catch (b) {
+              f(b)
+            } finally {
+              try {
+                v.$digest()
+              } catch (c) {
+                throw f(c),
+                  c;
+              }
+            }
+          },
+          $applyAsync: function(a) {
+            function b() {
+              c.$eval(a)
+            }
+            var c = this;
+            a && y.push(b);
+            a = g(a);
+            q()
+          },
+          $on: function(a, b) {
+            var c = this.$$listeners[a];
+            c || (this.$$listeners[a] = c = []);
+            c.push(b);
+            var d = this;
+            do d.$$listenerCount[a] || (d.$$listenerCount[a] = 0), d.$$listenerCount[a]++; while (d = d.$parent);
+            var e = this;
+            return function() {
+              var d = c.indexOf(b); - 1 !== d && (delete c[d], s(e, 1, a))
+            }
+          },
+          $emit: function(a, b) {
+            var c = [],
+              d, e = this,
+              g = !1,
+              h = {
+                name: a,
+                targetScope: e,
+                stopPropagation: function() {
+                  g = !0
+                },
+                preventDefault: function() {
+                  h.defaultPrevented = !0
+                },
+                defaultPrevented: !1
+              },
+              k = db([h], arguments, 1),
+              l, m;
+            do {
+              d = e.$$listeners[a] || c;
+              h.currentScope = e;
+              l = 0;
+              for (m = d.length; l < m; l++)
+                if (d[l]) try {
+                  d[l].apply(null, k)
+                } catch (n) {
+                  f(n)
+                } else d.splice(l, 1), l--, m--;
+              if (g) break;
+              e = e.$parent
+            } while (e);
+            h.currentScope = null;
+            return h
+          },
+          $broadcast: function(a, b) {
+            var c = this,
+              d = this,
+              e = {
+                name: a,
+                targetScope: this,
+                preventDefault: function() {
+                  e.defaultPrevented = !0
+                },
+                defaultPrevented: !1
+              };
+            if (!this.$$listenerCount[a]) return e;
+            for (var g = db([e], arguments, 1), h, k; c = d;) {
+              e.currentScope = c;
+              d = c.$$listeners[a] || [];
+              h = 0;
+              for (k = d.length; h < k; h++)
+                if (d[h]) try {
+                  d[h].apply(null, g)
+                } catch (l) {
+                  f(l)
+                } else d.splice(h, 1), h--, k--;
+              if (!(d = c.$$listenerCount[a] && c.$$childHead || c !== this && c.$$nextSibling))
+                for (; c !== this && !(d = c.$$nextSibling);) c = c.$parent
+            }
+            e.currentScope = null;
+            return e
+          }
+        };
+        var v = new m,
+          w = v.$$asyncQueue = [],
+          x = v.$$postDigestQueue = [],
+          y = v.$$applyAsyncQueue = [],
+          J = 0;
+        return v
+      }
+    ]
+  }
+
+  function Qe() {
+    var a = /^\s*(https?|s?ftp|mailto|tel|file):/,
+      b = /^\s*((https?|ftp|file|blob):|data:image\/)/;
+    this.aHrefSanitizationTrustedUrlList = function(b) {
+      return w(b) ?
+        (a = b, this) : a
+    };
+    this.imgSrcSanitizationTrustedUrlList = function(a) {
+      return w(a) ? (b = a, this) : b
+    };
+    this.$get = function() {
+      return function(d, c) {
+        var e = c ? b : a,
+          f = ga(d && d.trim()).href;
+        return "" === f || f.match(e) ? d : "unsafe:" + f
+      }
+    }
+  }
+
+  function Xg(a) {
+    if ("self" === a) return a;
+    if (C(a)) {
+      if (-1 < a.indexOf("***")) throw Ea("iwcard", a);
+      a = Od(a).replace(/\\\*\\\*/g, ".*").replace(/\\\*/g, "[^:/.?&;]*");
+      return new RegExp("^" + a + "$")
+    }
+    if (ab(a)) return new RegExp("^" + a.source + "$");
+    throw Ea("imatcher");
+  }
+
+  function Pd(a) {
+    var b = [];
+    w(a) && r(a, function(a) {
+      b.push(Xg(a))
+    });
+    return b
+  }
+
+  function eg() {
+    this.SCE_CONTEXTS = W;
+    var a = ["self"],
+      b = [];
+    this.trustedResourceUrlList = function(b) {
+      arguments.length && (a = Pd(b));
+      return a
+    };
+    Object.defineProperty(this, "resourceUrlWhitelist", {
+      get: function() {
+        return this.trustedResourceUrlList
+      },
+      set: function(a) {
+        this.trustedResourceUrlList = a
+      }
+    });
+    this.bannedResourceUrlList = function(a) {
+      arguments.length && (b = Pd(a));
+      return b
+    };
+    Object.defineProperty(this, "resourceUrlBlacklist", {
+      get: function() {
+        return this.bannedResourceUrlList
+      },
+      set: function(a) {
+        this.bannedResourceUrlList =
+          a
+      }
+    });
+    this.$get = ["$injector", "$$sanitizeUri", function(d, c) {
+      function e(a, b) {
+        var c;
+        "self" === a ? (c = Cc(b, Qd)) || (z.document.baseURI ? c = z.document.baseURI : (Na || (Na = z.document.createElement("a"), Na.href = ".", Na = Na.cloneNode(!1)), c = Na.href), c = Cc(b, c)) : c = !!a.exec(b.href);
+        return c
+      }
+
+      function f(a) {
+        var b = function(a) {
+          this.$$unwrapTrustedValue = function() {
+            return a
+          }
+        };
+        a && (b.prototype = new a);
+        b.prototype.valueOf = function() {
+          return this.$$unwrapTrustedValue()
+        };
+        b.prototype.toString = function() {
+          return this.$$unwrapTrustedValue().toString()
+        };
+        return b
+      }
+      var g = function(a) {
+        throw Ea("unsafe");
+      };
+      d.has("$sanitize") && (g = d.get("$sanitize"));
+      var k = f(),
+        h = {};
+      h[W.HTML] = f(k);
+      h[W.CSS] = f(k);
+      h[W.MEDIA_URL] = f(k);
+      h[W.URL] = f(h[W.MEDIA_URL]);
+      h[W.JS] = f(k);
+      h[W.RESOURCE_URL] = f(h[W.URL]);
+      return {
+        trustAs: function(a, b) {
+          var c = h.hasOwnProperty(a) ? h[a] : null;
+          if (!c) throw Ea("icontext", a, b);
+          if (null === b || A(b) || "" === b) return b;
+          if ("string" !== typeof b) throw Ea("itype", a);
+          return new c(b)
+        },
+        getTrusted: function(d, f) {
+          if (null === f || A(f) || "" === f) return f;
+          var k = h.hasOwnProperty(d) ?
+            h[d] : null;
+          if (k && f instanceof k) return f.$$unwrapTrustedValue();
+          B(f.$$unwrapTrustedValue) && (f = f.$$unwrapTrustedValue());
+          if (d === W.MEDIA_URL || d === W.URL) return c(f.toString(), d === W.MEDIA_URL);
+          if (d === W.RESOURCE_URL) {
+            var k = ga(f.toString()),
+              n, s, r = !1;
+            n = 0;
+            for (s = a.length; n < s; n++)
+              if (e(a[n], k)) {
+                r = !0;
+                break
+              } if (r)
+              for (n = 0, s = b.length; n < s; n++)
+                if (e(b[n], k)) {
+                  r = !1;
+                  break
+                } if (r) return f;
+            throw Ea("insecurl", f.toString());
+          }
+          if (d === W.HTML) return g(f);
+          throw Ea("unsafe");
+        },
+        valueOf: function(a) {
+          return a instanceof k ? a.$$unwrapTrustedValue() :
+            a
+        }
+      }
+    }]
+  }
+
+  function dg() {
+    var a = !0;
+    this.enabled = function(b) {
+      arguments.length && (a = !!b);
+      return a
+    };
+    this.$get = ["$parse", "$sceDelegate", function(b, d) {
+      if (a && 8 > wa) throw Ea("iequirks");
+      var c = ja(W);
+      c.isEnabled = function() {
+        return a
+      };
+      c.trustAs = d.trustAs;
+      c.getTrusted = d.getTrusted;
+      c.valueOf = d.valueOf;
+      a || (c.trustAs = c.getTrusted = function(a, b) {
+        return b
+      }, c.valueOf = Ta);
+      c.parseAs = function(a, d) {
+        var e = b(d);
+        return e.literal && e.constant ? e : b(d, function(b) {
+          return c.getTrusted(a, b)
+        })
+      };
+      var e = c.parseAs,
+        f = c.getTrusted,
+        g = c.trustAs;
+      r(W,
+        function(a, b) {
+          var d = K(b);
+          c[("parse_as_" + d).replace(Dc, xb)] = function(b) {
+            return e(a, b)
+          };
+          c[("get_trusted_" + d).replace(Dc, xb)] = function(b) {
+            return f(a, b)
+          };
+          c[("trust_as_" + d).replace(Dc, xb)] = function(b) {
+            return g(a, b)
+          }
+        });
+      return c
+    }]
+  }
+
+  function fg() {
+    this.$get = ["$window", "$document", function(a, b) {
+      var d = {},
+        c = !((!a.nw || !a.nw.process) && a.chrome && (a.chrome.app && a.chrome.app.runtime || !a.chrome.app && a.chrome.runtime && a.chrome.runtime.id)) && a.history && a.history.pushState,
+        e = fa((/android (\d+)/.exec(K((a.navigator || {}).userAgent)) || [])[1]),
+        f = /Boxee/i.test((a.navigator || {}).userAgent),
+        g = b[0] || {},
+        k = g.body && g.body.style,
+        h = !1,
+        l = !1;
+      k && (h = !!("transition" in k || "webkitTransition" in k), l = !!("animation" in k || "webkitAnimation" in k));
+      return {
+        history: !(!c || 4 > e || f),
+        hasEvent: function(a) {
+          if ("input" === a && wa) return !1;
+          if (A(d[a])) {
+            var b = g.createElement("div");
+            d[a] = "on" + a in b
+          }
+          return d[a]
+        },
+        csp: Ba(),
+        transitions: h,
+        animations: l,
+        android: e
+      }
+    }]
+  }
+
+  function gg() {
+    this.$get = ia(function(a) {
+      return new Yg(a)
+    })
+  }
+
+  function Yg(a) {
+    function b() {
+      var a = e.pop();
+      return a &&
+        a.cb
+    }
+
+    function d(a) {
+      for (var b = e.length - 1; 0 <= b; --b) {
+        var c = e[b];
+        if (c.type === a) return e.splice(b, 1), c.cb
+      }
+    }
+    var c = {},
+      e = [],
+      f = this.ALL_TASKS_TYPE = "$$all$$",
+      g = this.DEFAULT_TASK_TYPE = "$$default$$";
+    this.completeTask = function(e, h) {
+      h = h || g;
+      try {
+        e()
+      } finally {
+        var l;
+        l = h || g;
+        c[l] && (c[l]--, c[f]--);
+        l = c[h];
+        var m = c[f];
+        if (!m || !l)
+          for (l = m ? d : b; m = l(h);) try {
+            m()
+          } catch (p) {
+            a.error(p)
+          }
+      }
+    };
+    this.incTaskCount = function(a) {
+      a = a || g;
+      c[a] = (c[a] || 0) + 1;
+      c[f] = (c[f] || 0) + 1
+    };
+    this.notifyWhenNoPendingTasks = function(a, b) {
+      b = b || f;
+      c[b] ? e.push({
+          type: b,
+          cb: a
+        }) :
+        a()
+    }
+  }
+
+  function ig() {
+    var a;
+    this.httpOptions = function(b) {
+      return b ? (a = b, this) : a
+    };
+    this.$get = ["$exceptionHandler", "$templateCache", "$http", "$q", "$sce", function(b, d, c, e, f) {
+      function g(k, h) {
+        g.totalPendingRequests++;
+        if (!C(k) || A(d.get(k))) k = f.getTrustedResourceUrl(k);
+        var l = c.defaults && c.defaults.transformResponse;
+        H(l) ? l = l.filter(function(a) {
+          return a !== wc
+        }) : l === wc && (l = null);
+        return c.get(k, S({
+          cache: d,
+          transformResponse: l
+        }, a)).finally(function() {
+          g.totalPendingRequests--
+        }).then(function(a) {
+            return d.put(k, a.data)
+          },
+          function(a) {
+            h || (a = Zg("tpload", k, a.status, a.statusText), b(a));
+            return e.reject(a)
+          })
+      }
+      g.totalPendingRequests = 0;
+      return g
+    }]
+  }
+
+  function jg() {
+    this.$get = ["$rootScope", "$browser", "$location", function(a, b, d) {
+      return {
+        findBindings: function(a, b, d) {
+          a = a.getElementsByClassName("ng-binding");
+          var g = [];
+          r(a, function(a) {
+            var c = ca.element(a).data("$binding");
+            c && r(c, function(c) {
+              d ? (new RegExp("(^|\\s)" + Od(b) + "(\\s|\\||$)")).test(c) && g.push(a) : -1 !== c.indexOf(b) && g.push(a)
+            })
+          });
+          return g
+        },
+        findModels: function(a, b, d) {
+          for (var g = ["ng-",
+              "data-ng-", "ng\\:"
+            ], k = 0; k < g.length; ++k) {
+            var h = a.querySelectorAll("[" + g[k] + "model" + (d ? "=" : "*=") + '"' + b + '"]');
+            if (h.length) return h
+          }
+        },
+        getLocation: function() {
+          return d.url()
+        },
+        setLocation: function(b) {
+          b !== d.url() && (d.url(b), a.$digest())
+        },
+        whenStable: function(a) {
+          b.notifyWhenNoOutstandingRequests(a)
+        }
+      }
+    }]
+  }
+
+  function kg() {
+    this.$get = ["$rootScope", "$browser", "$q", "$$q", "$exceptionHandler", function(a, b, d, c, e) {
+      function f(f, h, l) {
+        B(f) || (l = h, h = f, f = E);
+        var m = Ha.call(arguments, 3),
+          p = w(l) && !l,
+          n = (p ? c : d).defer(),
+          s = n.promise,
+          r;
+        r = b.defer(function() {
+          try {
+            n.resolve(f.apply(null, m))
+          } catch (b) {
+            n.reject(b), e(b)
+          } finally {
+            delete g[s.$$timeoutId]
+          }
+          p || a.$apply()
+        }, h, "$timeout");
+        s.$$timeoutId = r;
+        g[r] = n;
+        return s
+      }
+      var g = {};
+      f.cancel = function(a) {
+        if (!a) return !1;
+        if (!a.hasOwnProperty("$$timeoutId")) throw $g("badprom");
+        if (!g.hasOwnProperty(a.$$timeoutId)) return !1;
+        a = a.$$timeoutId;
+        var c = g[a],
+          d = c.promise;
+        d.$$state && (d.$$state.pur = !0);
+        c.reject("canceled");
+        delete g[a];
+        return b.defer.cancel(a)
+      };
+      return f
+    }]
+  }
+
+  function ga(a) {
+    if (!C(a)) return a;
+    wa && (aa.setAttribute("href",
+      a), a = aa.href);
+    aa.setAttribute("href", a);
+    a = aa.hostname;
+    !ah && -1 < a.indexOf(":") && (a = "[" + a + "]");
+    return {
+      href: aa.href,
+      protocol: aa.protocol ? aa.protocol.replace(/:$/, "") : "",
+      host: aa.host,
+      search: aa.search ? aa.search.replace(/^\?/, "") : "",
+      hash: aa.hash ? aa.hash.replace(/^#/, "") : "",
+      hostname: a,
+      port: aa.port,
+      pathname: "/" === aa.pathname.charAt(0) ? aa.pathname : "/" + aa.pathname
+    }
+  }
+
+  function Og(a) {
+    var b = [Qd].concat(a.map(ga));
+    return function(a) {
+      a = ga(a);
+      return b.some(Cc.bind(null, a))
+    }
+  }
+
+  function Cc(a, b) {
+    a = ga(a);
+    b = ga(b);
+    return a.protocol ===
+      b.protocol && a.host === b.host
+  }
+
+  function lg() {
+    this.$get = ia(z)
+  }
+
+  function Rd(a) {
+    function b(a) {
+      try {
+        return decodeURIComponent(a)
+      } catch (b) {
+        return a
+      }
+    }
+    var d = a[0] || {},
+      c = {},
+      e = "";
+    return function() {
+      var a, g, k, h, l;
+      try {
+        a = d.cookie || ""
+      } catch (m) {
+        a = ""
+      }
+      if (a !== e)
+        for (e = a, a = e.split("; "), c = {}, k = 0; k < a.length; k++) g = a[k], h = g.indexOf("="), 0 < h && (l = b(g.substring(0, h)), A(c[l]) && (c[l] = b(g.substring(h + 1))));
+      return c
+    }
+  }
+
+  function pg() {
+    this.$get = Rd
+  }
+
+  function fd(a) {
+    function b(d, c) {
+      if (D(d)) {
+        var e = {};
+        r(d, function(a, c) {
+          e[c] = b(c, a)
+        });
+        return e
+      }
+      return a.factory(d +
+        "Filter", c)
+    }
+    this.register = b;
+    this.$get = ["$injector", function(a) {
+      return function(b) {
+        return a.get(b + "Filter")
+      }
+    }];
+    b("currency", Sd);
+    b("date", Td);
+    b("filter", bh);
+    b("json", ch);
+    b("limitTo", dh);
+    b("lowercase", eh);
+    b("number", Ud);
+    b("orderBy", Vd);
+    b("uppercase", fh)
+  }
+
+  function bh() {
+    return function(a, b, d, c) {
+      if (!za(a)) {
+        if (null == a) return a;
+        throw F("filter")("notarray", a);
+      }
+      c = c || "$";
+      var e;
+      switch (Ec(b)) {
+        case "function":
+          break;
+        case "boolean":
+        case "null":
+        case "number":
+        case "string":
+          e = !0;
+        case "object":
+          b = gh(b, d, c, e);
+          break;
+        default:
+          return a
+      }
+      return Array.prototype.filter.call(a,
+        b)
+    }
+  }
+
+  function gh(a, b, d, c) {
+    var e = D(a) && d in a;
+    !0 === b ? b = va : B(b) || (b = function(a, b) {
+      if (A(a)) return !1;
+      if (null === a || null === b) return a === b;
+      if (D(b) || D(a) && !cc(a)) return !1;
+      a = K("" + a);
+      b = K("" + b);
+      return -1 !== a.indexOf(b)
+    });
+    return function(f) {
+      return e && !D(f) ? Fa(f, a[d], b, d, !1) : Fa(f, a, b, d, c)
+    }
+  }
+
+  function Fa(a, b, d, c, e, f) {
+    var g = Ec(a),
+      k = Ec(b);
+    if ("string" === k && "!" === b.charAt(0)) return !Fa(a, b.substring(1), d, c, e);
+    if (H(a)) return a.some(function(a) {
+      return Fa(a, b, d, c, e)
+    });
+    switch (g) {
+      case "object":
+        var h;
+        if (e) {
+          for (h in a)
+            if (h.charAt &&
+              "$" !== h.charAt(0) && Fa(a[h], b, d, c, !0)) return !0;
+          return f ? !1 : Fa(a, b, d, c, !1)
+        }
+        if ("object" === k) {
+          for (h in b)
+            if (f = b[h], !B(f) && !A(f) && (g = h === c, !Fa(g ? a : a[h], f, d, c, g, g))) return !1;
+          return !0
+        }
+        return d(a, b);
+      case "function":
+        return !1;
+      default:
+        return d(a, b)
+    }
+  }
+
+  function Ec(a) {
+    return null === a ? "null" : typeof a
+  }
+
+  function Sd(a) {
+    var b = a.NUMBER_FORMATS;
+    return function(a, c, e) {
+      A(c) && (c = b.CURRENCY_SYM);
+      A(e) && (e = b.PATTERNS[1].maxFrac);
+      var f = c ? /\u00A4/g : /\s*\u00A4\s*/g;
+      return null == a ? a : Wd(a, b.PATTERNS[1], b.GROUP_SEP, b.DECIMAL_SEP, e).replace(f,
+        c)
+    }
+  }
+
+  function Ud(a) {
+    var b = a.NUMBER_FORMATS;
+    return function(a, c) {
+      return null == a ? a : Wd(a, b.PATTERNS[0], b.GROUP_SEP, b.DECIMAL_SEP, c)
+    }
+  }
+
+  function hh(a) {
+    var b = 0,
+      d, c, e, f, g; - 1 < (c = a.indexOf(Xd)) && (a = a.replace(Xd, ""));
+    0 < (e = a.search(/e/i)) ? (0 > c && (c = e), c += +a.slice(e + 1), a = a.substring(0, e)) : 0 > c && (c = a.length);
+    for (e = 0; a.charAt(e) === Fc; e++);
+    if (e === (g = a.length)) d = [0], c = 1;
+    else {
+      for (g--; a.charAt(g) === Fc;) g--;
+      c -= e;
+      d = [];
+      for (f = 0; e <= g; e++, f++) d[f] = +a.charAt(e)
+    }
+    c > Yd && (d = d.splice(0, Yd - 1), b = c - 1, c = 1);
+    return {
+      d: d,
+      e: b,
+      i: c
+    }
+  }
+
+  function ih(a,
+    b, d, c) {
+    var e = a.d,
+      f = e.length - a.i;
+    b = A(b) ? Math.min(Math.max(d, f), c) : +b;
+    d = b + a.i;
+    c = e[d];
+    if (0 < d) {
+      e.splice(Math.max(a.i, d));
+      for (var g = d; g < e.length; g++) e[g] = 0
+    } else
+      for (f = Math.max(0, f), a.i = 1, e.length = Math.max(1, d = b + 1), e[0] = 0, g = 1; g < d; g++) e[g] = 0;
+    if (5 <= c)
+      if (0 > d - 1) {
+        for (c = 0; c > d; c--) e.unshift(0), a.i++;
+        e.unshift(1);
+        a.i++
+      } else e[d - 1]++;
+    for (; f < Math.max(0, b); f++) e.push(0);
+    if (b = e.reduceRight(function(a, b, c, d) {
+        b += a;
+        d[c] = b % 10;
+        return Math.floor(b / 10)
+      }, 0)) e.unshift(b), a.i++
+  }
+
+  function Wd(a, b, d, c, e) {
+    if (!C(a) && !X(a) || isNaN(a)) return "";
+    var f = !isFinite(a),
+      g = !1,
+      k = Math.abs(a) + "",
+      h = "";
+    if (f) h = "\u221e";
+    else {
+      g = hh(k);
+      ih(g, e, b.minFrac, b.maxFrac);
+      h = g.d;
+      k = g.i;
+      e = g.e;
+      f = [];
+      for (g = h.reduce(function(a, b) {
+          return a && !b
+        }, !0); 0 > k;) h.unshift(0), k++;
+      0 < k ? f = h.splice(k, h.length) : (f = h, h = [0]);
+      k = [];
+      for (h.length >= b.lgSize && k.unshift(h.splice(-b.lgSize, h.length).join("")); h.length > b.gSize;) k.unshift(h.splice(-b.gSize, h.length).join(""));
+      h.length && k.unshift(h.join(""));
+      h = k.join(d);
+      f.length && (h += c + f.join(""));
+      e && (h += "e+" + e)
+    }
+    return 0 > a && !g ? b.negPre + h + b.negSuf : b.posPre +
+      h + b.posSuf
+  }
+
+  function Pb(a, b, d, c) {
+    var e = "";
+    if (0 > a || c && 0 >= a) c ? a = -a + 1 : (a = -a, e = "-");
+    for (a = "" + a; a.length < b;) a = Fc + a;
+    d && (a = a.substr(a.length - b));
+    return e + a
+  }
+
+  function ea(a, b, d, c, e) {
+    d = d || 0;
+    return function(f) {
+      f = f["get" + a]();
+      if (0 < d || f > -d) f += d;
+      0 === f && -12 === d && (f = 12);
+      return Pb(f, b, c, e)
+    }
+  }
+
+  function lb(a, b, d) {
+    return function(c, e) {
+      var f = c["get" + a](),
+        g = vb((d ? "STANDALONE" : "") + (b ? "SHORT" : "") + a);
+      return e[g][f]
+    }
+  }
+
+  function Zd(a) {
+    var b = (new Date(a, 0, 1)).getDay();
+    return new Date(a, 0, (4 >= b ? 5 : 12) - b)
+  }
+
+  function $d(a) {
+    return function(b) {
+      var d =
+        Zd(b.getFullYear());
+      b = +new Date(b.getFullYear(), b.getMonth(), b.getDate() + (4 - b.getDay())) - +d;
+      b = 1 + Math.round(b / 6048E5);
+      return Pb(b, a)
+    }
+  }
+
+  function Gc(a, b) {
+    return 0 >= a.getFullYear() ? b.ERAS[0] : b.ERAS[1]
+  }
+
+  function Td(a) {
+    function b(a) {
+      var b;
+      if (b = a.match(d)) {
+        a = new Date(0);
+        var f = 0,
+          g = 0,
+          k = b[8] ? a.setUTCFullYear : a.setFullYear,
+          h = b[8] ? a.setUTCHours : a.setHours;
+        b[9] && (f = fa(b[9] + b[10]), g = fa(b[9] + b[11]));
+        k.call(a, fa(b[1]), fa(b[2]) - 1, fa(b[3]));
+        f = fa(b[4] || 0) - f;
+        g = fa(b[5] || 0) - g;
+        k = fa(b[6] || 0);
+        b = Math.round(1E3 * parseFloat("0." +
+          (b[7] || 0)));
+        h.call(a, f, g, k, b)
+      }
+      return a
+    }
+    var d = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+    return function(c, d, f) {
+      var g = "",
+        k = [],
+        h, l;
+      d = d || "mediumDate";
+      d = a.DATETIME_FORMATS[d] || d;
+      C(c) && (c = jh.test(c) ? fa(c) : b(c));
+      X(c) && (c = new Date(c));
+      if (!ha(c) || !isFinite(c.getTime())) return c;
+      for (; d;)(l = kh.exec(d)) ? (k = db(k, l, 1), d = k.pop()) : (k.push(d), d = null);
+      var m = c.getTimezoneOffset();
+      f && (m = fc(f, m), c = gc(c, f, !0));
+      r(k, function(b) {
+        h = lh[b];
+        g += h ? h(c, a.DATETIME_FORMATS,
+          m) : "''" === b ? "'" : b.replace(/(^'|'$)/g, "").replace(/''/g, "'")
+      });
+      return g
+    }
+  }
+
+  function ch() {
+    return function(a, b) {
+      A(b) && (b = 2);
+      return eb(a, b)
+    }
+  }
+
+  function dh() {
+    return function(a, b, d) {
+      b = Infinity === Math.abs(Number(b)) ? Number(b) : fa(b);
+      if (Y(b)) return a;
+      X(a) && (a = a.toString());
+      if (!za(a)) return a;
+      d = !d || isNaN(d) ? 0 : fa(d);
+      d = 0 > d ? Math.max(0, a.length + d) : d;
+      return 0 <= b ? Hc(a, d, d + b) : 0 === d ? Hc(a, b, a.length) : Hc(a, Math.max(0, d + b), d)
+    }
+  }
+
+  function Hc(a, b, d) {
+    return C(a) ? a.slice(b, d) : Ha.call(a, b, d)
+  }
+
+  function Vd(a) {
+    function b(b) {
+      return b.map(function(b) {
+        var c =
+          1,
+          d = Ta;
+        if (B(b)) d = b;
+        else if (C(b)) {
+          if ("+" === b.charAt(0) || "-" === b.charAt(0)) c = "-" === b.charAt(0) ? -1 : 1, b = b.substring(1);
+          if ("" !== b && (d = a(b), d.constant)) var e = d(),
+            d = function(a) {
+              return a[e]
+            }
+        }
+        return {
+          get: d,
+          descending: c
+        }
+      })
+    }
+
+    function d(a) {
+      switch (typeof a) {
+        case "number":
+        case "boolean":
+        case "string":
+          return !0;
+        default:
+          return !1
+      }
+    }
+
+    function c(a, b) {
+      var c = 0,
+        d = a.type,
+        h = b.type;
+      if (d === h) {
+        var h = a.value,
+          l = b.value;
+        "string" === d ? (h = h.toLowerCase(), l = l.toLowerCase()) : "object" === d && (D(h) && (h = a.index), D(l) && (l = b.index));
+        h !== l && (c =
+          h < l ? -1 : 1)
+      } else c = "undefined" === d ? 1 : "undefined" === h ? -1 : "null" === d ? 1 : "null" === h ? -1 : d < h ? -1 : 1;
+      return c
+    }
+    return function(a, f, g, k) {
+      if (null == a) return a;
+      if (!za(a)) throw F("orderBy")("notarray", a);
+      H(f) || (f = [f]);
+      0 === f.length && (f = ["+"]);
+      var h = b(f),
+        l = g ? -1 : 1,
+        m = B(k) ? k : c;
+      a = Array.prototype.map.call(a, function(a, b) {
+        return {
+          value: a,
+          tieBreaker: {
+            value: b,
+            type: "number",
+            index: b
+          },
+          predicateValues: h.map(function(c) {
+            var e = c.get(a);
+            c = typeof e;
+            if (null === e) c = "null";
+            else if ("object" === c) a: {
+              if (B(e.valueOf) && (e = e.valueOf(), d(e))) break a;
+              cc(e) && (e = e.toString(), d(e))
+            }
+            return {
+              value: e,
+              type: c,
+              index: b
+            }
+          })
+        }
+      });
+      a.sort(function(a, b) {
+        for (var d = 0, e = h.length; d < e; d++) {
+          var f = m(a.predicateValues[d], b.predicateValues[d]);
+          if (f) return f * h[d].descending * l
+        }
+        return (m(a.tieBreaker, b.tieBreaker) || c(a.tieBreaker, b.tieBreaker)) * l
+      });
+      return a = a.map(function(a) {
+        return a.value
+      })
+    }
+  }
+
+  function Ra(a) {
+    B(a) && (a = {
+      link: a
+    });
+    a.restrict = a.restrict || "AC";
+    return ia(a)
+  }
+
+  function Qb(a, b, d, c, e) {
+    this.$$controls = [];
+    this.$error = {};
+    this.$$success = {};
+    this.$pending = void 0;
+    this.$name = e(b.name ||
+      b.ngForm || "")(d);
+    this.$dirty = !1;
+    this.$valid = this.$pristine = !0;
+    this.$submitted = this.$invalid = !1;
+    this.$$parentForm = mb;
+    this.$$element = a;
+    this.$$animate = c;
+    ae(this)
+  }
+
+  function ae(a) {
+    a.$$classCache = {};
+    a.$$classCache[be] = !(a.$$classCache[nb] = a.$$element.hasClass(nb))
+  }
+
+  function ce(a) {
+    function b(a, b, c) {
+      c && !a.$$classCache[b] ? (a.$$animate.addClass(a.$$element, b), a.$$classCache[b] = !0) : !c && a.$$classCache[b] && (a.$$animate.removeClass(a.$$element, b), a.$$classCache[b] = !1)
+    }
+
+    function d(a, c, d) {
+      c = c ? "-" + Xc(c, "-") : "";
+      b(a, nb +
+        c, !0 === d);
+      b(a, be + c, !1 === d)
+    }
+    var c = a.set,
+      e = a.unset;
+    a.clazz.prototype.$setValidity = function(a, g, k) {
+      A(g) ? (this.$pending || (this.$pending = {}), c(this.$pending, a, k)) : (this.$pending && e(this.$pending, a, k), de(this.$pending) && (this.$pending = void 0));
+      Ga(g) ? g ? (e(this.$error, a, k), c(this.$$success, a, k)) : (c(this.$error, a, k), e(this.$$success, a, k)) : (e(this.$error, a, k), e(this.$$success, a, k));
+      this.$pending ? (b(this, "ng-pending", !0), this.$valid = this.$invalid = void 0, d(this, "", null)) : (b(this, "ng-pending", !1), this.$valid =
+        de(this.$error), this.$invalid = !this.$valid, d(this, "", this.$valid));
+      g = this.$pending && this.$pending[a] ? void 0 : this.$error[a] ? !1 : this.$$success[a] ? !0 : null;
+      d(this, a, g);
+      this.$$parentForm.$setValidity(a, g, this)
+    }
+  }
+
+  function de(a) {
+    if (a)
+      for (var b in a)
+        if (a.hasOwnProperty(b)) return !1;
+    return !0
+  }
+
+  function Ic(a) {
+    a.$formatters.push(function(b) {
+      return a.$isEmpty(b) ? b : b.toString()
+    })
+  }
+
+  function Sa(a, b, d, c, e, f) {
+    var g = K(b[0].type);
+    if (!e.android) {
+      var k = !1;
+      b.on("compositionstart", function() {
+        k = !0
+      });
+      b.on("compositionupdate",
+        function(a) {
+          if (A(a.data) || "" === a.data) k = !1
+        });
+      b.on("compositionend", function() {
+        k = !1;
+        l()
+      })
+    }
+    var h, l = function(a) {
+      h && (f.defer.cancel(h), h = null);
+      if (!k) {
+        var e = b.val();
+        a = a && a.type;
+        "password" === g || d.ngTrim && "false" === d.ngTrim || (e = V(e));
+        (c.$viewValue !== e || "" === e && c.$$hasNativeValidators) && c.$setViewValue(e, a)
+      }
+    };
+    if (e.hasEvent("input")) b.on("input", l);
+    else {
+      var m = function(a, b, c) {
+        h || (h = f.defer(function() {
+          h = null;
+          b && b.value === c || l(a)
+        }))
+      };
+      b.on("keydown", function(a) {
+        var b = a.keyCode;
+        91 === b || 15 < b && 19 > b || 37 <= b && 40 >= b ||
+          m(a, this, this.value)
+      });
+      if (e.hasEvent("paste")) b.on("paste cut drop", m)
+    }
+    b.on("change", l);
+    if (ee[g] && c.$$hasNativeValidators && g === d.type) b.on("keydown wheel mousedown", function(a) {
+      if (!h) {
+        var b = this.validity,
+          c = b.badInput,
+          d = b.typeMismatch;
+        h = f.defer(function() {
+          h = null;
+          b.badInput === c && b.typeMismatch === d || l(a)
+        })
+      }
+    });
+    c.$render = function() {
+      var a = c.$isEmpty(c.$viewValue) ? "" : c.$viewValue;
+      b.val() !== a && b.val(a)
+    }
+  }
+
+  function Rb(a, b) {
+    return function(d, c) {
+      var e, f;
+      if (ha(d)) return d;
+      if (C(d)) {
+        '"' === d.charAt(0) && '"' === d.charAt(d.length -
+          1) && (d = d.substring(1, d.length - 1));
+        if (mh.test(d)) return new Date(d);
+        a.lastIndex = 0;
+        if (e = a.exec(d)) return e.shift(), f = c ? {
+          yyyy: c.getFullYear(),
+          MM: c.getMonth() + 1,
+          dd: c.getDate(),
+          HH: c.getHours(),
+          mm: c.getMinutes(),
+          ss: c.getSeconds(),
+          sss: c.getMilliseconds() / 1E3
+        } : {
+          yyyy: 1970,
+          MM: 1,
+          dd: 1,
+          HH: 0,
+          mm: 0,
+          ss: 0,
+          sss: 0
+        }, r(e, function(a, c) {
+          c < b.length && (f[b[c]] = +a)
+        }), e = new Date(f.yyyy, f.MM - 1, f.dd, f.HH, f.mm, f.ss || 0, 1E3 * f.sss || 0), 100 > f.yyyy && e.setFullYear(f.yyyy), e
+      }
+      return NaN
+    }
+  }
+
+  function ob(a, b, d, c) {
+    return function(e, f, g, k, h, l, m,
+      p) {
+      function n(a) {
+        return a && !(a.getTime && a.getTime() !== a.getTime())
+      }
+
+      function s(a) {
+        return w(a) && !ha(a) ? r(a) || void 0 : a
+      }
+
+      function r(a, b) {
+        var c = k.$options.getOption("timezone");
+        v && v !== c && (b = Uc(b, fc(v)));
+        var e = d(a, b);
+        !isNaN(e) && c && (e = gc(e, c));
+        return e
+      }
+      Jc(e, f, g, k, a);
+      Sa(e, f, g, k, h, l);
+      var t = "time" === a || "datetimelocal" === a,
+        q, v;
+      k.$parsers.push(function(c) {
+        if (k.$isEmpty(c)) return null;
+        if (b.test(c)) return r(c, q);
+        k.$$parserName = a
+      });
+      k.$formatters.push(function(a) {
+        if (a && !ha(a)) throw pb("datefmt", a);
+        if (n(a)) {
+          q = a;
+          var b =
+            k.$options.getOption("timezone");
+          b && (v = b, q = gc(q, b, !0));
+          var d = c;
+          t && C(k.$options.getOption("timeSecondsFormat")) && (d = c.replace("ss.sss", k.$options.getOption("timeSecondsFormat")).replace(/:$/, ""));
+          a = m("date")(a, d, b);
+          t && k.$options.getOption("timeStripZeroSeconds") && (a = a.replace(/(?::00)?(?:\.000)?$/, ""));
+          return a
+        }
+        v = q = null;
+        return ""
+      });
+      if (w(g.min) || g.ngMin) {
+        var x = g.min || p(g.ngMin)(e),
+          z = s(x);
+        k.$validators.min = function(a) {
+          return !n(a) || A(z) || d(a) >= z
+        };
+        g.$observe("min", function(a) {
+          a !== x && (z = s(a), x = a, k.$validate())
+        })
+      }
+      if (w(g.max) ||
+        g.ngMax) {
+        var y = g.max || p(g.ngMax)(e),
+          J = s(y);
+        k.$validators.max = function(a) {
+          return !n(a) || A(J) || d(a) <= J
+        };
+        g.$observe("max", function(a) {
+          a !== y && (J = s(a), y = a, k.$validate())
+        })
+      }
+    }
+  }
+
+  function Jc(a, b, d, c, e) {
+    (c.$$hasNativeValidators = D(b[0].validity)) && c.$parsers.push(function(a) {
+      var d = b.prop("validity") || {};
+      if (d.badInput || d.typeMismatch) c.$$parserName = e;
+      else return a
+    })
+  }
+
+  function fe(a) {
+    a.$parsers.push(function(b) {
+      if (a.$isEmpty(b)) return null;
+      if (nh.test(b)) return parseFloat(b);
+      a.$$parserName = "number"
+    });
+    a.$formatters.push(function(b) {
+      if (!a.$isEmpty(b)) {
+        if (!X(b)) throw pb("numfmt",
+          b);
+        b = b.toString()
+      }
+      return b
+    })
+  }
+
+  function na(a) {
+    w(a) && !X(a) && (a = parseFloat(a));
+    return Y(a) ? void 0 : a
+  }
+
+  function Kc(a) {
+    var b = a.toString(),
+      d = b.indexOf(".");
+    return -1 === d ? -1 < a && 1 > a && (a = /e-(\d+)$/.exec(b)) ? Number(a[1]) : 0 : b.length - d - 1
+  }
+
+  function ge(a, b, d) {
+    a = Number(a);
+    var c = (a | 0) !== a,
+      e = (b | 0) !== b,
+      f = (d | 0) !== d;
+    if (c || e || f) {
+      var g = c ? Kc(a) : 0,
+        k = e ? Kc(b) : 0,
+        h = f ? Kc(d) : 0,
+        g = Math.max(g, k, h),
+        g = Math.pow(10, g);
+      a *= g;
+      b *= g;
+      d *= g;
+      c && (a = Math.round(a));
+      e && (b = Math.round(b));
+      f && (d = Math.round(d))
+    }
+    return 0 === (a - b) % d
+  }
+
+  function he(a, b, d, c, e) {
+    if (w(c)) {
+      a =
+        a(c);
+      if (!a.constant) throw pb("constexpr", d, c);
+      return a(b)
+    }
+    return e
+  }
+
+  function Lc(a, b) {
+    function d(a, b) {
+      if (!a || !a.length) return [];
+      if (!b || !b.length) return a;
+      var c = [],
+        d = 0;
+      a: for (; d < a.length; d++) {
+        for (var e = a[d], m = 0; m < b.length; m++)
+          if (e === b[m]) continue a;
+        c.push(e)
+      }
+      return c
+    }
+
+    function c(a) {
+      if (!a) return a;
+      var b = a;
+      H(a) ? b = a.map(c).join(" ") : D(a) ? b = Object.keys(a).filter(function(b) {
+        return a[b]
+      }).join(" ") : C(a) || (b = a + "");
+      return b
+    }
+    a = "ngClass" + a;
+    var e;
+    return ["$parse", function(f) {
+      return {
+        restrict: "AC",
+        link: function(g,
+          k, h) {
+          function l(a, b) {
+            var c = [];
+            r(a, function(a) {
+              if (0 < b || p[a]) p[a] = (p[a] || 0) + b, p[a] === +(0 < b) && c.push(a)
+            });
+            return c.join(" ")
+          }
+
+          function m(a) {
+            if (a === b) {
+              var c = s,
+                c = l(c && c.split(" "), 1);
+              h.$addClass(c)
+            } else c = s, c = l(c && c.split(" "), -1), h.$removeClass(c);
+            n = a
+          }
+          var p = k.data("$classCounts"),
+            n = !0,
+            s;
+          p || (p = T(), k.data("$classCounts", p));
+          "ngClass" !== a && (e || (e = f("$index", function(a) {
+            return a & 1
+          })), g.$watch(e, m));
+          g.$watch(f(h[a], c), function(a) {
+            if (n === b) {
+              var c = s && s.split(" "),
+                e = a && a.split(" "),
+                f = d(c, e),
+                c = d(e, c),
+                f = l(f, -1),
+                c = l(c, 1);
+              h.$addClass(c);
+              h.$removeClass(f)
+            }
+            s = a
+          })
+        }
+      }
+    }]
+  }
+
+  function sd(a, b, d, c, e, f) {
+    return {
+      restrict: "A",
+      compile: function(g, k) {
+        var h = a(k[c]);
+        return function(a, c) {
+          c.on(e, function(c) {
+            var e = function() {
+              h(a, {
+                $event: c
+              })
+            };
+            if (b.$$phase)
+              if (f) a.$evalAsync(e);
+              else try {
+                e()
+              } catch (g) {
+                d(g)
+              } else a.$apply(e)
+          })
+        }
+      }
+    }
+  }
+
+  function Sb(a, b, d, c, e, f, g, k, h) {
+    this.$modelValue = this.$viewValue = Number.NaN;
+    this.$$rawModelValue = void 0;
+    this.$validators = {};
+    this.$asyncValidators = {};
+    this.$parsers = [];
+    this.$formatters = [];
+    this.$viewChangeListeners = [];
+    this.$untouched = !0;
+    this.$touched = !1;
+    this.$pristine = !0;
+    this.$dirty = !1;
+    this.$valid = !0;
+    this.$invalid = !1;
+    this.$error = {};
+    this.$$success = {};
+    this.$pending = void 0;
+    this.$name = h(d.name || "", !1)(a);
+    this.$$parentForm = mb;
+    this.$options = Tb;
+    this.$$updateEvents = "";
+    this.$$updateEventHandler = this.$$updateEventHandler.bind(this);
+    this.$$parsedNgModel = e(d.ngModel);
+    this.$$parsedNgModelAssign = this.$$parsedNgModel.assign;
+    this.$$ngModelGet = this.$$parsedNgModel;
+    this.$$ngModelSet = this.$$parsedNgModelAssign;
+    this.$$pendingDebounce =
+      null;
+    this.$$parserValid = void 0;
+    this.$$parserName = "parse";
+    this.$$currentValidationRunId = 0;
+    this.$$scope = a;
+    this.$$rootScope = a.$root;
+    this.$$attr = d;
+    this.$$element = c;
+    this.$$animate = f;
+    this.$$timeout = g;
+    this.$$parse = e;
+    this.$$q = k;
+    this.$$exceptionHandler = b;
+    ae(this);
+    oh(this)
+  }
+
+  function oh(a) {
+    a.$$scope.$watch(function(b) {
+      b = a.$$ngModelGet(b);
+      b === a.$modelValue || a.$modelValue !== a.$modelValue && b !== b || a.$$setModelValue(b);
+      return b
+    })
+  }
+
+  function Mc(a) {
+    this.$$options = a
+  }
+
+  function ie(a, b) {
+    r(b, function(b, c) {
+      w(a[c]) || (a[c] = b)
+    })
+  }
+
+  function Oa(a, b) {
+    a.prop("selected", b);
+    a.attr("selected", b)
+  }
+
+  function je(a, b, d) {
+    if (a) {
+      C(a) && (a = new RegExp("^" + a + "$"));
+      if (!a.test) throw F("ngPattern")("noregexp", b, a, Aa(d));
+      return a
+    }
+  }
+
+  function Ub(a) {
+    a = fa(a);
+    return Y(a) ? -1 : a
+  }
+  var Xb = {
+      objectMaxDepth: 5,
+      urlErrorParamsEnabled: !0
+    },
+    ke = /^\/(.+)\/([a-z]*)$/,
+    ta = Object.prototype.hasOwnProperty,
+    K = function(a) {
+      return C(a) ? a.toLowerCase() : a
+    },
+    vb = function(a) {
+      return C(a) ? a.toUpperCase() : a
+    },
+    wa, x, sb, Ha = [].slice,
+    Kg = [].splice,
+    ph = [].push,
+    la = Object.prototype.toString,
+    Rc = Object.getPrototypeOf,
+    oa = F("ng"),
+    ca = z.angular || (z.angular = {}),
+    lc, qb = 0;
+  wa = z.document.documentMode;
+  var Y = Number.isNaN || function(a) {
+    return a !== a
+  };
+  E.$inject = [];
+  Ta.$inject = [];
+  var ze = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,
+    V = function(a) {
+      return C(a) ? a.trim() : a
+    },
+    Od = function(a) {
+      return a.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08")
+    },
+    Ba = function() {
+      if (!w(Ba.rules)) {
+        var a = z.document.querySelector("[ng-csp]") || z.document.querySelector("[data-ng-csp]");
+        if (a) {
+          var b =
+            a.getAttribute("ng-csp") || a.getAttribute("data-ng-csp");
+          Ba.rules = {
+            noUnsafeEval: !b || -1 !== b.indexOf("no-unsafe-eval"),
+            noInlineStyle: !b || -1 !== b.indexOf("no-inline-style")
+          }
+        } else {
+          a = Ba;
+          try {
+            new Function(""), b = !1
+          } catch (d) {
+            b = !0
+          }
+          a.rules = {
+            noUnsafeEval: b,
+            noInlineStyle: !1
+          }
+        }
+      }
+      return Ba.rules
+    },
+    rb = function() {
+      if (w(rb.name_)) return rb.name_;
+      var a, b, d = Qa.length,
+        c, e;
+      for (b = 0; b < d; ++b)
+        if (c = Qa[b], a = z.document.querySelector("[" + c.replace(":", "\\:") + "jq]")) {
+          e = a.getAttribute(c + "jq");
+          break
+        } return rb.name_ = e
+    },
+    Be = /:/g,
+    Qa = ["ng-",
+      "data-ng-", "ng:", "x-ng-"
+    ],
+    Fe = function(a) {
+      var b = a.currentScript;
+      if (!b) return !0;
+      if (!(b instanceof z.HTMLScriptElement || b instanceof z.SVGScriptElement)) return !1;
+      b = b.attributes;
+      return [b.getNamedItem("src"), b.getNamedItem("href"), b.getNamedItem("xlink:href")].every(function(b) {
+        if (!b) return !0;
+        if (!b.value) return !1;
+        var c = a.createElement("a");
+        c.href = b.value;
+        if (a.location.origin === c.origin) return !0;
+        switch (c.protocol) {
+          case "http:":
+          case "https:":
+          case "ftp:":
+          case "blob:":
+          case "file:":
+          case "data:":
+            return !0;
+          default:
+            return !1
+        }
+      })
+    }(z.document),
+    Ie = /[A-Z]/g,
+    Yc = !1,
+    Pa = 3,
+    Pe = {
+      full: "1.8.2",
+      major: 1,
+      minor: 8,
+      dot: 2,
+      codeName: "meteoric-mining"
+    };
+  U.expando = "ng339";
+  var Ka = U.cache = {},
+    ug = 1;
+  U._data = function(a) {
+    return this.cache[a[this.expando]] || {}
+  };
+  var qg = /-([a-z])/g,
+    qh = /^-ms-/,
+    Bb = {
+      mouseleave: "mouseout",
+      mouseenter: "mouseover"
+    },
+    oc = F("jqLite"),
+    tg = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,
+    nc = /<|&#?\w+;/,
+    rg = /<([\w:-]+)/,
+    sg = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+    qa = {
+      thead: ["table"],
+      col: ["colgroup", "table"],
+      tr: ["tbody", "table"],
+      td: ["tr",
+        "tbody", "table"
+      ]
+    };
+  qa.tbody = qa.tfoot = qa.colgroup = qa.caption = qa.thead;
+  qa.th = qa.td;
+  var hb = {
+      option: [1, '<select multiple="multiple">', "</select>"],
+      _default: [0, "", ""]
+    },
+    Nc;
+  for (Nc in qa) {
+    var le = qa[Nc],
+      me = le.slice().reverse();
+    hb[Nc] = [me.length, "<" + me.join("><") + ">", "</" + le.join("></") + ">"]
+  }
+  hb.optgroup = hb.option;
+  var zg = z.Node.prototype.contains || function(a) {
+      return !!(this.compareDocumentPosition(a) & 16)
+    },
+    Wa = U.prototype = {
+      ready: hd,
+      toString: function() {
+        var a = [];
+        r(this, function(b) {
+          a.push("" + b)
+        });
+        return "[" + a.join(", ") +
+          "]"
+      },
+      eq: function(a) {
+        return 0 <= a ? x(this[a]) : x(this[this.length + a])
+      },
+      length: 0,
+      push: ph,
+      sort: [].sort,
+      splice: [].splice
+    },
+    Hb = {};
+  r("multiple selected checked disabled readOnly required open".split(" "), function(a) {
+    Hb[K(a)] = a
+  });
+  var od = {};
+  r("input select option textarea button form details".split(" "), function(a) {
+    od[a] = !0
+  });
+  var vd = {
+    ngMinlength: "minlength",
+    ngMaxlength: "maxlength",
+    ngMin: "min",
+    ngMax: "max",
+    ngPattern: "pattern",
+    ngStep: "step"
+  };
+  r({
+    data: sc,
+    removeData: rc,
+    hasData: function(a) {
+      for (var b in Ka[a.ng339]) return !0;
+      return !1
+    },
+    cleanData: function(a) {
+      for (var b = 0, d = a.length; b < d; b++) rc(a[b]), kd(a[b])
+    }
+  }, function(a, b) {
+    U[b] = a
+  });
+  r({
+    data: sc,
+    inheritedData: Fb,
+    scope: function(a) {
+      return x.data(a, "$scope") || Fb(a.parentNode || a, ["$isolateScope", "$scope"])
+    },
+    isolateScope: function(a) {
+      return x.data(a, "$isolateScope") || x.data(a, "$isolateScopeNoTemplate")
+    },
+    controller: ld,
+    injector: function(a) {
+      return Fb(a, "$injector")
+    },
+    removeAttr: function(a, b) {
+      a.removeAttribute(b)
+    },
+    hasClass: Cb,
+    css: function(a, b, d) {
+      b = yb(b.replace(qh, "ms-"));
+      if (w(d)) a.style[b] =
+        d;
+      else return a.style[b]
+    },
+    attr: function(a, b, d) {
+      var c = a.nodeType;
+      if (c !== Pa && 2 !== c && 8 !== c && a.getAttribute) {
+        var c = K(b),
+          e = Hb[c];
+        if (w(d)) null === d || !1 === d && e ? a.removeAttribute(b) : a.setAttribute(b, e ? c : d);
+        else return a = a.getAttribute(b), e && null !== a && (a = c), null === a ? void 0 : a
+      }
+    },
+    prop: function(a, b, d) {
+      if (w(d)) a[b] = d;
+      else return a[b]
+    },
+    text: function() {
+      function a(a, d) {
+        if (A(d)) {
+          var c = a.nodeType;
+          return 1 === c || c === Pa ? a.textContent : ""
+        }
+        a.textContent = d
+      }
+      a.$dv = "";
+      return a
+    }(),
+    val: function(a, b) {
+      if (A(b)) {
+        if (a.multiple && "select" ===
+          ua(a)) {
+          var d = [];
+          r(a.options, function(a) {
+            a.selected && d.push(a.value || a.text)
+          });
+          return d
+        }
+        return a.value
+      }
+      a.value = b
+    },
+    html: function(a, b) {
+      if (A(b)) return a.innerHTML;
+      zb(a, !0);
+      a.innerHTML = b
+    },
+    empty: md
+  }, function(a, b) {
+    U.prototype[b] = function(b, c) {
+      var e, f, g = this.length;
+      if (a !== md && A(2 === a.length && a !== Cb && a !== ld ? b : c)) {
+        if (D(b)) {
+          for (e = 0; e < g; e++)
+            if (a === sc) a(this[e], b);
+            else
+              for (f in b) a(this[e], f, b[f]);
+          return this
+        }
+        e = a.$dv;
+        g = A(e) ? Math.min(g, 1) : g;
+        for (f = 0; f < g; f++) {
+          var k = a(this[f], b, c);
+          e = e ? e + k : k
+        }
+        return e
+      }
+      for (e = 0; e < g; e++) a(this[e],
+        b, c);
+      return this
+    }
+  });
+  r({
+    removeData: rc,
+    on: function(a, b, d, c) {
+      if (w(c)) throw oc("onargs");
+      if (mc(a)) {
+        c = Ab(a, !0);
+        var e = c.events,
+          f = c.handle;
+        f || (f = c.handle = wg(a, e));
+        c = 0 <= b.indexOf(" ") ? b.split(" ") : [b];
+        for (var g = c.length, k = function(b, c, g) {
+            var k = e[b];
+            k || (k = e[b] = [], k.specialHandlerWrapper = c, "$destroy" === b || g || a.addEventListener(b, f));
+            k.push(d)
+          }; g--;) b = c[g], Bb[b] ? (k(Bb[b], yg), k(b, void 0, !0)) : k(b)
+      }
+    },
+    off: kd,
+    one: function(a, b, d) {
+      a = x(a);
+      a.on(b, function e() {
+        a.off(b, d);
+        a.off(b, e)
+      });
+      a.on(b, d)
+    },
+    replaceWith: function(a,
+      b) {
+      var d, c = a.parentNode;
+      zb(a);
+      r(new U(b), function(b) {
+        d ? c.insertBefore(b, d.nextSibling) : c.replaceChild(b, a);
+        d = b
+      })
+    },
+    children: function(a) {
+      var b = [];
+      r(a.childNodes, function(a) {
+        1 === a.nodeType && b.push(a)
+      });
+      return b
+    },
+    contents: function(a) {
+      return a.contentDocument || a.childNodes || []
+    },
+    append: function(a, b) {
+      var d = a.nodeType;
+      if (1 === d || 11 === d) {
+        b = new U(b);
+        for (var d = 0, c = b.length; d < c; d++) a.appendChild(b[d])
+      }
+    },
+    prepend: function(a, b) {
+      if (1 === a.nodeType) {
+        var d = a.firstChild;
+        r(new U(b), function(b) {
+          a.insertBefore(b, d)
+        })
+      }
+    },
+    wrap: function(a, b) {
+      var d = x(b).eq(0).clone()[0],
+        c = a.parentNode;
+      c && c.replaceChild(d, a);
+      d.appendChild(a)
+    },
+    remove: Gb,
+    detach: function(a) {
+      Gb(a, !0)
+    },
+    after: function(a, b) {
+      var d = a,
+        c = a.parentNode;
+      if (c) {
+        b = new U(b);
+        for (var e = 0, f = b.length; e < f; e++) {
+          var g = b[e];
+          c.insertBefore(g, d.nextSibling);
+          d = g
+        }
+      }
+    },
+    addClass: Eb,
+    removeClass: Db,
+    toggleClass: function(a, b, d) {
+      b && r(b.split(" "), function(b) {
+        var e = d;
+        A(e) && (e = !Cb(a, b));
+        (e ? Eb : Db)(a, b)
+      })
+    },
+    parent: function(a) {
+      return (a = a.parentNode) && 11 !== a.nodeType ? a : null
+    },
+    next: function(a) {
+      return a.nextElementSibling
+    },
+    find: function(a, b) {
+      return a.getElementsByTagName ? a.getElementsByTagName(b) : []
+    },
+    clone: qc,
+    triggerHandler: function(a, b, d) {
+      var c, e, f = b.type || b,
+        g = Ab(a);
+      if (g = (g = g && g.events) && g[f]) c = {
+        preventDefault: function() {
+          this.defaultPrevented = !0
+        },
+        isDefaultPrevented: function() {
+          return !0 === this.defaultPrevented
+        },
+        stopImmediatePropagation: function() {
+          this.immediatePropagationStopped = !0
+        },
+        isImmediatePropagationStopped: function() {
+          return !0 === this.immediatePropagationStopped
+        },
+        stopPropagation: E,
+        type: f,
+        target: a
+      }, b.type && (c = S(c,
+        b)), b = ja(g), e = d ? [c].concat(d) : [c], r(b, function(b) {
+        c.isImmediatePropagationStopped() || b.apply(a, e)
+      })
+    }
+  }, function(a, b) {
+    U.prototype[b] = function(b, c, e) {
+      for (var f, g = 0, k = this.length; g < k; g++) A(f) ? (f = a(this[g], b, c, e), w(f) && (f = x(f))) : pc(f, a(this[g], b, c, e));
+      return w(f) ? f : this
+    }
+  });
+  U.prototype.bind = U.prototype.on;
+  U.prototype.unbind = U.prototype.off;
+  var rh = Object.create(null);
+  pd.prototype = {
+    _idx: function(a) {
+      a !== this._lastKey && (this._lastKey = a, this._lastIndex = this._keys.indexOf(a));
+      return this._lastIndex
+    },
+    _transformKey: function(a) {
+      return Y(a) ?
+        rh : a
+    },
+    get: function(a) {
+      a = this._transformKey(a);
+      a = this._idx(a);
+      if (-1 !== a) return this._values[a]
+    },
+    has: function(a) {
+      a = this._transformKey(a);
+      return -1 !== this._idx(a)
+    },
+    set: function(a, b) {
+      a = this._transformKey(a);
+      var d = this._idx(a); - 1 === d && (d = this._lastIndex = this._keys.length);
+      this._keys[d] = a;
+      this._values[d] = b
+    },
+    delete: function(a) {
+      a = this._transformKey(a);
+      a = this._idx(a);
+      if (-1 === a) return !1;
+      this._keys.splice(a, 1);
+      this._values.splice(a, 1);
+      this._lastKey = NaN;
+      this._lastIndex = -1;
+      return !0
+    }
+  };
+  var Ib = pd,
+    og = [function() {
+      this.$get = [function() {
+        return Ib
+      }]
+    }],
+    Bg = /^([^(]+?)=>/,
+    Cg = /^[^(]*\(\s*([^)]*)\)/m,
+    sh = /,/,
+    th = /^\s*(_?)(\S+?)\1\s*$/,
+    Ag = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,
+    Ca = F("$injector");
+  fb.$$annotate = function(a, b, d) {
+    var c;
+    if ("function" === typeof a) {
+      if (!(c = a.$inject)) {
+        c = [];
+        if (a.length) {
+          if (b) throw C(d) && d || (d = a.name || Dg(a)), Ca("strictdi", d);
+          b = qd(a);
+          r(b[1].split(sh), function(a) {
+            a.replace(th, function(a, b, d) {
+              c.push(d)
+            })
+          })
+        }
+        a.$inject = c
+      }
+    } else H(a) ? (b = a.length - 1, tb(a[b], "fn"), c = a.slice(0, b)) : tb(a, "fn", !0);
+    return c
+  };
+  var ne = F("$animate"),
+    Ef = function() {
+      this.$get = E
+    },
+    Ff = function() {
+      var a = new Ib,
+        b = [];
+      this.$get = ["$$AnimateRunner", "$rootScope", function(d, c) {
+        function e(a, b, c) {
+          var d = !1;
+          b && (b = C(b) ? b.split(" ") : H(b) ? b : [], r(b, function(b) {
+            b && (d = !0, a[b] = c)
+          }));
+          return d
+        }
+
+        function f() {
+          r(b, function(b) {
+            var c = a.get(b);
+            if (c) {
+              var d = Eg(b.attr("class")),
+                e = "",
+                f = "";
+              r(c, function(a, b) {
+                a !== !!d[b] && (a ? e += (e.length ? " " : "") + b : f += (f.length ? " " : "") + b)
+              });
+              r(b, function(a) {
+                e && Eb(a, e);
+                f && Db(a, f)
+              });
+              a.delete(b)
+            }
+          });
+          b.length = 0
+        }
+        return {
+          enabled: E,
+          on: E,
+          off: E,
+          pin: E,
+          push: function(g,
+            k, h, l) {
+            l && l();
+            h = h || {};
+            h.from && g.css(h.from);
+            h.to && g.css(h.to);
+            if (h.addClass || h.removeClass)
+              if (k = h.addClass, l = h.removeClass, h = a.get(g) || {}, k = e(h, k, !0), l = e(h, l, !1), k || l) a.set(g, h), b.push(g), 1 === b.length && c.$$postDigest(f);
+            g = new d;
+            g.complete();
+            return g
+          }
+        }
+      }]
+    },
+    Cf = ["$provide", function(a) {
+      var b = this,
+        d = null,
+        c = null;
+      this.$$registeredAnimations = Object.create(null);
+      this.register = function(c, d) {
+        if (c && "." !== c.charAt(0)) throw ne("notcsel", c);
+        var g = c + "-animation";
+        b.$$registeredAnimations[c.substr(1)] = g;
+        a.factory(g,
+          d)
+      };
+      this.customFilter = function(a) {
+        1 === arguments.length && (c = B(a) ? a : null);
+        return c
+      };
+      this.classNameFilter = function(a) {
+        if (1 === arguments.length && (d = a instanceof RegExp ? a : null) && /[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString())) throw d = null, ne("nongcls", "ng-animate");
+        return d
+      };
+      this.$get = ["$$animateQueue", function(a) {
+        function b(a, c, d) {
+          if (d) {
+            var e;
+            a: {
+              for (e = 0; e < d.length; e++) {
+                var f = d[e];
+                if (1 === f.nodeType) {
+                  e = f;
+                  break a
+                }
+              }
+              e = void 0
+            }!e || e.parentNode || e.previousElementSibling || (d = null)
+          }
+          d ? d.after(a) : c.prepend(a)
+        }
+        return {
+          on: a.on,
+          off: a.off,
+          pin: a.pin,
+          enabled: a.enabled,
+          cancel: function(a) {
+            a.cancel && a.cancel()
+          },
+          enter: function(c, d, h, l) {
+            d = d && x(d);
+            h = h && x(h);
+            d = d || h.parent();
+            b(c, d, h);
+            return a.push(c, "enter", ra(l))
+          },
+          move: function(c, d, h, l) {
+            d = d && x(d);
+            h = h && x(h);
+            d = d || h.parent();
+            b(c, d, h);
+            return a.push(c, "move", ra(l))
+          },
+          leave: function(b, c) {
+            return a.push(b, "leave", ra(c), function() {
+              b.remove()
+            })
+          },
+          addClass: function(b, c, d) {
+            d = ra(d);
+            d.addClass = ib(d.addclass, c);
+            return a.push(b, "addClass", d)
+          },
+          removeClass: function(b, c, d) {
+            d = ra(d);
+            d.removeClass = ib(d.removeClass,
+              c);
+            return a.push(b, "removeClass", d)
+          },
+          setClass: function(b, c, d, f) {
+            f = ra(f);
+            f.addClass = ib(f.addClass, c);
+            f.removeClass = ib(f.removeClass, d);
+            return a.push(b, "setClass", f)
+          },
+          animate: function(b, c, d, f, m) {
+            m = ra(m);
+            m.from = m.from ? S(m.from, c) : c;
+            m.to = m.to ? S(m.to, d) : d;
+            m.tempClasses = ib(m.tempClasses, f || "ng-inline-animate");
+            return a.push(b, "animate", m)
+          }
+        }
+      }]
+    }],
+    Hf = function() {
+      this.$get = ["$$rAF", function(a) {
+        function b(b) {
+          d.push(b);
+          1 < d.length || a(function() {
+            for (var a = 0; a < d.length; a++) d[a]();
+            d = []
+          })
+        }
+        var d = [];
+        return function() {
+          var a = !1;
+          b(function() {
+            a = !0
+          });
+          return function(d) {
+            a ? d() : b(d)
+          }
+        }
+      }]
+    },
+    Gf = function() {
+      this.$get = ["$q", "$sniffer", "$$animateAsyncRun", "$$isDocumentHidden", "$timeout", function(a, b, d, c, e) {
+        function f(a) {
+          this.setHost(a);
+          var b = d();
+          this._doneCallbacks = [];
+          this._tick = function(a) {
+            c() ? e(a, 0, !1) : b(a)
+          };
+          this._state = 0
+        }
+        f.chain = function(a, b) {
+          function c() {
+            if (d === a.length) b(!0);
+            else a[d](function(a) {
+              !1 === a ? b(!1) : (d++, c())
+            })
+          }
+          var d = 0;
+          c()
+        };
+        f.all = function(a, b) {
+          function c(f) {
+            e = e && f;
+            ++d === a.length && b(e)
+          }
+          var d = 0,
+            e = !0;
+          r(a, function(a) {
+            a.done(c)
+          })
+        };
+        f.prototype = {
+          setHost: function(a) {
+            this.host = a || {}
+          },
+          done: function(a) {
+            2 === this._state ? a() : this._doneCallbacks.push(a)
+          },
+          progress: E,
+          getPromise: function() {
+            if (!this.promise) {
+              var b = this;
+              this.promise = a(function(a, c) {
+                b.done(function(b) {
+                  !1 === b ? c() : a()
+                })
+              })
+            }
+            return this.promise
+          },
+          then: function(a, b) {
+            return this.getPromise().then(a, b)
+          },
+          "catch": function(a) {
+            return this.getPromise()["catch"](a)
+          },
+          "finally": function(a) {
+            return this.getPromise()["finally"](a)
+          },
+          pause: function() {
+            this.host.pause && this.host.pause()
+          },
+          resume: function() {
+            this.host.resume &&
+              this.host.resume()
+          },
+          end: function() {
+            this.host.end && this.host.end();
+            this._resolve(!0)
+          },
+          cancel: function() {
+            this.host.cancel && this.host.cancel();
+            this._resolve(!1)
+          },
+          complete: function(a) {
+            var b = this;
+            0 === b._state && (b._state = 1, b._tick(function() {
+              b._resolve(a)
+            }))
+          },
+          _resolve: function(a) {
+            2 !== this._state && (r(this._doneCallbacks, function(b) {
+              b(a)
+            }), this._doneCallbacks.length = 0, this._state = 2)
+          }
+        };
+        return f
+      }]
+    },
+    Df = function() {
+      this.$get = ["$$rAF", "$q", "$$AnimateRunner", function(a, b, d) {
+        return function(b, e) {
+          function f() {
+            a(function() {
+              g.addClass &&
+                (b.addClass(g.addClass), g.addClass = null);
+              g.removeClass && (b.removeClass(g.removeClass), g.removeClass = null);
+              g.to && (b.css(g.to), g.to = null);
+              k || h.complete();
+              k = !0
+            });
+            return h
+          }
+          var g = e || {};
+          g.$$prepared || (g = Ia(g));
+          g.cleanupStyles && (g.from = g.to = null);
+          g.from && (b.css(g.from), g.from = null);
+          var k, h = new d;
+          return {
+            start: f,
+            end: f
+          }
+        }
+      }]
+    },
+    $ = F("$compile"),
+    uc = new function() {};
+  Zc.$inject = ["$provide", "$$sanitizeUriProvider"];
+  Kb.prototype.isFirstChange = function() {
+    return this.previousValue === uc
+  };
+  var rd = /^((?:x|data)[:\-_])/i,
+    Jg =
+    /[:\-_]+(.)/g,
+    xd = F("$controller"),
+    wd = /^(\S+)(\s+as\s+([\w$]+))?$/,
+    Of = function() {
+      this.$get = ["$document", function(a) {
+        return function(b) {
+          b ? !b.nodeType && b instanceof x && (b = b[0]) : b = a[0].body;
+          return b.offsetWidth + 1
+        }
+      }]
+    },
+    yd = "application/json",
+    xc = {
+      "Content-Type": yd + ";charset=utf-8"
+    },
+    Mg = /^\[|^\{(?!\{)/,
+    Ng = {
+      "[": /]$/,
+      "{": /}$/
+    },
+    Lg = /^\)]\}',?\n/,
+    Lb = F("$http"),
+    Ma = ca.$interpolateMinErr = F("$interpolate");
+  Ma.throwNoconcat = function(a) {
+    throw Ma("noconcat", a);
+  };
+  Ma.interr = function(a, b) {
+    return Ma("interr", a, b.toString())
+  };
+  var Qg = F("$interval"),
+    Xf = function() {
+      this.$get = function() {
+        function a(a) {
+          var b = function(a) {
+            b.data = a;
+            b.called = !0
+          };
+          b.id = a;
+          return b
+        }
+        var b = ca.callbacks,
+          d = {};
+        return {
+          createCallback: function(c) {
+            c = "_" + (b.$$counter++).toString(36);
+            var e = "angular.callbacks." + c,
+              f = a(c);
+            d[e] = b[c] = f;
+            return e
+          },
+          wasCalled: function(a) {
+            return d[a].called
+          },
+          getResponse: function(a) {
+            return d[a].data
+          },
+          removeCallback: function(a) {
+            delete b[d[a].id];
+            delete d[a]
+          }
+        }
+      }
+    },
+    uh = /^([^?#]*)(\?([^#]*))?(#(.*))?$/,
+    Rg = {
+      http: 80,
+      https: 443,
+      ftp: 21
+    },
+    kb = F("$location"),
+    Sg = /^\s*[\\/]{2,}/,
+    vh = {
+      $$absUrl: "",
+      $$html5: !1,
+      $$replace: !1,
+      $$compose: function() {
+        for (var a = this.$$path, b = this.$$hash, d = Ce(this.$$search), b = b ? "#" + ic(b) : "", a = a.split("/"), c = a.length; c--;) a[c] = ic(a[c].replace(/%2F/g, "/"));
+        this.$$url = a.join("/") + (d ? "?" + d : "") + b;
+        this.$$absUrl = this.$$normalizeUrl(this.$$url);
+        this.$$urlUpdatedByLocation = !0
+      },
+      absUrl: Mb("$$absUrl"),
+      url: function(a) {
+        if (A(a)) return this.$$url;
+        var b = uh.exec(a);
+        (b[1] || "" === a) && this.path(decodeURIComponent(b[1]));
+        (b[2] || b[1] || "" === a) && this.search(b[3] ||
+          "");
+        this.hash(b[5] || "");
+        return this
+      },
+      protocol: Mb("$$protocol"),
+      host: Mb("$$host"),
+      port: Mb("$$port"),
+      path: Fd("$$path", function(a) {
+        a = null !== a ? a.toString() : "";
+        return "/" === a.charAt(0) ? a : "/" + a
+      }),
+      search: function(a, b) {
+        switch (arguments.length) {
+          case 0:
+            return this.$$search;
+          case 1:
+            if (C(a) || X(a)) a = a.toString(), this.$$search = hc(a);
+            else if (D(a)) a = Ia(a, {}), r(a, function(b, c) {
+              null == b && delete a[c]
+            }), this.$$search = a;
+            else throw kb("isrcharg");
+            break;
+          default:
+            A(b) || null === b ? delete this.$$search[a] : this.$$search[a] = b
+        }
+        this.$$compose();
+        return this
+      },
+      hash: Fd("$$hash", function(a) {
+        return null !== a ? a.toString() : ""
+      }),
+      replace: function() {
+        this.$$replace = !0;
+        return this
+      }
+    };
+  r([Ed, Ac, zc], function(a) {
+    a.prototype = Object.create(vh);
+    a.prototype.state = function(b) {
+      if (!arguments.length) return this.$$state;
+      if (a !== zc || !this.$$html5) throw kb("nostate");
+      this.$$state = A(b) ? null : b;
+      this.$$urlUpdatedByLocation = !0;
+      return this
+    }
+  });
+  var Ya = F("$parse"),
+    Wg = {}.constructor.prototype.valueOf,
+    Vb = T();
+  r("+ - * / % === !== == != < > <= >= && || ! = |".split(" "), function(a) {
+    Vb[a] = !0
+  });
+  var wh = {
+      n: "\n",
+      f: "\f",
+      r: "\r",
+      t: "\t",
+      v: "\v",
+      "'": "'",
+      '"': '"'
+    },
+    Ob = function(a) {
+      this.options = a
+    };
+  Ob.prototype = {
+    constructor: Ob,
+    lex: function(a) {
+      this.text = a;
+      this.index = 0;
+      for (this.tokens = []; this.index < this.text.length;)
+        if (a = this.text.charAt(this.index), '"' === a || "'" === a) this.readString(a);
+        else if (this.isNumber(a) || "." === a && this.isNumber(this.peek())) this.readNumber();
+      else if (this.isIdentifierStart(this.peekMultichar())) this.readIdent();
+      else if (this.is(a, "(){}[].,;:?")) this.tokens.push({
+        index: this.index,
+        text: a
+      }), this.index++;
+      else if (this.isWhitespace(a)) this.index++;
+      else {
+        var b = a + this.peek(),
+          d = b + this.peek(2),
+          c = Vb[b],
+          e = Vb[d];
+        Vb[a] || c || e ? (a = e ? d : c ? b : a, this.tokens.push({
+          index: this.index,
+          text: a,
+          operator: !0
+        }), this.index += a.length) : this.throwError("Unexpected next character ", this.index, this.index + 1)
+      }
+      return this.tokens
+    },
+    is: function(a, b) {
+      return -1 !== b.indexOf(a)
+    },
+    peek: function(a) {
+      a = a || 1;
+      return this.index + a < this.text.length ? this.text.charAt(this.index + a) : !1
+    },
+    isNumber: function(a) {
+      return "0" <= a && "9" >= a && "string" ===
+        typeof a
+    },
+    isWhitespace: function(a) {
+      return " " === a || "\r" === a || "\t" === a || "\n" === a || "\v" === a || "\u00a0" === a
+    },
+    isIdentifierStart: function(a) {
+      return this.options.isIdentifierStart ? this.options.isIdentifierStart(a, this.codePointAt(a)) : this.isValidIdentifierStart(a)
+    },
+    isValidIdentifierStart: function(a) {
+      return "a" <= a && "z" >= a || "A" <= a && "Z" >= a || "_" === a || "$" === a
+    },
+    isIdentifierContinue: function(a) {
+      return this.options.isIdentifierContinue ? this.options.isIdentifierContinue(a, this.codePointAt(a)) : this.isValidIdentifierContinue(a)
+    },
+    isValidIdentifierContinue: function(a, b) {
+      return this.isValidIdentifierStart(a, b) || this.isNumber(a)
+    },
+    codePointAt: function(a) {
+      return 1 === a.length ? a.charCodeAt(0) : (a.charCodeAt(0) << 10) + a.charCodeAt(1) - 56613888
+    },
+    peekMultichar: function() {
+      var a = this.text.charAt(this.index),
+        b = this.peek();
+      if (!b) return a;
+      var d = a.charCodeAt(0),
+        c = b.charCodeAt(0);
+      return 55296 <= d && 56319 >= d && 56320 <= c && 57343 >= c ? a + b : a
+    },
+    isExpOperator: function(a) {
+      return "-" === a || "+" === a || this.isNumber(a)
+    },
+    throwError: function(a, b, d) {
+      d = d || this.index;
+      b =
+        w(b) ? "s " + b + "-" + this.index + " [" + this.text.substring(b, d) + "]" : " " + d;
+      throw Ya("lexerr", a, b, this.text);
+    },
+    readNumber: function() {
+      for (var a = "", b = this.index; this.index < this.text.length;) {
+        var d = K(this.text.charAt(this.index));
+        if ("." === d || this.isNumber(d)) a += d;
+        else {
+          var c = this.peek();
+          if ("e" === d && this.isExpOperator(c)) a += d;
+          else if (this.isExpOperator(d) && c && this.isNumber(c) && "e" === a.charAt(a.length - 1)) a += d;
+          else if (!this.isExpOperator(d) || c && this.isNumber(c) || "e" !== a.charAt(a.length - 1)) break;
+          else this.throwError("Invalid exponent")
+        }
+        this.index++
+      }
+      this.tokens.push({
+        index: b,
+        text: a,
+        constant: !0,
+        value: Number(a)
+      })
+    },
+    readIdent: function() {
+      var a = this.index;
+      for (this.index += this.peekMultichar().length; this.index < this.text.length;) {
+        var b = this.peekMultichar();
+        if (!this.isIdentifierContinue(b)) break;
+        this.index += b.length
+      }
+      this.tokens.push({
+        index: a,
+        text: this.text.slice(a, this.index),
+        identifier: !0
+      })
+    },
+    readString: function(a) {
+      var b = this.index;
+      this.index++;
+      for (var d = "", c = a, e = !1; this.index < this.text.length;) {
+        var f = this.text.charAt(this.index),
+          c = c + f;
+        if (e) "u" === f ? (e = this.text.substring(this.index +
+          1, this.index + 5), e.match(/[\da-f]{4}/i) || this.throwError("Invalid unicode escape [\\u" + e + "]"), this.index += 4, d += String.fromCharCode(parseInt(e, 16))) : d += wh[f] || f, e = !1;
+        else if ("\\" === f) e = !0;
+        else {
+          if (f === a) {
+            this.index++;
+            this.tokens.push({
+              index: b,
+              text: c,
+              constant: !0,
+              value: d
+            });
+            return
+          }
+          d += f
+        }
+        this.index++
+      }
+      this.throwError("Unterminated quote", b)
+    }
+  };
+  var q = function(a, b) {
+    this.lexer = a;
+    this.options = b
+  };
+  q.Program = "Program";
+  q.ExpressionStatement = "ExpressionStatement";
+  q.AssignmentExpression = "AssignmentExpression";
+  q.ConditionalExpression =
+    "ConditionalExpression";
+  q.LogicalExpression = "LogicalExpression";
+  q.BinaryExpression = "BinaryExpression";
+  q.UnaryExpression = "UnaryExpression";
+  q.CallExpression = "CallExpression";
+  q.MemberExpression = "MemberExpression";
+  q.Identifier = "Identifier";
+  q.Literal = "Literal";
+  q.ArrayExpression = "ArrayExpression";
+  q.Property = "Property";
+  q.ObjectExpression = "ObjectExpression";
+  q.ThisExpression = "ThisExpression";
+  q.LocalsExpression = "LocalsExpression";
+  q.NGValueParameter = "NGValueParameter";
+  q.prototype = {
+    ast: function(a) {
+      this.text =
+        a;
+      this.tokens = this.lexer.lex(a);
+      a = this.program();
+      0 !== this.tokens.length && this.throwError("is an unexpected token", this.tokens[0]);
+      return a
+    },
+    program: function() {
+      for (var a = [];;)
+        if (0 < this.tokens.length && !this.peek("}", ")", ";", "]") && a.push(this.expressionStatement()), !this.expect(";")) return {
+          type: q.Program,
+          body: a
+        }
+    },
+    expressionStatement: function() {
+      return {
+        type: q.ExpressionStatement,
+        expression: this.filterChain()
+      }
+    },
+    filterChain: function() {
+      for (var a = this.expression(); this.expect("|");) a = this.filter(a);
+      return a
+    },
+    expression: function() {
+      return this.assignment()
+    },
+    assignment: function() {
+      var a = this.ternary();
+      if (this.expect("=")) {
+        if (!Jd(a)) throw Ya("lval");
+        a = {
+          type: q.AssignmentExpression,
+          left: a,
+          right: this.assignment(),
+          operator: "="
+        }
+      }
+      return a
+    },
+    ternary: function() {
+      var a = this.logicalOR(),
+        b, d;
+      return this.expect("?") && (b = this.expression(), this.consume(":")) ? (d = this.expression(), {
+        type: q.ConditionalExpression,
+        test: a,
+        alternate: b,
+        consequent: d
+      }) : a
+    },
+    logicalOR: function() {
+      for (var a = this.logicalAND(); this.expect("||");) a = {
+        type: q.LogicalExpression,
+        operator: "||",
+        left: a,
+        right: this.logicalAND()
+      };
+      return a
+    },
+    logicalAND: function() {
+      for (var a = this.equality(); this.expect("&&");) a = {
+        type: q.LogicalExpression,
+        operator: "&&",
+        left: a,
+        right: this.equality()
+      };
+      return a
+    },
+    equality: function() {
+      for (var a = this.relational(), b; b = this.expect("==", "!=", "===", "!==");) a = {
+        type: q.BinaryExpression,
+        operator: b.text,
+        left: a,
+        right: this.relational()
+      };
+      return a
+    },
+    relational: function() {
+      for (var a = this.additive(), b; b = this.expect("<", ">", "<=", ">=");) a = {
+        type: q.BinaryExpression,
+        operator: b.text,
+        left: a,
+        right: this.additive()
+      };
+      return a
+    },
+    additive: function() {
+      for (var a = this.multiplicative(), b; b = this.expect("+", "-");) a = {
+        type: q.BinaryExpression,
+        operator: b.text,
+        left: a,
+        right: this.multiplicative()
+      };
+      return a
+    },
+    multiplicative: function() {
+      for (var a = this.unary(), b; b = this.expect("*", "/", "%");) a = {
+        type: q.BinaryExpression,
+        operator: b.text,
+        left: a,
+        right: this.unary()
+      };
+      return a
+    },
+    unary: function() {
+      var a;
+      return (a = this.expect("+", "-", "!")) ? {
+        type: q.UnaryExpression,
+        operator: a.text,
+        prefix: !0,
+        argument: this.unary()
+      } : this.primary()
+    },
+    primary: function() {
+      var a;
+      this.expect("(") ? (a = this.filterChain(), this.consume(")")) : this.expect("[") ? a = this.arrayDeclaration() : this.expect("{") ? a = this.object() : this.selfReferential.hasOwnProperty(this.peek().text) ? a = Ia(this.selfReferential[this.consume().text]) : this.options.literals.hasOwnProperty(this.peek().text) ? a = {
+        type: q.Literal,
+        value: this.options.literals[this.consume().text]
+      } : this.peek().identifier ? a = this.identifier() : this.peek().constant ? a = this.constant() : this.throwError("not a primary expression",
+        this.peek());
+      for (var b; b = this.expect("(", "[", ".");) "(" === b.text ? (a = {
+        type: q.CallExpression,
+        callee: a,
+        arguments: this.parseArguments()
+      }, this.consume(")")) : "[" === b.text ? (a = {
+        type: q.MemberExpression,
+        object: a,
+        property: this.expression(),
+        computed: !0
+      }, this.consume("]")) : "." === b.text ? a = {
+        type: q.MemberExpression,
+        object: a,
+        property: this.identifier(),
+        computed: !1
+      } : this.throwError("IMPOSSIBLE");
+      return a
+    },
+    filter: function(a) {
+      a = [a];
+      for (var b = {
+          type: q.CallExpression,
+          callee: this.identifier(),
+          arguments: a,
+          filter: !0
+        }; this.expect(":");) a.push(this.expression());
+      return b
+    },
+    parseArguments: function() {
+      var a = [];
+      if (")" !== this.peekToken().text) {
+        do a.push(this.filterChain()); while (this.expect(","))
+      }
+      return a
+    },
+    identifier: function() {
+      var a = this.consume();
+      a.identifier || this.throwError("is not a valid identifier", a);
+      return {
+        type: q.Identifier,
+        name: a.text
+      }
+    },
+    constant: function() {
+      return {
+        type: q.Literal,
+        value: this.consume().value
+      }
+    },
+    arrayDeclaration: function() {
+      var a = [];
+      if ("]" !== this.peekToken().text) {
+        do {
+          if (this.peek("]")) break;
+          a.push(this.expression())
+        } while (this.expect(","))
+      }
+      this.consume("]");
+      return {
+        type: q.ArrayExpression,
+        elements: a
+      }
+    },
+    object: function() {
+      var a = [],
+        b;
+      if ("}" !== this.peekToken().text) {
+        do {
+          if (this.peek("}")) break;
+          b = {
+            type: q.Property,
+            kind: "init"
+          };
+          this.peek().constant ? (b.key = this.constant(), b.computed = !1, this.consume(":"), b.value = this.expression()) : this.peek().identifier ? (b.key = this.identifier(), b.computed = !1, this.peek(":") ? (this.consume(":"), b.value = this.expression()) : b.value = b.key) : this.peek("[") ? (this.consume("["), b.key = this.expression(), this.consume("]"), b.computed = !0, this.consume(":"),
+            b.value = this.expression()) : this.throwError("invalid key", this.peek());
+          a.push(b)
+        } while (this.expect(","))
+      }
+      this.consume("}");
+      return {
+        type: q.ObjectExpression,
+        properties: a
+      }
+    },
+    throwError: function(a, b) {
+      throw Ya("syntax", b.text, a, b.index + 1, this.text, this.text.substring(b.index));
+    },
+    consume: function(a) {
+      if (0 === this.tokens.length) throw Ya("ueoe", this.text);
+      var b = this.expect(a);
+      b || this.throwError("is unexpected, expecting [" + a + "]", this.peek());
+      return b
+    },
+    peekToken: function() {
+      if (0 === this.tokens.length) throw Ya("ueoe",
+        this.text);
+      return this.tokens[0]
+    },
+    peek: function(a, b, d, c) {
+      return this.peekAhead(0, a, b, d, c)
+    },
+    peekAhead: function(a, b, d, c, e) {
+      if (this.tokens.length > a) {
+        a = this.tokens[a];
+        var f = a.text;
+        if (f === b || f === d || f === c || f === e || !(b || d || c || e)) return a
+      }
+      return !1
+    },
+    expect: function(a, b, d, c) {
+      return (a = this.peek(a, b, d, c)) ? (this.tokens.shift(), a) : !1
+    },
+    selfReferential: {
+      "this": {
+        type: q.ThisExpression
+      },
+      $locals: {
+        type: q.LocalsExpression
+      }
+    }
+  };
+  var Hd = 2;
+  Ld.prototype = {
+    compile: function(a) {
+      var b = this;
+      this.state = {
+        nextId: 0,
+        filters: {},
+        fn: {
+          vars: [],
+          body: [],
+          own: {}
+        },
+        assign: {
+          vars: [],
+          body: [],
+          own: {}
+        },
+        inputs: []
+      };
+      Z(a, b.$filter);
+      var d = "",
+        c;
+      this.stage = "assign";
+      if (c = Kd(a)) this.state.computing = "assign", d = this.nextId(), this.recurse(c, d), this.return_(d), d = "fn.assign=" + this.generateFunction("assign", "s,v,l");
+      c = Id(a.body);
+      b.stage = "inputs";
+      r(c, function(a, c) {
+        var d = "fn" + c;
+        b.state[d] = {
+          vars: [],
+          body: [],
+          own: {}
+        };
+        b.state.computing = d;
+        var k = b.nextId();
+        b.recurse(a, k);
+        b.return_(k);
+        b.state.inputs.push({
+          name: d,
+          isPure: a.isPure
+        });
+        a.watchId = c
+      });
+      this.state.computing = "fn";
+      this.stage =
+        "main";
+      this.recurse(a);
+      a = '"' + this.USE + " " + this.STRICT + '";\n' + this.filterPrefix() + "var fn=" + this.generateFunction("fn", "s,l,a,i") + d + this.watchFns() + "return fn;";
+      a = (new Function("$filter", "getStringValue", "ifDefined", "plus", a))(this.$filter, Tg, Ug, Gd);
+      this.state = this.stage = void 0;
+      return a
+    },
+    USE: "use",
+    STRICT: "strict",
+    watchFns: function() {
+      var a = [],
+        b = this.state.inputs,
+        d = this;
+      r(b, function(b) {
+        a.push("var " + b.name + "=" + d.generateFunction(b.name, "s"));
+        b.isPure && a.push(b.name, ".isPure=" + JSON.stringify(b.isPure) +
+          ";")
+      });
+      b.length && a.push("fn.inputs=[" + b.map(function(a) {
+        return a.name
+      }).join(",") + "];");
+      return a.join("")
+    },
+    generateFunction: function(a, b) {
+      return "function(" + b + "){" + this.varsPrefix(a) + this.body(a) + "};"
+    },
+    filterPrefix: function() {
+      var a = [],
+        b = this;
+      r(this.state.filters, function(d, c) {
+        a.push(d + "=$filter(" + b.escape(c) + ")")
+      });
+      return a.length ? "var " + a.join(",") + ";" : ""
+    },
+    varsPrefix: function(a) {
+      return this.state[a].vars.length ? "var " + this.state[a].vars.join(",") + ";" : ""
+    },
+    body: function(a) {
+      return this.state[a].body.join("")
+    },
+    recurse: function(a, b, d, c, e, f) {
+      var g, k, h = this,
+        l, m, p;
+      c = c || E;
+      if (!f && w(a.watchId)) b = b || this.nextId(), this.if_("i", this.lazyAssign(b, this.computedMember("i", a.watchId)), this.lazyRecurse(a, b, d, c, e, !0));
+      else switch (a.type) {
+        case q.Program:
+          r(a.body, function(b, c) {
+            h.recurse(b.expression, void 0, void 0, function(a) {
+              k = a
+            });
+            c !== a.body.length - 1 ? h.current().body.push(k, ";") : h.return_(k)
+          });
+          break;
+        case q.Literal:
+          m = this.escape(a.value);
+          this.assign(b, m);
+          c(b || m);
+          break;
+        case q.UnaryExpression:
+          this.recurse(a.argument, void 0,
+            void 0,
+            function(a) {
+              k = a
+            });
+          m = a.operator + "(" + this.ifDefined(k, 0) + ")";
+          this.assign(b, m);
+          c(m);
+          break;
+        case q.BinaryExpression:
+          this.recurse(a.left, void 0, void 0, function(a) {
+            g = a
+          });
+          this.recurse(a.right, void 0, void 0, function(a) {
+            k = a
+          });
+          m = "+" === a.operator ? this.plus(g, k) : "-" === a.operator ? this.ifDefined(g, 0) + a.operator + this.ifDefined(k, 0) : "(" + g + ")" + a.operator + "(" + k + ")";
+          this.assign(b, m);
+          c(m);
+          break;
+        case q.LogicalExpression:
+          b = b || this.nextId();
+          h.recurse(a.left, b);
+          h.if_("&&" === a.operator ? b : h.not(b), h.lazyRecurse(a.right,
+            b));
+          c(b);
+          break;
+        case q.ConditionalExpression:
+          b = b || this.nextId();
+          h.recurse(a.test, b);
+          h.if_(b, h.lazyRecurse(a.alternate, b), h.lazyRecurse(a.consequent, b));
+          c(b);
+          break;
+        case q.Identifier:
+          b = b || this.nextId();
+          d && (d.context = "inputs" === h.stage ? "s" : this.assign(this.nextId(), this.getHasOwnProperty("l", a.name) + "?l:s"), d.computed = !1, d.name = a.name);
+          h.if_("inputs" === h.stage || h.not(h.getHasOwnProperty("l", a.name)), function() {
+            h.if_("inputs" === h.stage || "s", function() {
+              e && 1 !== e && h.if_(h.isNull(h.nonComputedMember("s", a.name)),
+                h.lazyAssign(h.nonComputedMember("s", a.name), "{}"));
+              h.assign(b, h.nonComputedMember("s", a.name))
+            })
+          }, b && h.lazyAssign(b, h.nonComputedMember("l", a.name)));
+          c(b);
+          break;
+        case q.MemberExpression:
+          g = d && (d.context = this.nextId()) || this.nextId();
+          b = b || this.nextId();
+          h.recurse(a.object, g, void 0, function() {
+            h.if_(h.notNull(g), function() {
+              a.computed ? (k = h.nextId(), h.recurse(a.property, k), h.getStringValue(k), e && 1 !== e && h.if_(h.not(h.computedMember(g, k)), h.lazyAssign(h.computedMember(g, k), "{}")), m = h.computedMember(g, k), h.assign(b,
+                m), d && (d.computed = !0, d.name = k)) : (e && 1 !== e && h.if_(h.isNull(h.nonComputedMember(g, a.property.name)), h.lazyAssign(h.nonComputedMember(g, a.property.name), "{}")), m = h.nonComputedMember(g, a.property.name), h.assign(b, m), d && (d.computed = !1, d.name = a.property.name))
+            }, function() {
+              h.assign(b, "undefined")
+            });
+            c(b)
+          }, !!e);
+          break;
+        case q.CallExpression:
+          b = b || this.nextId();
+          a.filter ? (k = h.filter(a.callee.name), l = [], r(a.arguments, function(a) {
+              var b = h.nextId();
+              h.recurse(a, b);
+              l.push(b)
+            }), m = k + "(" + l.join(",") + ")", h.assign(b, m), c(b)) :
+            (k = h.nextId(), g = {}, l = [], h.recurse(a.callee, k, g, function() {
+              h.if_(h.notNull(k), function() {
+                r(a.arguments, function(b) {
+                  h.recurse(b, a.constant ? void 0 : h.nextId(), void 0, function(a) {
+                    l.push(a)
+                  })
+                });
+                m = g.name ? h.member(g.context, g.name, g.computed) + "(" + l.join(",") + ")" : k + "(" + l.join(",") + ")";
+                h.assign(b, m)
+              }, function() {
+                h.assign(b, "undefined")
+              });
+              c(b)
+            }));
+          break;
+        case q.AssignmentExpression:
+          k = this.nextId();
+          g = {};
+          this.recurse(a.left, void 0, g, function() {
+            h.if_(h.notNull(g.context), function() {
+              h.recurse(a.right, k);
+              m = h.member(g.context,
+                g.name, g.computed) + a.operator + k;
+              h.assign(b, m);
+              c(b || m)
+            })
+          }, 1);
+          break;
+        case q.ArrayExpression:
+          l = [];
+          r(a.elements, function(b) {
+            h.recurse(b, a.constant ? void 0 : h.nextId(), void 0, function(a) {
+              l.push(a)
+            })
+          });
+          m = "[" + l.join(",") + "]";
+          this.assign(b, m);
+          c(b || m);
+          break;
+        case q.ObjectExpression:
+          l = [];
+          p = !1;
+          r(a.properties, function(a) {
+            a.computed && (p = !0)
+          });
+          p ? (b = b || this.nextId(), this.assign(b, "{}"), r(a.properties, function(a) {
+            a.computed ? (g = h.nextId(), h.recurse(a.key, g)) : g = a.key.type === q.Identifier ? a.key.name : "" + a.key.value;
+            k = h.nextId();
+            h.recurse(a.value, k);
+            h.assign(h.member(b, g, a.computed), k)
+          })) : (r(a.properties, function(b) {
+            h.recurse(b.value, a.constant ? void 0 : h.nextId(), void 0, function(a) {
+              l.push(h.escape(b.key.type === q.Identifier ? b.key.name : "" + b.key.value) + ":" + a)
+            })
+          }), m = "{" + l.join(",") + "}", this.assign(b, m));
+          c(b || m);
+          break;
+        case q.ThisExpression:
+          this.assign(b, "s");
+          c(b || "s");
+          break;
+        case q.LocalsExpression:
+          this.assign(b, "l");
+          c(b || "l");
+          break;
+        case q.NGValueParameter:
+          this.assign(b, "v"), c(b || "v")
+      }
+    },
+    getHasOwnProperty: function(a, b) {
+      var d = a + "." +
+        b,
+        c = this.current().own;
+      c.hasOwnProperty(d) || (c[d] = this.nextId(!1, a + "&&(" + this.escape(b) + " in " + a + ")"));
+      return c[d]
+    },
+    assign: function(a, b) {
+      if (a) return this.current().body.push(a, "=", b, ";"), a
+    },
+    filter: function(a) {
+      this.state.filters.hasOwnProperty(a) || (this.state.filters[a] = this.nextId(!0));
+      return this.state.filters[a]
+    },
+    ifDefined: function(a, b) {
+      return "ifDefined(" + a + "," + this.escape(b) + ")"
+    },
+    plus: function(a, b) {
+      return "plus(" + a + "," + b + ")"
+    },
+    return_: function(a) {
+      this.current().body.push("return ", a, ";")
+    },
+    if_: function(a,
+      b, d) {
+      if (!0 === a) b();
+      else {
+        var c = this.current().body;
+        c.push("if(", a, "){");
+        b();
+        c.push("}");
+        d && (c.push("else{"), d(), c.push("}"))
+      }
+    },
+    not: function(a) {
+      return "!(" + a + ")"
+    },
+    isNull: function(a) {
+      return a + "==null"
+    },
+    notNull: function(a) {
+      return a + "!=null"
+    },
+    nonComputedMember: function(a, b) {
+      var d = /[^$_a-zA-Z0-9]/g;
+      return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b) ? a + "." + b : a + '["' + b.replace(d, this.stringEscapeFn) + '"]'
+    },
+    computedMember: function(a, b) {
+      return a + "[" + b + "]"
+    },
+    member: function(a, b, d) {
+      return d ? this.computedMember(a, b) : this.nonComputedMember(a,
+        b)
+    },
+    getStringValue: function(a) {
+      this.assign(a, "getStringValue(" + a + ")")
+    },
+    lazyRecurse: function(a, b, d, c, e, f) {
+      var g = this;
+      return function() {
+        g.recurse(a, b, d, c, e, f)
+      }
+    },
+    lazyAssign: function(a, b) {
+      var d = this;
+      return function() {
+        d.assign(a, b)
+      }
+    },
+    stringEscapeRegex: /[^ a-zA-Z0-9]/g,
+    stringEscapeFn: function(a) {
+      return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
+    },
+    escape: function(a) {
+      if (C(a)) return "'" + a.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'";
+      if (X(a)) return a.toString();
+      if (!0 === a) return "true";
+      if (!1 ===
+        a) return "false";
+      if (null === a) return "null";
+      if ("undefined" === typeof a) return "undefined";
+      throw Ya("esc");
+    },
+    nextId: function(a, b) {
+      var d = "v" + this.state.nextId++;
+      a || this.current().vars.push(d + (b ? "=" + b : ""));
+      return d
+    },
+    current: function() {
+      return this.state[this.state.computing]
+    }
+  };
+  Md.prototype = {
+    compile: function(a) {
+      var b = this;
+      Z(a, b.$filter);
+      var d, c;
+      if (d = Kd(a)) c = this.recurse(d);
+      d = Id(a.body);
+      var e;
+      d && (e = [], r(d, function(a, c) {
+        var d = b.recurse(a);
+        d.isPure = a.isPure;
+        a.input = d;
+        e.push(d);
+        a.watchId = c
+      }));
+      var f = [];
+      r(a.body,
+        function(a) {
+          f.push(b.recurse(a.expression))
+        });
+      a = 0 === a.body.length ? E : 1 === a.body.length ? f[0] : function(a, b) {
+        var c;
+        r(f, function(d) {
+          c = d(a, b)
+        });
+        return c
+      };
+      c && (a.assign = function(a, b, d) {
+        return c(a, d, b)
+      });
+      e && (a.inputs = e);
+      return a
+    },
+    recurse: function(a, b, d) {
+      var c, e, f = this,
+        g;
+      if (a.input) return this.inputs(a.input, a.watchId);
+      switch (a.type) {
+        case q.Literal:
+          return this.value(a.value, b);
+        case q.UnaryExpression:
+          return e = this.recurse(a.argument), this["unary" + a.operator](e, b);
+        case q.BinaryExpression:
+          return c = this.recurse(a.left),
+            e = this.recurse(a.right), this["binary" + a.operator](c, e, b);
+        case q.LogicalExpression:
+          return c = this.recurse(a.left), e = this.recurse(a.right), this["binary" + a.operator](c, e, b);
+        case q.ConditionalExpression:
+          return this["ternary?:"](this.recurse(a.test), this.recurse(a.alternate), this.recurse(a.consequent), b);
+        case q.Identifier:
+          return f.identifier(a.name, b, d);
+        case q.MemberExpression:
+          return c = this.recurse(a.object, !1, !!d), a.computed || (e = a.property.name), a.computed && (e = this.recurse(a.property)), a.computed ? this.computedMember(c,
+            e, b, d) : this.nonComputedMember(c, e, b, d);
+        case q.CallExpression:
+          return g = [], r(a.arguments, function(a) {
+            g.push(f.recurse(a))
+          }), a.filter && (e = this.$filter(a.callee.name)), a.filter || (e = this.recurse(a.callee, !0)), a.filter ? function(a, c, d, f) {
+            for (var p = [], n = 0; n < g.length; ++n) p.push(g[n](a, c, d, f));
+            a = e.apply(void 0, p, f);
+            return b ? {
+              context: void 0,
+              name: void 0,
+              value: a
+            } : a
+          } : function(a, c, d, f) {
+            var p = e(a, c, d, f),
+              n;
+            if (null != p.value) {
+              n = [];
+              for (var s = 0; s < g.length; ++s) n.push(g[s](a, c, d, f));
+              n = p.value.apply(p.context, n)
+            }
+            return b ? {
+              value: n
+            } : n
+          };
+        case q.AssignmentExpression:
+          return c = this.recurse(a.left, !0, 1), e = this.recurse(a.right),
+            function(a, d, f, g) {
+              var p = c(a, d, f, g);
+              a = e(a, d, f, g);
+              p.context[p.name] = a;
+              return b ? {
+                value: a
+              } : a
+            };
+        case q.ArrayExpression:
+          return g = [], r(a.elements, function(a) {
+              g.push(f.recurse(a))
+            }),
+            function(a, c, d, e) {
+              for (var f = [], n = 0; n < g.length; ++n) f.push(g[n](a, c, d, e));
+              return b ? {
+                value: f
+              } : f
+            };
+        case q.ObjectExpression:
+          return g = [], r(a.properties, function(a) {
+              a.computed ? g.push({
+                  key: f.recurse(a.key),
+                  computed: !0,
+                  value: f.recurse(a.value)
+                }) :
+                g.push({
+                  key: a.key.type === q.Identifier ? a.key.name : "" + a.key.value,
+                  computed: !1,
+                  value: f.recurse(a.value)
+                })
+            }),
+            function(a, c, d, e) {
+              for (var f = {}, n = 0; n < g.length; ++n) g[n].computed ? f[g[n].key(a, c, d, e)] = g[n].value(a, c, d, e) : f[g[n].key] = g[n].value(a, c, d, e);
+              return b ? {
+                value: f
+              } : f
+            };
+        case q.ThisExpression:
+          return function(a) {
+            return b ? {
+              value: a
+            } : a
+          };
+        case q.LocalsExpression:
+          return function(a, c) {
+            return b ? {
+              value: c
+            } : c
+          };
+        case q.NGValueParameter:
+          return function(a, c, d) {
+            return b ? {
+              value: d
+            } : d
+          }
+      }
+    },
+    "unary+": function(a, b) {
+      return function(d,
+        c, e, f) {
+        d = a(d, c, e, f);
+        d = w(d) ? +d : 0;
+        return b ? {
+          value: d
+        } : d
+      }
+    },
+    "unary-": function(a, b) {
+      return function(d, c, e, f) {
+        d = a(d, c, e, f);
+        d = w(d) ? -d : -0;
+        return b ? {
+          value: d
+        } : d
+      }
+    },
+    "unary!": function(a, b) {
+      return function(d, c, e, f) {
+        d = !a(d, c, e, f);
+        return b ? {
+          value: d
+        } : d
+      }
+    },
+    "binary+": function(a, b, d) {
+      return function(c, e, f, g) {
+        var k = a(c, e, f, g);
+        c = b(c, e, f, g);
+        k = Gd(k, c);
+        return d ? {
+          value: k
+        } : k
+      }
+    },
+    "binary-": function(a, b, d) {
+      return function(c, e, f, g) {
+        var k = a(c, e, f, g);
+        c = b(c, e, f, g);
+        k = (w(k) ? k : 0) - (w(c) ? c : 0);
+        return d ? {
+          value: k
+        } : k
+      }
+    },
+    "binary*": function(a, b,
+      d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) * b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary/": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) / b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary%": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) % b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary===": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) === b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary!==": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) !== b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary==": function(a, b, d) {
+      return function(c,
+        e, f, g) {
+        c = a(c, e, f, g) == b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary!=": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) != b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary<": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) < b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary>": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) > b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary<=": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) <= b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary>=": function(a, b, d) {
+      return function(c, e, f, g) {
+        c =
+          a(c, e, f, g) >= b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary&&": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) && b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "binary||": function(a, b, d) {
+      return function(c, e, f, g) {
+        c = a(c, e, f, g) || b(c, e, f, g);
+        return d ? {
+          value: c
+        } : c
+      }
+    },
+    "ternary?:": function(a, b, d, c) {
+      return function(e, f, g, k) {
+        e = a(e, f, g, k) ? b(e, f, g, k) : d(e, f, g, k);
+        return c ? {
+          value: e
+        } : e
+      }
+    },
+    value: function(a, b) {
+      return function() {
+        return b ? {
+          context: void 0,
+          name: void 0,
+          value: a
+        } : a
+      }
+    },
+    identifier: function(a, b, d) {
+      return function(c, e, f, g) {
+        c =
+          e && a in e ? e : c;
+        d && 1 !== d && c && null == c[a] && (c[a] = {});
+        e = c ? c[a] : void 0;
+        return b ? {
+          context: c,
+          name: a,
+          value: e
+        } : e
+      }
+    },
+    computedMember: function(a, b, d, c) {
+      return function(e, f, g, k) {
+        var h = a(e, f, g, k),
+          l, m;
+        null != h && (l = b(e, f, g, k), l += "", c && 1 !== c && h && !h[l] && (h[l] = {}), m = h[l]);
+        return d ? {
+          context: h,
+          name: l,
+          value: m
+        } : m
+      }
+    },
+    nonComputedMember: function(a, b, d, c) {
+      return function(e, f, g, k) {
+        e = a(e, f, g, k);
+        c && 1 !== c && e && null == e[b] && (e[b] = {});
+        f = null != e ? e[b] : void 0;
+        return d ? {
+          context: e,
+          name: b,
+          value: f
+        } : f
+      }
+    },
+    inputs: function(a, b) {
+      return function(d,
+        c, e, f) {
+        return f ? f[b] : a(d, c, e)
+      }
+    }
+  };
+  Nb.prototype = {
+    constructor: Nb,
+    parse: function(a) {
+      a = this.getAst(a);
+      var b = this.astCompiler.compile(a.ast),
+        d = a.ast;
+      b.literal = 0 === d.body.length || 1 === d.body.length && (d.body[0].expression.type === q.Literal || d.body[0].expression.type === q.ArrayExpression || d.body[0].expression.type === q.ObjectExpression);
+      b.constant = a.ast.constant;
+      b.oneTime = a.oneTime;
+      return b
+    },
+    getAst: function(a) {
+      var b = !1;
+      a = a.trim();
+      ":" === a.charAt(0) && ":" === a.charAt(1) && (b = !0, a = a.substring(2));
+      return {
+        ast: this.ast.ast(a),
+        oneTime: b
+      }
+    }
+  };
+  var Ea = F("$sce"),
+    W = {
+      HTML: "html",
+      CSS: "css",
+      MEDIA_URL: "mediaUrl",
+      URL: "url",
+      RESOURCE_URL: "resourceUrl",
+      JS: "js"
+    },
+    Dc = /_([a-z])/g,
+    Zg = F("$templateRequest"),
+    $g = F("$timeout"),
+    aa = z.document.createElement("a"),
+    Qd = ga(z.location.href),
+    Na;
+  aa.href = "http://[::1]";
+  var ah = "[::1]" === aa.hostname;
+  Rd.$inject = ["$document"];
+  fd.$inject = ["$provide"];
+  var Yd = 22,
+    Xd = ".",
+    Fc = "0";
+  Sd.$inject = ["$locale"];
+  Ud.$inject = ["$locale"];
+  var lh = {
+      yyyy: ea("FullYear", 4, 0, !1, !0),
+      yy: ea("FullYear", 2, 0, !0, !0),
+      y: ea("FullYear", 1, 0, !1, !0),
+      MMMM: lb("Month"),
+      MMM: lb("Month", !0),
+      MM: ea("Month", 2, 1),
+      M: ea("Month", 1, 1),
+      LLLL: lb("Month", !1, !0),
+      dd: ea("Date", 2),
+      d: ea("Date", 1),
+      HH: ea("Hours", 2),
+      H: ea("Hours", 1),
+      hh: ea("Hours", 2, -12),
+      h: ea("Hours", 1, -12),
+      mm: ea("Minutes", 2),
+      m: ea("Minutes", 1),
+      ss: ea("Seconds", 2),
+      s: ea("Seconds", 1),
+      sss: ea("Milliseconds", 3),
+      EEEE: lb("Day"),
+      EEE: lb("Day", !0),
+      a: function(a, b) {
+        return 12 > a.getHours() ? b.AMPMS[0] : b.AMPMS[1]
+      },
+      Z: function(a, b, d) {
+        a = -1 * d;
+        return a = (0 <= a ? "+" : "") + (Pb(Math[0 < a ? "floor" : "ceil"](a / 60), 2) + Pb(Math.abs(a % 60), 2))
+      },
+      ww: $d(2),
+      w: $d(1),
+      G: Gc,
+      GG: Gc,
+      GGG: Gc,
+      GGGG: function(a, b) {
+        return 0 >= a.getFullYear() ? b.ERANAMES[0] : b.ERANAMES[1]
+      }
+    },
+    kh = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,
+    jh = /^-?\d+$/;
+  Td.$inject = ["$locale"];
+  var eh = ia(K),
+    fh = ia(vb);
+  Vd.$inject = ["$parse"];
+  var Re = ia({
+      restrict: "E",
+      compile: function(a, b) {
+        if (!b.href && !b.xlinkHref) return function(a, b) {
+          if ("a" === b[0].nodeName.toLowerCase()) {
+            var e = "[object SVGAnimatedString]" === la.call(b.prop("href")) ? "xlink:href" : "href";
+            b.on("click", function(a) {
+              b.attr(e) || a.preventDefault()
+            })
+          }
+        }
+      }
+    }),
+    wb = {};
+  r(Hb, function(a, b) {
+    function d(a, d, e) {
+      a.$watch(e[c], function(a) {
+        e.$set(b, !!a)
+      })
+    }
+    if ("multiple" !== a) {
+      var c = xa("ng-" + b),
+        e = d;
+      "checked" === a && (e = function(a, b, e) {
+        e.ngModel !== e[c] && d(a, b, e)
+      });
+      wb[c] = function() {
+        return {
+          restrict: "A",
+          priority: 100,
+          link: e
+        }
+      }
+    }
+  });
+  r(vd, function(a, b) {
+    wb[b] = function() {
+      return {
+        priority: 100,
+        link: function(a, c, e) {
+          if ("ngPattern" === b && "/" === e.ngPattern.charAt(0) && (c = e.ngPattern.match(ke))) {
+            e.$set("ngPattern", new RegExp(c[1],
+              c[2]));
+            return
+          }
+          a.$watch(e[b], function(a) {
+            e.$set(b, a)
+          })
+        }
+      }
+    }
+  });
+  r(["src", "srcset", "href"], function(a) {
+    var b = xa("ng-" + a);
+    wb[b] = ["$sce", function(d) {
+      return {
+        priority: 99,
+        link: function(c, e, f) {
+          var g = a,
+            k = a;
+          "href" === a && "[object SVGAnimatedString]" === la.call(e.prop("href")) && (k = "xlinkHref", f.$attr[k] = "xlink:href", g = null);
+          f.$set(b, d.getTrustedMediaUrl(f[b]));
+          f.$observe(b, function(b) {
+            b ? (f.$set(k, b), wa && g && e.prop(g, f[k])) : "href" === a && f.$set(k, null)
+          })
+        }
+      }
+    }]
+  });
+  var mb = {
+    $addControl: E,
+    $getControls: ia([]),
+    $$renameControl: function(a,
+      b) {
+      a.$name = b
+    },
+    $removeControl: E,
+    $setValidity: E,
+    $setDirty: E,
+    $setPristine: E,
+    $setSubmitted: E,
+    $$setSubmitted: E
+  };
+  Qb.$inject = ["$element", "$attrs", "$scope", "$animate", "$interpolate"];
+  Qb.prototype = {
+    $rollbackViewValue: function() {
+      r(this.$$controls, function(a) {
+        a.$rollbackViewValue()
+      })
+    },
+    $commitViewValue: function() {
+      r(this.$$controls, function(a) {
+        a.$commitViewValue()
+      })
+    },
+    $addControl: function(a) {
+      Ja(a.$name, "input");
+      this.$$controls.push(a);
+      a.$name && (this[a.$name] = a);
+      a.$$parentForm = this
+    },
+    $getControls: function() {
+      return ja(this.$$controls)
+    },
+    $$renameControl: function(a, b) {
+      var d = a.$name;
+      this[d] === a && delete this[d];
+      this[b] = a;
+      a.$name = b
+    },
+    $removeControl: function(a) {
+      a.$name && this[a.$name] === a && delete this[a.$name];
+      r(this.$pending, function(b, d) {
+        this.$setValidity(d, null, a)
+      }, this);
+      r(this.$error, function(b, d) {
+        this.$setValidity(d, null, a)
+      }, this);
+      r(this.$$success, function(b, d) {
+        this.$setValidity(d, null, a)
+      }, this);
+      cb(this.$$controls, a);
+      a.$$parentForm = mb
+    },
+    $setDirty: function() {
+      this.$$animate.removeClass(this.$$element, Za);
+      this.$$animate.addClass(this.$$element,
+        Wb);
+      this.$dirty = !0;
+      this.$pristine = !1;
+      this.$$parentForm.$setDirty()
+    },
+    $setPristine: function() {
+      this.$$animate.setClass(this.$$element, Za, Wb + " ng-submitted");
+      this.$dirty = !1;
+      this.$pristine = !0;
+      this.$submitted = !1;
+      r(this.$$controls, function(a) {
+        a.$setPristine()
+      })
+    },
+    $setUntouched: function() {
+      r(this.$$controls, function(a) {
+        a.$setUntouched()
+      })
+    },
+    $setSubmitted: function() {
+      for (var a = this; a.$$parentForm && a.$$parentForm !== mb;) a = a.$$parentForm;
+      a.$$setSubmitted()
+    },
+    $$setSubmitted: function() {
+      this.$$animate.addClass(this.$$element,
+        "ng-submitted");
+      this.$submitted = !0;
+      r(this.$$controls, function(a) {
+        a.$$setSubmitted && a.$$setSubmitted()
+      })
+    }
+  };
+  ce({
+    clazz: Qb,
+    set: function(a, b, d) {
+      var c = a[b];
+      c ? -1 === c.indexOf(d) && c.push(d) : a[b] = [d]
+    },
+    unset: function(a, b, d) {
+      var c = a[b];
+      c && (cb(c, d), 0 === c.length && delete a[b])
+    }
+  });
+  var oe = function(a) {
+      return ["$timeout", "$parse", function(b, d) {
+        function c(a) {
+          return "" === a ? d('this[""]').assign : d(a).assign || E
+        }
+        return {
+          name: "form",
+          restrict: a ? "EAC" : "E",
+          require: ["form", "^^?form"],
+          controller: Qb,
+          compile: function(d, f) {
+            d.addClass(Za).addClass(nb);
+            var g = f.name ? "name" : a && f.ngForm ? "ngForm" : !1;
+            return {
+              pre: function(a, d, e, f) {
+                var p = f[0];
+                if (!("action" in e)) {
+                  var n = function(b) {
+                    a.$apply(function() {
+                      p.$commitViewValue();
+                      p.$setSubmitted()
+                    });
+                    b.preventDefault()
+                  };
+                  d[0].addEventListener("submit", n);
+                  d.on("$destroy", function() {
+                    b(function() {
+                      d[0].removeEventListener("submit", n)
+                    }, 0, !1)
+                  })
+                }(f[1] || p.$$parentForm).$addControl(p);
+                var s = g ? c(p.$name) : E;
+                g && (s(a, p), e.$observe(g, function(b) {
+                  p.$name !== b && (s(a, void 0), p.$$parentForm.$$renameControl(p, b), s = c(p.$name), s(a, p))
+                }));
+                d.on("$destroy", function() {
+                  p.$$parentForm.$removeControl(p);
+                  s(a, void 0);
+                  S(p, mb)
+                })
+              }
+            }
+          }
+        }
+      }]
+    },
+    Se = oe(),
+    df = oe(!0),
+    mh = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,
+    xh = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,
+    yh = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,
+    nh = /^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,
+    pe = /^(\d{4,})-(\d{2})-(\d{2})$/,
+    qe = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,
+    Oc = /^(\d{4,})-W(\d\d)$/,
+    re = /^(\d{4,})-(\d\d)$/,
+    se = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,
+    ee = T();
+  r(["date", "datetime-local", "month", "time", "week"], function(a) {
+    ee[a] = !0
+  });
+  var te = {
+      text: function(a, b, d, c, e, f) {
+        Sa(a, b, d, c, e, f);
+        Ic(c)
+      },
+      date: ob("date", pe, Rb(pe, ["yyyy", "MM", "dd"]), "yyyy-MM-dd"),
+      "datetime-local": ob("datetimelocal", qe, Rb(qe, "yyyy MM dd HH mm ss sss".split(" ")),
+        "yyyy-MM-ddTHH:mm:ss.sss"),
+      time: ob("time", se, Rb(se, ["HH", "mm", "ss", "sss"]), "HH:mm:ss.sss"),
+      week: ob("week", Oc, function(a, b) {
+        if (ha(a)) return a;
+        if (C(a)) {
+          Oc.lastIndex = 0;
+          var d = Oc.exec(a);
+          if (d) {
+            var c = +d[1],
+              e = +d[2],
+              f = d = 0,
+              g = 0,
+              k = 0,
+              h = Zd(c),
+              e = 7 * (e - 1);
+            b && (d = b.getHours(), f = b.getMinutes(), g = b.getSeconds(), k = b.getMilliseconds());
+            return new Date(c, 0, h.getDate() + e, d, f, g, k)
+          }
+        }
+        return NaN
+      }, "yyyy-Www"),
+      month: ob("month", re, Rb(re, ["yyyy", "MM"]), "yyyy-MM"),
+      number: function(a, b, d, c, e, f, g, k) {
+        Jc(a, b, d, c, "number");
+        fe(c);
+        Sa(a,
+          b, d, c, e, f);
+        var h;
+        if (w(d.min) || d.ngMin) {
+          var l = d.min || k(d.ngMin)(a);
+          h = na(l);
+          c.$validators.min = function(a, b) {
+            return c.$isEmpty(b) || A(h) || b >= h
+          };
+          d.$observe("min", function(a) {
+            a !== l && (h = na(a), l = a, c.$validate())
+          })
+        }
+        if (w(d.max) || d.ngMax) {
+          var m = d.max || k(d.ngMax)(a),
+            p = na(m);
+          c.$validators.max = function(a, b) {
+            return c.$isEmpty(b) || A(p) || b <= p
+          };
+          d.$observe("max", function(a) {
+            a !== m && (p = na(a), m = a, c.$validate())
+          })
+        }
+        if (w(d.step) || d.ngStep) {
+          var n = d.step || k(d.ngStep)(a),
+            s = na(n);
+          c.$validators.step = function(a, b) {
+            return c.$isEmpty(b) ||
+              A(s) || ge(b, h || 0, s)
+          };
+          d.$observe("step", function(a) {
+            a !== n && (s = na(a), n = a, c.$validate())
+          })
+        }
+      },
+      url: function(a, b, d, c, e, f) {
+        Sa(a, b, d, c, e, f);
+        Ic(c);
+        c.$validators.url = function(a, b) {
+          var d = a || b;
+          return c.$isEmpty(d) || xh.test(d)
+        }
+      },
+      email: function(a, b, d, c, e, f) {
+        Sa(a, b, d, c, e, f);
+        Ic(c);
+        c.$validators.email = function(a, b) {
+          var d = a || b;
+          return c.$isEmpty(d) || yh.test(d)
+        }
+      },
+      radio: function(a, b, d, c) {
+        var e = !d.ngTrim || "false" !== V(d.ngTrim);
+        A(d.name) && b.attr("name", ++qb);
+        b.on("change", function(a) {
+          var g;
+          b[0].checked && (g = d.value, e && (g =
+            V(g)), c.$setViewValue(g, a && a.type))
+        });
+        c.$render = function() {
+          var a = d.value;
+          e && (a = V(a));
+          b[0].checked = a === c.$viewValue
+        };
+        d.$observe("value", c.$render)
+      },
+      range: function(a, b, d, c, e, f) {
+        function g(a, c) {
+          b.attr(a, d[a]);
+          var e = d[a];
+          d.$observe(a, function(a) {
+            a !== e && (e = a, c(a))
+          })
+        }
+
+        function k(a) {
+          p = na(a);
+          Y(c.$modelValue) || (m ? (a = b.val(), p > a && (a = p, b.val(a)), c.$setViewValue(a)) : c.$validate())
+        }
+
+        function h(a) {
+          n = na(a);
+          Y(c.$modelValue) || (m ? (a = b.val(), n < a && (b.val(n), a = n < p ? p : n), c.$setViewValue(a)) : c.$validate())
+        }
+
+        function l(a) {
+          s =
+            na(a);
+          Y(c.$modelValue) || (m ? c.$viewValue !== b.val() && c.$setViewValue(b.val()) : c.$validate())
+        }
+        Jc(a, b, d, c, "range");
+        fe(c);
+        Sa(a, b, d, c, e, f);
+        var m = c.$$hasNativeValidators && "range" === b[0].type,
+          p = m ? 0 : void 0,
+          n = m ? 100 : void 0,
+          s = m ? 1 : void 0,
+          r = b[0].validity;
+        a = w(d.min);
+        e = w(d.max);
+        f = w(d.step);
+        var q = c.$render;
+        c.$render = m && w(r.rangeUnderflow) && w(r.rangeOverflow) ? function() {
+          q();
+          c.$setViewValue(b.val())
+        } : q;
+        a && (p = na(d.min), c.$validators.min = m ? function() {
+          return !0
+        } : function(a, b) {
+          return c.$isEmpty(b) || A(p) || b >= p
+        }, g("min", k));
+        e && (n = na(d.max), c.$validators.max = m ? function() {
+          return !0
+        } : function(a, b) {
+          return c.$isEmpty(b) || A(n) || b <= n
+        }, g("max", h));
+        f && (s = na(d.step), c.$validators.step = m ? function() {
+          return !r.stepMismatch
+        } : function(a, b) {
+          return c.$isEmpty(b) || A(s) || ge(b, p || 0, s)
+        }, g("step", l))
+      },
+      checkbox: function(a, b, d, c, e, f, g, k) {
+        var h = he(k, a, "ngTrueValue", d.ngTrueValue, !0),
+          l = he(k, a, "ngFalseValue", d.ngFalseValue, !1);
+        b.on("change", function(a) {
+          c.$setViewValue(b[0].checked, a && a.type)
+        });
+        c.$render = function() {
+          b[0].checked = c.$viewValue
+        };
+        c.$isEmpty =
+          function(a) {
+            return !1 === a
+          };
+        c.$formatters.push(function(a) {
+          return va(a, h)
+        });
+        c.$parsers.push(function(a) {
+          return a ? h : l
+        })
+      },
+      hidden: E,
+      button: E,
+      submit: E,
+      reset: E,
+      file: E
+    },
+    $c = ["$browser", "$sniffer", "$filter", "$parse", function(a, b, d, c) {
+      return {
+        restrict: "E",
+        require: ["?ngModel"],
+        link: {
+          pre: function(e, f, g, k) {
+            k[0] && (te[K(g.type)] || te.text)(e, f, g, k[0], b, a, d, c)
+          }
+        }
+      }
+    }],
+    Af = function() {
+      var a = {
+        configurable: !0,
+        enumerable: !1,
+        get: function() {
+          return this.getAttribute("value") || ""
+        },
+        set: function(a) {
+          this.setAttribute("value", a)
+        }
+      };
+      return {
+        restrict: "E",
+        priority: 200,
+        compile: function(b, d) {
+          if ("hidden" === K(d.type)) return {
+            pre: function(b, d, f, g) {
+              b = d[0];
+              b.parentNode && b.parentNode.insertBefore(b, b.nextSibling);
+              Object.defineProperty && Object.defineProperty(b, "value", a)
+            }
+          }
+        }
+      }
+    },
+    zh = /^(true|false|\d+)$/,
+    xf = function() {
+      function a(a, d, c) {
+        var e = w(c) ? c : 9 === wa ? "" : null;
+        a.prop("value", e);
+        d.$set("value", c)
+      }
+      return {
+        restrict: "A",
+        priority: 100,
+        compile: function(b, d) {
+          return zh.test(d.ngValue) ? function(b, d, f) {
+            b = b.$eval(f.ngValue);
+            a(d, f, b)
+          } : function(b, d, f) {
+            b.$watch(f.ngValue,
+              function(b) {
+                a(d, f, b)
+              })
+          }
+        }
+      }
+    },
+    We = ["$compile", function(a) {
+      return {
+        restrict: "AC",
+        compile: function(b) {
+          a.$$addBindingClass(b);
+          return function(b, c, e) {
+            a.$$addBindingInfo(c, e.ngBind);
+            c = c[0];
+            b.$watch(e.ngBind, function(a) {
+              c.textContent = jc(a)
+            })
+          }
+        }
+      }
+    }],
+    Ye = ["$interpolate", "$compile", function(a, b) {
+      return {
+        compile: function(d) {
+          b.$$addBindingClass(d);
+          return function(c, d, f) {
+            c = a(d.attr(f.$attr.ngBindTemplate));
+            b.$$addBindingInfo(d, c.expressions);
+            d = d[0];
+            f.$observe("ngBindTemplate", function(a) {
+              d.textContent = A(a) ? "" : a
+            })
+          }
+        }
+      }
+    }],
+    Xe = ["$sce", "$parse", "$compile", function(a, b, d) {
+      return {
+        restrict: "A",
+        compile: function(c, e) {
+          var f = b(e.ngBindHtml),
+            g = b(e.ngBindHtml, function(b) {
+              return a.valueOf(b)
+            });
+          d.$$addBindingClass(c);
+          return function(b, c, e) {
+            d.$$addBindingInfo(c, e.ngBindHtml);
+            b.$watch(g, function() {
+              var d = f(b);
+              c.html(a.getTrustedHtml(d) || "")
+            })
+          }
+        }
+      }
+    }],
+    wf = ia({
+      restrict: "A",
+      require: "ngModel",
+      link: function(a, b, d, c) {
+        c.$viewChangeListeners.push(function() {
+          a.$eval(d.ngChange)
+        })
+      }
+    }),
+    Ze = Lc("", !0),
+    af = Lc("Odd", 0),
+    $e = Lc("Even", 1),
+    bf = Ra({
+      compile: function(a,
+        b) {
+        b.$set("ngCloak", void 0);
+        a.removeClass("ng-cloak")
+      }
+    }),
+    cf = [function() {
+      return {
+        restrict: "A",
+        scope: !0,
+        controller: "@",
+        priority: 500
+      }
+    }],
+    ed = {},
+    Ah = {
+      blur: !0,
+      focus: !0
+    };
+  r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "), function(a) {
+    var b = xa("ng-" + a);
+    ed[b] = ["$parse", "$rootScope", "$exceptionHandler", function(d, c, e) {
+      return sd(d, c, e, b, a, Ah[a])
+    }]
+  });
+  var ff = ["$animate", "$compile", function(a, b) {
+      return {
+        multiElement: !0,
+        transclude: "element",
+        priority: 600,
+        terminal: !0,
+        restrict: "A",
+        $$tlb: !0,
+        link: function(d, c, e, f, g) {
+          var k, h, l;
+          d.$watch(e.ngIf, function(d) {
+            d ? h || g(function(d, f) {
+              h = f;
+              d[d.length++] = b.$$createComment("end ngIf", e.ngIf);
+              k = {
+                clone: d
+              };
+              a.enter(d, c.parent(), c)
+            }) : (l && (l.remove(), l = null), h && (h.$destroy(), h = null), k && (l = ub(k.clone), a.leave(l).done(function(a) {
+              !1 !== a && (l = null)
+            }), k = null))
+          })
+        }
+      }
+    }],
+    gf = ["$templateRequest", "$anchorScroll", "$animate", function(a, b, d) {
+      return {
+        restrict: "ECA",
+        priority: 400,
+        terminal: !0,
+        transclude: "element",
+        controller: ca.noop,
+        compile: function(c, e) {
+          var f = e.ngInclude || e.src,
+            g = e.onload || "",
+            k = e.autoscroll;
+          return function(c, e, m, p, n) {
+            var r = 0,
+              q, t, x, v = function() {
+                t && (t.remove(), t = null);
+                q && (q.$destroy(), q = null);
+                x && (d.leave(x).done(function(a) {
+                  !1 !== a && (t = null)
+                }), t = x, x = null)
+              };
+            c.$watch(f, function(f) {
+              var m = function(a) {
+                  !1 === a || !w(k) || k && !c.$eval(k) || b()
+                },
+                t = ++r;
+              f ? (a(f, !0).then(function(a) {
+                if (!c.$$destroyed && t === r) {
+                  var b = c.$new();
+                  p.template = a;
+                  a = n(b, function(a) {
+                    v();
+                    d.enter(a, null, e).done(m)
+                  });
+                  q = b;
+                  x = a;
+                  q.$emit("$includeContentLoaded",
+                    f);
+                  c.$eval(g)
+                }
+              }, function() {
+                c.$$destroyed || t !== r || (v(), c.$emit("$includeContentError", f))
+              }), c.$emit("$includeContentRequested", f)) : (v(), p.template = null)
+            })
+          }
+        }
+      }
+    }],
+    zf = ["$compile", function(a) {
+      return {
+        restrict: "ECA",
+        priority: -400,
+        require: "ngInclude",
+        link: function(b, d, c, e) {
+          la.call(d[0]).match(/SVG/) ? (d.empty(), a(gd(e.template, z.document).childNodes)(b, function(a) {
+            d.append(a)
+          }, {
+            futureParentElement: d
+          })) : (d.html(e.template), a(d.contents())(b))
+        }
+      }
+    }],
+    hf = Ra({
+      priority: 450,
+      compile: function() {
+        return {
+          pre: function(a,
+            b, d) {
+            a.$eval(d.ngInit)
+          }
+        }
+      }
+    }),
+    vf = function() {
+      return {
+        restrict: "A",
+        priority: 100,
+        require: "ngModel",
+        link: function(a, b, d, c) {
+          var e = d.ngList || ", ",
+            f = "false" !== d.ngTrim,
+            g = f ? V(e) : e;
+          c.$parsers.push(function(a) {
+            if (!A(a)) {
+              var b = [];
+              a && r(a.split(g), function(a) {
+                a && b.push(f ? V(a) : a)
+              });
+              return b
+            }
+          });
+          c.$formatters.push(function(a) {
+            if (H(a)) return a.join(e)
+          });
+          c.$isEmpty = function(a) {
+            return !a || !a.length
+          }
+        }
+      }
+    },
+    nb = "ng-valid",
+    be = "ng-invalid",
+    Za = "ng-pristine",
+    Wb = "ng-dirty",
+    pb = F("ngModel");
+  Sb.$inject = "$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" ");
+  Sb.prototype = {
+    $$initGetterSetters: function() {
+      if (this.$options.getOption("getterSetter")) {
+        var a = this.$$parse(this.$$attr.ngModel + "()"),
+          b = this.$$parse(this.$$attr.ngModel + "($$$p)");
+        this.$$ngModelGet = function(b) {
+          var c = this.$$parsedNgModel(b);
+          B(c) && (c = a(b));
+          return c
+        };
+        this.$$ngModelSet = function(a, c) {
+          B(this.$$parsedNgModel(a)) ? b(a, {
+            $$$p: c
+          }) : this.$$parsedNgModelAssign(a, c)
+        }
+      } else if (!this.$$parsedNgModel.assign) throw pb("nonassign", this.$$attr.ngModel, Aa(this.$$element));
+    },
+    $render: E,
+    $isEmpty: function(a) {
+      return A(a) ||
+        "" === a || null === a || a !== a
+    },
+    $$updateEmptyClasses: function(a) {
+      this.$isEmpty(a) ? (this.$$animate.removeClass(this.$$element, "ng-not-empty"), this.$$animate.addClass(this.$$element, "ng-empty")) : (this.$$animate.removeClass(this.$$element, "ng-empty"), this.$$animate.addClass(this.$$element, "ng-not-empty"))
+    },
+    $setPristine: function() {
+      this.$dirty = !1;
+      this.$pristine = !0;
+      this.$$animate.removeClass(this.$$element, Wb);
+      this.$$animate.addClass(this.$$element, Za)
+    },
+    $setDirty: function() {
+      this.$dirty = !0;
+      this.$pristine = !1;
+      this.$$animate.removeClass(this.$$element,
+        Za);
+      this.$$animate.addClass(this.$$element, Wb);
+      this.$$parentForm.$setDirty()
+    },
+    $setUntouched: function() {
+      this.$touched = !1;
+      this.$untouched = !0;
+      this.$$animate.setClass(this.$$element, "ng-untouched", "ng-touched")
+    },
+    $setTouched: function() {
+      this.$touched = !0;
+      this.$untouched = !1;
+      this.$$animate.setClass(this.$$element, "ng-touched", "ng-untouched")
+    },
+    $rollbackViewValue: function() {
+      this.$$timeout.cancel(this.$$pendingDebounce);
+      this.$viewValue = this.$$lastCommittedViewValue;
+      this.$render()
+    },
+    $validate: function() {
+      if (!Y(this.$modelValue)) {
+        var a =
+          this.$$lastCommittedViewValue,
+          b = this.$$rawModelValue,
+          d = this.$valid,
+          c = this.$modelValue,
+          e = this.$options.getOption("allowInvalid"),
+          f = this;
+        this.$$runValidators(b, a, function(a) {
+          e || d === a || (f.$modelValue = a ? b : void 0, f.$modelValue !== c && f.$$writeModelToScope())
+        })
+      }
+    },
+    $$runValidators: function(a, b, d) {
+      function c() {
+        var c = !0;
+        r(h.$validators, function(d, e) {
+          var g = Boolean(d(a, b));
+          c = c && g;
+          f(e, g)
+        });
+        return c ? !0 : (r(h.$asyncValidators, function(a, b) {
+          f(b, null)
+        }), !1)
+      }
+
+      function e() {
+        var c = [],
+          d = !0;
+        r(h.$asyncValidators, function(e,
+          g) {
+          var h = e(a, b);
+          if (!h || !B(h.then)) throw pb("nopromise", h);
+          f(g, void 0);
+          c.push(h.then(function() {
+            f(g, !0)
+          }, function() {
+            d = !1;
+            f(g, !1)
+          }))
+        });
+        c.length ? h.$$q.all(c).then(function() {
+          g(d)
+        }, E) : g(!0)
+      }
+
+      function f(a, b) {
+        k === h.$$currentValidationRunId && h.$setValidity(a, b)
+      }
+
+      function g(a) {
+        k === h.$$currentValidationRunId && d(a)
+      }
+      this.$$currentValidationRunId++;
+      var k = this.$$currentValidationRunId,
+        h = this;
+      (function() {
+        var a = h.$$parserName;
+        if (A(h.$$parserValid)) f(a, null);
+        else return h.$$parserValid || (r(h.$validators, function(a,
+          b) {
+          f(b, null)
+        }), r(h.$asyncValidators, function(a, b) {
+          f(b, null)
+        })), f(a, h.$$parserValid), h.$$parserValid;
+        return !0
+      })() ? c() ? e() : g(!1): g(!1)
+    },
+    $commitViewValue: function() {
+      var a = this.$viewValue;
+      this.$$timeout.cancel(this.$$pendingDebounce);
+      if (this.$$lastCommittedViewValue !== a || "" === a && this.$$hasNativeValidators) this.$$updateEmptyClasses(a), this.$$lastCommittedViewValue = a, this.$pristine && this.$setDirty(), this.$$parseAndValidate()
+    },
+    $$parseAndValidate: function() {
+      var a = this.$$lastCommittedViewValue,
+        b = this;
+      this.$$parserValid =
+        A(a) ? void 0 : !0;
+      this.$setValidity(this.$$parserName, null);
+      this.$$parserName = "parse";
+      if (this.$$parserValid)
+        for (var d = 0; d < this.$parsers.length; d++)
+          if (a = this.$parsers[d](a), A(a)) {
+            this.$$parserValid = !1;
+            break
+          } Y(this.$modelValue) && (this.$modelValue = this.$$ngModelGet(this.$$scope));
+      var c = this.$modelValue,
+        e = this.$options.getOption("allowInvalid");
+      this.$$rawModelValue = a;
+      e && (this.$modelValue = a, b.$modelValue !== c && b.$$writeModelToScope());
+      this.$$runValidators(a, this.$$lastCommittedViewValue, function(d) {
+        e || (b.$modelValue =
+          d ? a : void 0, b.$modelValue !== c && b.$$writeModelToScope())
+      })
+    },
+    $$writeModelToScope: function() {
+      this.$$ngModelSet(this.$$scope, this.$modelValue);
+      r(this.$viewChangeListeners, function(a) {
+        try {
+          a()
+        } catch (b) {
+          this.$$exceptionHandler(b)
+        }
+      }, this)
+    },
+    $setViewValue: function(a, b) {
+      this.$viewValue = a;
+      this.$options.getOption("updateOnDefault") && this.$$debounceViewValueCommit(b)
+    },
+    $$debounceViewValueCommit: function(a) {
+      var b = this.$options.getOption("debounce");
+      X(b[a]) ? b = b[a] : X(b["default"]) && -1 === this.$options.getOption("updateOn").indexOf(a) ?
+        b = b["default"] : X(b["*"]) && (b = b["*"]);
+      this.$$timeout.cancel(this.$$pendingDebounce);
+      var d = this;
+      0 < b ? this.$$pendingDebounce = this.$$timeout(function() {
+        d.$commitViewValue()
+      }, b) : this.$$rootScope.$$phase ? this.$commitViewValue() : this.$$scope.$apply(function() {
+        d.$commitViewValue()
+      })
+    },
+    $overrideModelOptions: function(a) {
+      this.$options = this.$options.createChild(a);
+      this.$$setUpdateOnEvents()
+    },
+    $processModelValue: function() {
+      var a = this.$$format();
+      this.$viewValue !== a && (this.$$updateEmptyClasses(a), this.$viewValue = this.$$lastCommittedViewValue =
+        a, this.$render(), this.$$runValidators(this.$modelValue, this.$viewValue, E))
+    },
+    $$format: function() {
+      for (var a = this.$formatters, b = a.length, d = this.$modelValue; b--;) d = a[b](d);
+      return d
+    },
+    $$setModelValue: function(a) {
+      this.$modelValue = this.$$rawModelValue = a;
+      this.$$parserValid = void 0;
+      this.$processModelValue()
+    },
+    $$setUpdateOnEvents: function() {
+      this.$$updateEvents && this.$$element.off(this.$$updateEvents, this.$$updateEventHandler);
+      if (this.$$updateEvents = this.$options.getOption("updateOn")) this.$$element.on(this.$$updateEvents,
+        this.$$updateEventHandler)
+    },
+    $$updateEventHandler: function(a) {
+      this.$$debounceViewValueCommit(a && a.type)
+    }
+  };
+  ce({
+    clazz: Sb,
+    set: function(a, b) {
+      a[b] = !0
+    },
+    unset: function(a, b) {
+      delete a[b]
+    }
+  });
+  var uf = ["$rootScope", function(a) {
+      return {
+        restrict: "A",
+        require: ["ngModel", "^?form", "^?ngModelOptions"],
+        controller: Sb,
+        priority: 1,
+        compile: function(b) {
+          b.addClass(Za).addClass("ng-untouched").addClass(nb);
+          return {
+            pre: function(a, b, e, f) {
+              var g = f[0];
+              b = f[1] || g.$$parentForm;
+              if (f = f[2]) g.$options = f.$options;
+              g.$$initGetterSetters();
+              b.$addControl(g);
+              e.$observe("name", function(a) {
+                g.$name !== a && g.$$parentForm.$$renameControl(g, a)
+              });
+              a.$on("$destroy", function() {
+                g.$$parentForm.$removeControl(g)
+              })
+            },
+            post: function(b, c, e, f) {
+              function g() {
+                k.$setTouched()
+              }
+              var k = f[0];
+              k.$$setUpdateOnEvents();
+              c.on("blur", function() {
+                k.$touched || (a.$$phase ? b.$evalAsync(g) : b.$apply(g))
+              })
+            }
+          }
+        }
+      }
+    }],
+    Tb, Bh = /(\s+|^)default(\s+|$)/;
+  Mc.prototype = {
+    getOption: function(a) {
+      return this.$$options[a]
+    },
+    createChild: function(a) {
+      var b = !1;
+      a = S({}, a);
+      r(a, function(d, c) {
+        "$inherit" === d ? "*" === c ? b = !0 : (a[c] =
+          this.$$options[c], "updateOn" === c && (a.updateOnDefault = this.$$options.updateOnDefault)) : "updateOn" === c && (a.updateOnDefault = !1, a[c] = V(d.replace(Bh, function() {
+          a.updateOnDefault = !0;
+          return " "
+        })))
+      }, this);
+      b && (delete a["*"], ie(a, this.$$options));
+      ie(a, Tb.$$options);
+      return new Mc(a)
+    }
+  };
+  Tb = new Mc({
+    updateOn: "",
+    updateOnDefault: !0,
+    debounce: 0,
+    getterSetter: !1,
+    allowInvalid: !1,
+    timezone: null
+  });
+  var yf = function() {
+      function a(a, d) {
+        this.$$attrs = a;
+        this.$$scope = d
+      }
+      a.$inject = ["$attrs", "$scope"];
+      a.prototype = {
+        $onInit: function() {
+          var a =
+            this.parentCtrl ? this.parentCtrl.$options : Tb,
+            d = this.$$scope.$eval(this.$$attrs.ngModelOptions);
+          this.$options = a.createChild(d)
+        }
+      };
+      return {
+        restrict: "A",
+        priority: 10,
+        require: {
+          parentCtrl: "?^^ngModelOptions"
+        },
+        bindToController: !0,
+        controller: a
+      }
+    },
+    jf = Ra({
+      terminal: !0,
+      priority: 1E3
+    }),
+    Ch = F("ngOptions"),
+    Dh = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([$\w][$\w]*)|(?:\(\s*([$\w][$\w]*)\s*,\s*([$\w][$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
+    sf = ["$compile", "$document", "$parse", function(a, b, d) {
+      function c(a, b, c) {
+        function e(a, b, c, d, f) {
+          this.selectValue = a;
+          this.viewValue = b;
+          this.label = c;
+          this.group = d;
+          this.disabled = f
+        }
+
+        function f(a) {
+          var b;
+          if (!r && za(a)) b = a;
+          else {
+            b = [];
+            for (var c in a) a.hasOwnProperty(c) && "$" !== c.charAt(0) && b.push(c)
+          }
+          return b
+        }
+        var p = a.match(Dh);
+        if (!p) throw Ch("iexp", a, Aa(b));
+        var n = p[5] || p[7],
+          r = p[6];
+        a = / as /.test(p[0]) && p[1];
+        var q = p[9];
+        b = d(p[2] ? p[1] : n);
+        var t = a && d(a) || b,
+          w = q && d(q),
+          v = q ? function(a, b) {
+            return w(c, b)
+          } : function(a) {
+            return La(a)
+          },
+          x = function(a, b) {
+            return v(a, B(a, b))
+          },
+          A = d(p[2] || p[1]),
+          y = d(p[3] || ""),
+          J = d(p[4] || ""),
+          I = d(p[8]),
+          z = {},
+          B = r ? function(a, b) {
+            z[r] = b;
+            z[n] = a;
+            return z
+          } : function(a) {
+            z[n] = a;
+            return z
+          };
+        return {
+          trackBy: q,
+          getTrackByValue: x,
+          getWatchables: d(I, function(a) {
+            var b = [];
+            a = a || [];
+            for (var d = f(a), e = d.length, g = 0; g < e; g++) {
+              var k = a === d ? g : d[g],
+                l = a[k],
+                k = B(l, k),
+                l = v(l, k);
+              b.push(l);
+              if (p[2] || p[1]) l = A(c, k), b.push(l);
+              p[4] && (k = J(c, k), b.push(k))
+            }
+            return b
+          }),
+          getOptions: function() {
+            for (var a = [], b = {}, d = I(c) || [], g = f(d), k = g.length, n = 0; n < k; n++) {
+              var p = d ===
+                g ? n : g[n],
+                r = B(d[p], p),
+                s = t(c, r),
+                p = v(s, r),
+                w = A(c, r),
+                z = y(c, r),
+                r = J(c, r),
+                s = new e(p, s, w, z, r);
+              a.push(s);
+              b[p] = s
+            }
+            return {
+              items: a,
+              selectValueMap: b,
+              getOptionFromViewValue: function(a) {
+                return b[x(a)]
+              },
+              getViewValueFromOption: function(a) {
+                return q ? Ia(a.viewValue) : a.viewValue
+              }
+            }
+          }
+        }
+      }
+      var e = z.document.createElement("option"),
+        f = z.document.createElement("optgroup");
+      return {
+        restrict: "A",
+        terminal: !0,
+        require: ["select", "ngModel"],
+        link: {
+          pre: function(a, b, c, d) {
+            d[0].registerOption = E
+          },
+          post: function(d, k, h, l) {
+            function m(a) {
+              var b = (a = v.getOptionFromViewValue(a)) &&
+                a.element;
+              b && !b.selected && (b.selected = !0);
+              return a
+            }
+
+            function p(a, b) {
+              a.element = b;
+              b.disabled = a.disabled;
+              a.label !== b.label && (b.label = a.label, b.textContent = a.label);
+              b.value = a.selectValue
+            }
+            var n = l[0],
+              q = l[1],
+              A = h.multiple;
+            l = 0;
+            for (var t = k.children(), z = t.length; l < z; l++)
+              if ("" === t[l].value) {
+                n.hasEmptyOption = !0;
+                n.emptyOption = t.eq(l);
+                break
+              } k.empty();
+            l = !!n.emptyOption;
+            x(e.cloneNode(!1)).val("?");
+            var v, B = c(h.ngOptions, k, d),
+              C = b[0].createDocumentFragment();
+            n.generateUnknownOptionValue = function(a) {
+              return "?"
+            };
+            A ? (n.writeValue =
+              function(a) {
+                if (v) {
+                  var b = a && a.map(m) || [];
+                  v.items.forEach(function(a) {
+                    a.element.selected && -1 === Array.prototype.indexOf.call(b, a) && (a.element.selected = !1)
+                  })
+                }
+              }, n.readValue = function() {
+                var a = k.val() || [],
+                  b = [];
+                r(a, function(a) {
+                  (a = v.selectValueMap[a]) && !a.disabled && b.push(v.getViewValueFromOption(a))
+                });
+                return b
+              }, B.trackBy && d.$watchCollection(function() {
+                if (H(q.$viewValue)) return q.$viewValue.map(function(a) {
+                  return B.getTrackByValue(a)
+                })
+              }, function() {
+                q.$render()
+              })) : (n.writeValue = function(a) {
+              if (v) {
+                var b = k[0].options[k[0].selectedIndex],
+                  c = v.getOptionFromViewValue(a);
+                b && b.removeAttribute("selected");
+                c ? (k[0].value !== c.selectValue && (n.removeUnknownOption(), k[0].value = c.selectValue, c.element.selected = !0), c.element.setAttribute("selected", "selected")) : n.selectUnknownOrEmptyOption(a)
+              }
+            }, n.readValue = function() {
+              var a = v.selectValueMap[k.val()];
+              return a && !a.disabled ? (n.unselectEmptyOption(), n.removeUnknownOption(), v.getViewValueFromOption(a)) : null
+            }, B.trackBy && d.$watch(function() {
+              return B.getTrackByValue(q.$viewValue)
+            }, function() {
+              q.$render()
+            }));
+            l && (a(n.emptyOption)(d), k.prepend(n.emptyOption), 8 === n.emptyOption[0].nodeType ? (n.hasEmptyOption = !1, n.registerOption = function(a, b) {
+              "" === b.val() && (n.hasEmptyOption = !0, n.emptyOption = b, n.emptyOption.removeClass("ng-scope"), q.$render(), b.on("$destroy", function() {
+                var a = n.$isEmptyOptionSelected();
+                n.hasEmptyOption = !1;
+                n.emptyOption = void 0;
+                a && q.$render()
+              }))
+            }) : n.emptyOption.removeClass("ng-scope"));
+            d.$watchCollection(B.getWatchables, function() {
+              var a = v && n.readValue();
+              if (v)
+                for (var b = v.items.length - 1; 0 <= b; b--) {
+                  var c =
+                    v.items[b];
+                  w(c.group) ? Gb(c.element.parentNode) : Gb(c.element)
+                }
+              v = B.getOptions();
+              var d = {};
+              v.items.forEach(function(a) {
+                var b;
+                if (w(a.group)) {
+                  b = d[a.group];
+                  b || (b = f.cloneNode(!1), C.appendChild(b), b.label = null === a.group ? "null" : a.group, d[a.group] = b);
+                  var c = e.cloneNode(!1);
+                  b.appendChild(c);
+                  p(a, c)
+                } else b = e.cloneNode(!1), C.appendChild(b), p(a, b)
+              });
+              k[0].appendChild(C);
+              q.$render();
+              q.$isEmpty(a) || (b = n.readValue(), (B.trackBy || A ? va(a, b) : a === b) || (q.$setViewValue(b), q.$render()))
+            })
+          }
+        }
+      }
+    }],
+    kf = ["$locale", "$interpolate", "$log",
+      function(a, b, d) {
+        var c = /{}/g,
+          e = /^when(Minus)?(.+)$/;
+        return {
+          link: function(f, g, k) {
+            function h(a) {
+              g.text(a || "")
+            }
+            var l = k.count,
+              m = k.$attr.when && g.attr(k.$attr.when),
+              p = k.offset || 0,
+              n = f.$eval(m) || {},
+              q = {},
+              w = b.startSymbol(),
+              t = b.endSymbol(),
+              x = w + l + "-" + p + t,
+              v = ca.noop,
+              z;
+            r(k, function(a, b) {
+              var c = e.exec(b);
+              c && (c = (c[1] ? "-" : "") + K(c[2]), n[c] = g.attr(k.$attr[b]))
+            });
+            r(n, function(a, d) {
+              q[d] = b(a.replace(c, x))
+            });
+            f.$watch(l, function(b) {
+              var c = parseFloat(b),
+                e = Y(c);
+              e || c in n || (c = a.pluralCat(c - p));
+              c === z || e && Y(z) || (v(), e = q[c], A(e) ?
+                (null != b && d.debug("ngPluralize: no rule defined for '" + c + "' in " + m), v = E, h()) : v = f.$watch(e, h), z = c)
+            })
+          }
+        }
+      }
+    ],
+    ue = F("ngRef"),
+    lf = ["$parse", function(a) {
+      return {
+        priority: -1,
+        restrict: "A",
+        compile: function(b, d) {
+          var c = xa(ua(b)),
+            e = a(d.ngRef),
+            f = e.assign || function() {
+              throw ue("nonassign", d.ngRef);
+            };
+          return function(a, b, h) {
+            var l;
+            if (h.hasOwnProperty("ngRefRead"))
+              if ("$element" === h.ngRefRead) l = b;
+              else {
+                if (l = b.data("$" + h.ngRefRead + "Controller"), !l) throw ue("noctrl", h.ngRefRead, d.ngRef);
+              }
+            else l = b.data("$" + c + "Controller");
+            l =
+              l || b;
+            f(a, l);
+            b.on("$destroy", function() {
+              e(a) === l && f(a, null)
+            })
+          }
+        }
+      }
+    }],
+    mf = ["$parse", "$animate", "$compile", function(a, b, d) {
+      var c = F("ngRepeat"),
+        e = function(a, b, c, d, e, f, g) {
+          a[c] = d;
+          e && (a[e] = f);
+          a.$index = b;
+          a.$first = 0 === b;
+          a.$last = b === g - 1;
+          a.$middle = !(a.$first || a.$last);
+          a.$odd = !(a.$even = 0 === (b & 1))
+        },
+        f = function(a, b, c) {
+          return La(c)
+        },
+        g = function(a, b) {
+          return b
+        };
+      return {
+        restrict: "A",
+        multiElement: !0,
+        transclude: "element",
+        priority: 1E3,
+        terminal: !0,
+        $$tlb: !0,
+        compile: function(k, h) {
+          var l = h.ngRepeat,
+            m = d.$$createComment("end ngRepeat",
+              l),
+            p = l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
+          if (!p) throw c("iexp", l);
+          var n = p[1],
+            q = p[2],
+            w = p[3],
+            t = p[4],
+            p = n.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/);
+          if (!p) throw c("iidexp", n);
+          var x = p[3] || p[1],
+            v = p[2];
+          if (w && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(w) || /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(w))) throw c("badident", w);
+          var A;
+          if (t) {
+            var z = {
+                $id: La
+              },
+              y = a(t);
+            A = function(a, b, c, d) {
+              v &&
+                (z[v] = b);
+              z[x] = c;
+              z.$index = d;
+              return y(a, z)
+            }
+          }
+          return function(a, d, h, k, n) {
+            var p = T();
+            a.$watchCollection(q, function(h) {
+              var k, q, t = d[0],
+                s, y = T(),
+                B, C, E, D, H, F, K;
+              w && (a[w] = h);
+              if (za(h)) H = h, q = A || f;
+              else
+                for (K in q = A || g, H = [], h) ta.call(h, K) && "$" !== K.charAt(0) && H.push(K);
+              B = H.length;
+              K = Array(B);
+              for (k = 0; k < B; k++)
+                if (C = h === H ? k : H[k], E = h[C], D = q(a, C, E, k), p[D]) F = p[D], delete p[D], y[D] = F, K[k] = F;
+                else {
+                  if (y[D]) throw r(K, function(a) {
+                    a && a.scope && (p[a.id] = a)
+                  }), c("dupes", l, D, E);
+                  K[k] = {
+                    id: D,
+                    scope: void 0,
+                    clone: void 0
+                  };
+                  y[D] = !0
+                } z && (z[x] = void 0);
+              for (s in p) {
+                F = p[s];
+                D = ub(F.clone);
+                b.leave(D);
+                if (D[0].parentNode)
+                  for (k = 0, q = D.length; k < q; k++) D[k].$$NG_REMOVED = !0;
+                F.scope.$destroy()
+              }
+              for (k = 0; k < B; k++)
+                if (C = h === H ? k : H[k], E = h[C], F = K[k], F.scope) {
+                  s = t;
+                  do s = s.nextSibling; while (s && s.$$NG_REMOVED);
+                  F.clone[0] !== s && b.move(ub(F.clone), null, t);
+                  t = F.clone[F.clone.length - 1];
+                  e(F.scope, k, x, E, v, C, B)
+                } else n(function(a, c) {
+                  F.scope = c;
+                  var d = m.cloneNode(!1);
+                  a[a.length++] = d;
+                  b.enter(a, null, t);
+                  t = d;
+                  F.clone = a;
+                  y[F.id] = F;
+                  e(F.scope, k, x, E, v, C, B)
+                });
+              p = y
+            })
+          }
+        }
+      }
+    }],
+    nf = ["$animate", function(a) {
+      return {
+        restrict: "A",
+        multiElement: !0,
+        link: function(b, d, c) {
+          b.$watch(c.ngShow, function(b) {
+            a[b ? "removeClass" : "addClass"](d, "ng-hide", {
+              tempClasses: "ng-hide-animate"
+            })
+          })
+        }
+      }
+    }],
+    ef = ["$animate", function(a) {
+      return {
+        restrict: "A",
+        multiElement: !0,
+        link: function(b, d, c) {
+          b.$watch(c.ngHide, function(b) {
+            a[b ? "addClass" : "removeClass"](d, "ng-hide", {
+              tempClasses: "ng-hide-animate"
+            })
+          })
+        }
+      }
+    }],
+    of = Ra(function(a, b, d) {
+      a.$watchCollection(d.ngStyle, function(a, d) {
+        d && a !== d && r(d, function(a, c) {
+          b.css(c, "")
+        });
+        a && b.css(a)
+      })
+    }),
+    pf = ["$animate", "$compile", function(a,
+      b) {
+      return {
+        require: "ngSwitch",
+        controller: ["$scope", function() {
+          this.cases = {}
+        }],
+        link: function(d, c, e, f) {
+          var g = [],
+            k = [],
+            h = [],
+            l = [],
+            m = function(a, b) {
+              return function(c) {
+                !1 !== c && a.splice(b, 1)
+              }
+            };
+          d.$watch(e.ngSwitch || e.on, function(c) {
+            for (var d, e; h.length;) a.cancel(h.pop());
+            d = 0;
+            for (e = l.length; d < e; ++d) {
+              var q = ub(k[d].clone);
+              l[d].$destroy();
+              (h[d] = a.leave(q)).done(m(h, d))
+            }
+            k.length = 0;
+            l.length = 0;
+            (g = f.cases["!" + c] || f.cases["?"]) && r(g, function(c) {
+              c.transclude(function(d, e) {
+                l.push(e);
+                var f = c.element;
+                d[d.length++] = b.$$createComment("end ngSwitchWhen");
+                k.push({
+                  clone: d
+                });
+                a.enter(d, f.parent(), f)
+              })
+            })
+          })
+        }
+      }
+    }],
+    qf = Ra({
+      transclude: "element",
+      priority: 1200,
+      require: "^ngSwitch",
+      multiElement: !0,
+      link: function(a, b, d, c, e) {
+        a = d.ngSwitchWhen.split(d.ngSwitchWhenSeparator).sort().filter(function(a, b, c) {
+          return c[b - 1] !== a
+        });
+        r(a, function(a) {
+          c.cases["!" + a] = c.cases["!" + a] || [];
+          c.cases["!" + a].push({
+            transclude: e,
+            element: b
+          })
+        })
+      }
+    }),
+    rf = Ra({
+      transclude: "element",
+      priority: 1200,
+      require: "^ngSwitch",
+      multiElement: !0,
+      link: function(a, b, d, c, e) {
+        c.cases["?"] = c.cases["?"] || [];
+        c.cases["?"].push({
+          transclude: e,
+          element: b
+        })
+      }
+    }),
+    Eh = F("ngTransclude"),
+    tf = ["$compile", function(a) {
+      return {
+        restrict: "EAC",
+        compile: function(b) {
+          var d = a(b.contents());
+          b.empty();
+          return function(a, b, f, g, k) {
+            function h() {
+              d(a, function(a) {
+                b.append(a)
+              })
+            }
+            if (!k) throw Eh("orphan", Aa(b));
+            f.ngTransclude === f.$attr.ngTransclude && (f.ngTransclude = "");
+            f = f.ngTransclude || f.ngTranscludeSlot;
+            k(function(a, c) {
+                var d;
+                if (d = a.length) a: {
+                  d = 0;
+                  for (var f = a.length; d < f; d++) {
+                    var g = a[d];
+                    if (g.nodeType !== Pa || g.nodeValue.trim()) {
+                      d = !0;
+                      break a
+                    }
+                  }
+                  d = void 0
+                }
+                d ? b.append(a) : (h(), c.$destroy())
+              },
+              null, f);
+            f && !k.isSlotFilled(f) && h()
+          }
+        }
+      }
+    }],
+    Te = ["$templateCache", function(a) {
+      return {
+        restrict: "E",
+        terminal: !0,
+        compile: function(b, d) {
+          "text/ng-template" === d.type && a.put(d.id, b[0].text)
+        }
+      }
+    }],
+    Fh = {
+      $setViewValue: E,
+      $render: E
+    },
+    Gh = ["$element", "$scope", function(a, b) {
+      function d() {
+        g || (g = !0, b.$$postDigest(function() {
+          g = !1;
+          e.ngModelCtrl.$render()
+        }))
+      }
+
+      function c(a) {
+        k || (k = !0, b.$$postDigest(function() {
+          b.$$destroyed || (k = !1, e.ngModelCtrl.$setViewValue(e.readValue()), a && e.ngModelCtrl.$render())
+        }))
+      }
+      var e = this,
+        f = new Ib;
+      e.selectValueMap = {};
+      e.ngModelCtrl = Fh;
+      e.multiple = !1;
+      e.unknownOption = x(z.document.createElement("option"));
+      e.hasEmptyOption = !1;
+      e.emptyOption = void 0;
+      e.renderUnknownOption = function(b) {
+        b = e.generateUnknownOptionValue(b);
+        e.unknownOption.val(b);
+        a.prepend(e.unknownOption);
+        Oa(e.unknownOption, !0);
+        a.val(b)
+      };
+      e.updateUnknownOption = function(b) {
+        b = e.generateUnknownOptionValue(b);
+        e.unknownOption.val(b);
+        Oa(e.unknownOption, !0);
+        a.val(b)
+      };
+      e.generateUnknownOptionValue = function(a) {
+        return "? " + La(a) + " ?"
+      };
+      e.removeUnknownOption = function() {
+        e.unknownOption.parent() &&
+          e.unknownOption.remove()
+      };
+      e.selectEmptyOption = function() {
+        e.emptyOption && (a.val(""), Oa(e.emptyOption, !0))
+      };
+      e.unselectEmptyOption = function() {
+        e.hasEmptyOption && Oa(e.emptyOption, !1)
+      };
+      b.$on("$destroy", function() {
+        e.renderUnknownOption = E
+      });
+      e.readValue = function() {
+        var b = a.val(),
+          b = b in e.selectValueMap ? e.selectValueMap[b] : b;
+        return e.hasOption(b) ? b : null
+      };
+      e.writeValue = function(b) {
+        var c = a[0].options[a[0].selectedIndex];
+        c && Oa(x(c), !1);
+        e.hasOption(b) ? (e.removeUnknownOption(), c = La(b), a.val(c in e.selectValueMap ?
+          c : b), Oa(x(a[0].options[a[0].selectedIndex]), !0)) : e.selectUnknownOrEmptyOption(b)
+      };
+      e.addOption = function(a, b) {
+        if (8 !== b[0].nodeType) {
+          Ja(a, '"option value"');
+          "" === a && (e.hasEmptyOption = !0, e.emptyOption = b);
+          var c = f.get(a) || 0;
+          f.set(a, c + 1);
+          d()
+        }
+      };
+      e.removeOption = function(a) {
+        var b = f.get(a);
+        b && (1 === b ? (f.delete(a), "" === a && (e.hasEmptyOption = !1, e.emptyOption = void 0)) : f.set(a, b - 1))
+      };
+      e.hasOption = function(a) {
+        return !!f.get(a)
+      };
+      e.$hasEmptyOption = function() {
+        return e.hasEmptyOption
+      };
+      e.$isUnknownOptionSelected = function() {
+        return a[0].options[0] ===
+          e.unknownOption[0]
+      };
+      e.$isEmptyOptionSelected = function() {
+        return e.hasEmptyOption && a[0].options[a[0].selectedIndex] === e.emptyOption[0]
+      };
+      e.selectUnknownOrEmptyOption = function(a) {
+        null == a && e.emptyOption ? (e.removeUnknownOption(), e.selectEmptyOption()) : e.unknownOption.parent().length ? e.updateUnknownOption(a) : e.renderUnknownOption(a)
+      };
+      var g = !1,
+        k = !1;
+      e.registerOption = function(a, b, f, g, k) {
+        if (f.$attr.ngValue) {
+          var q, r;
+          f.$observe("value", function(a) {
+            var d, f = b.prop("selected");
+            w(r) && (e.removeOption(q), delete e.selectValueMap[r],
+              d = !0);
+            r = La(a);
+            q = a;
+            e.selectValueMap[r] = a;
+            e.addOption(a, b);
+            b.attr("value", r);
+            d && f && c()
+          })
+        } else g ? f.$observe("value", function(a) {
+          e.readValue();
+          var d, f = b.prop("selected");
+          w(q) && (e.removeOption(q), d = !0);
+          q = a;
+          e.addOption(a, b);
+          d && f && c()
+        }) : k ? a.$watch(k, function(a, d) {
+          f.$set("value", a);
+          var g = b.prop("selected");
+          d !== a && e.removeOption(d);
+          e.addOption(a, b);
+          d && g && c()
+        }) : e.addOption(f.value, b);
+        f.$observe("disabled", function(a) {
+          if ("true" === a || a && b.prop("selected")) e.multiple ? c(!0) : (e.ngModelCtrl.$setViewValue(null), e.ngModelCtrl.$render())
+        });
+        b.on("$destroy", function() {
+          var a = e.readValue(),
+            b = f.value;
+          e.removeOption(b);
+          d();
+          (e.multiple && a && -1 !== a.indexOf(b) || a === b) && c(!0)
+        })
+      }
+    }],
+    Ue = function() {
+      return {
+        restrict: "E",
+        require: ["select", "?ngModel"],
+        controller: Gh,
+        priority: 1,
+        link: {
+          pre: function(a, b, d, c) {
+            var e = c[0],
+              f = c[1];
+            if (f) {
+              if (e.ngModelCtrl = f, b.on("change", function() {
+                  e.removeUnknownOption();
+                  a.$apply(function() {
+                    f.$setViewValue(e.readValue())
+                  })
+                }), d.multiple) {
+                e.multiple = !0;
+                e.readValue = function() {
+                  var a = [];
+                  r(b.find("option"), function(b) {
+                    b.selected && !b.disabled &&
+                      (b = b.value, a.push(b in e.selectValueMap ? e.selectValueMap[b] : b))
+                  });
+                  return a
+                };
+                e.writeValue = function(a) {
+                  r(b.find("option"), function(b) {
+                    var c = !!a && (-1 !== Array.prototype.indexOf.call(a, b.value) || -1 !== Array.prototype.indexOf.call(a, e.selectValueMap[b.value]));
+                    c !== b.selected && Oa(x(b), c)
+                  })
+                };
+                var g, k = NaN;
+                a.$watch(function() {
+                  k !== f.$viewValue || va(g, f.$viewValue) || (g = ja(f.$viewValue), f.$render());
+                  k = f.$viewValue
+                });
+                f.$isEmpty = function(a) {
+                  return !a || 0 === a.length
+                }
+              }
+            } else e.registerOption = E
+          },
+          post: function(a, b, d, c) {
+            var e =
+              c[1];
+            if (e) {
+              var f = c[0];
+              e.$render = function() {
+                f.writeValue(e.$viewValue)
+              }
+            }
+          }
+        }
+      }
+    },
+    Ve = ["$interpolate", function(a) {
+      return {
+        restrict: "E",
+        priority: 100,
+        compile: function(b, d) {
+          var c, e;
+          w(d.ngValue) || (w(d.value) ? c = a(d.value, !0) : (e = a(b.text(), !0)) || d.$set("value", b.text()));
+          return function(a, b, d) {
+            var h = b.parent();
+            (h = h.data("$selectController") || h.parent().data("$selectController")) && h.registerOption(a, b, d, c, e)
+          }
+        }
+      }
+    }],
+    bd = ["$parse", function(a) {
+      return {
+        restrict: "A",
+        require: "?ngModel",
+        link: function(b, d, c, e) {
+          if (e) {
+            var f =
+              c.hasOwnProperty("required") || a(c.ngRequired)(b);
+            c.ngRequired || (c.required = !0);
+            e.$validators.required = function(a, b) {
+              return !f || !e.$isEmpty(b)
+            };
+            c.$observe("required", function(a) {
+              f !== a && (f = a, e.$validate())
+            })
+          }
+        }
+      }
+    }],
+    ad = ["$parse", function(a) {
+      return {
+        restrict: "A",
+        require: "?ngModel",
+        compile: function(b, d) {
+          var c, e;
+          d.ngPattern && (c = d.ngPattern, e = "/" === d.ngPattern.charAt(0) && ke.test(d.ngPattern) ? function() {
+            return d.ngPattern
+          } : a(d.ngPattern));
+          return function(a, b, d, h) {
+            if (h) {
+              var l = d.pattern;
+              d.ngPattern ? l = e(a) : c = d.pattern;
+              var m = je(l, c, b);
+              d.$observe("pattern", function(a) {
+                var d = m;
+                m = je(a, c, b);
+                (d && d.toString()) !== (m && m.toString()) && h.$validate()
+              });
+              h.$validators.pattern = function(a, b) {
+                return h.$isEmpty(b) || A(m) || m.test(b)
+              }
+            }
+          }
+        }
+      }
+    }],
+    dd = ["$parse", function(a) {
+      return {
+        restrict: "A",
+        require: "?ngModel",
+        link: function(b, d, c, e) {
+          if (e) {
+            var f = c.maxlength || a(c.ngMaxlength)(b),
+              g = Ub(f);
+            c.$observe("maxlength", function(a) {
+              f !== a && (g = Ub(a), f = a, e.$validate())
+            });
+            e.$validators.maxlength = function(a, b) {
+              return 0 > g || e.$isEmpty(b) || b.length <= g
+            }
+          }
+        }
+      }
+    }],
+    cd = ["$parse", function(a) {
+      return {
+        restrict: "A",
+        require: "?ngModel",
+        link: function(b, d, c, e) {
+          if (e) {
+            var f = c.minlength || a(c.ngMinlength)(b),
+              g = Ub(f) || -1;
+            c.$observe("minlength", function(a) {
+              f !== a && (g = Ub(a) || -1, f = a, e.$validate())
+            });
+            e.$validators.minlength = function(a, b) {
+              return e.$isEmpty(b) || b.length >= g
+            }
+          }
+        }
+      }
+    }];
+  z.angular.bootstrap ? z.console && console.log("WARNING: Tried to load AngularJS more than once.") : (Je(), Oe(ca), ca.module("ngLocale", [], ["$provide", function(a) {
+    function b(a) {
+      a += "";
+      var b = a.indexOf(".");
+      return -1 ==
+        b ? 0 : a.length - b - 1
+    }
+    a.value("$locale", {
+      DATETIME_FORMATS: {
+        AMPMS: ["AM", "PM"],
+        DAY: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
+        ERANAMES: ["Before Christ", "Anno Domini"],
+        ERAS: ["BC", "AD"],
+        FIRSTDAYOFWEEK: 6,
+        MONTH: "January February March April May June July August September October November December".split(" "),
+        SHORTDAY: "Sun Mon Tue Wed Thu Fri Sat".split(" "),
+        SHORTMONTH: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
+        STANDALONEMONTH: "January February March April May June July August September October November December".split(" "),
+        WEEKENDRANGE: [5, 6],
+        fullDate: "EEEE, MMMM d, y",
+        longDate: "MMMM d, y",
+        medium: "MMM d, y h:mm:ss a",
+        mediumDate: "MMM d, y",
+        mediumTime: "h:mm:ss a",
+        "short": "M/d/yy h:mm a",
+        shortDate: "M/d/yy",
+        shortTime: "h:mm a"
+      },
+      NUMBER_FORMATS: {
+        CURRENCY_SYM: "$",
+        DECIMAL_SEP: ".",
+        GROUP_SEP: ",",
+        PATTERNS: [{
+          gSize: 3,
+          lgSize: 3,
+          maxFrac: 3,
+          minFrac: 0,
+          minInt: 1,
+          negPre: "-",
+          negSuf: "",
+          posPre: "",
+          posSuf: ""
+        }, {
+          gSize: 3,
+          lgSize: 3,
+          maxFrac: 2,
+          minFrac: 2,
+          minInt: 1,
+          negPre: "-\u00a4",
+          negSuf: "",
+          posPre: "\u00a4",
+          posSuf: ""
+        }]
+      },
+      id: "en-us",
+      localeID: "en_US",
+      pluralCat: function(a,
+        c) {
+        var e = a | 0,
+          f = c;
+        void 0 === f && (f = Math.min(b(a), 3));
+        Math.pow(10, f);
+        return 1 == e && 0 == f ? "one" : "other"
+      }
+    })
+  }]), x(function() {
+    Ee(z.document, Wc)
+  }))
+})(window);
+!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend(window.angular.element("<style>").text('@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}'));
+//# sourceMappingURL=angular.min.js.map
\ No newline at end of file
diff --git a/public/tvox/js/auth.service.js b/public/tvox/js/auth.service.js
new file mode 100644
index 0000000..a3c5976
--- /dev/null
+++ b/public/tvox/js/auth.service.js
@@ -0,0 +1,601 @@
+(function() {
+  'use strict';
+
+  angular.module('motion.auth', []).factory('Auth', AuthService);
+
+  /** @ngInject */
+  function AuthService($mdDialog, $cookies, $q, $window, $document, api) {
+    var motionCurrentUser;
+
+    var service = {
+      getToken: getToken,
+      getCurrentUser: getCurrentUser,
+      getPermissions: getPermissions,
+      hasChildrenPermissions: hasChildrenPermissions,
+      hasModulePermissions: hasModulePermissions,
+      hasModulesPermissions: hasModulesPermissions,
+      hasRole: hasRole,
+      hasPermission: hasPermission,
+      hasResourcePermission: hasResourcePermission,
+      hasSectionPermissions: hasSectionPermissions,
+      hasSectionsPermissions: hasSectionsPermissions,
+      isAgent: isAgent,
+      isAdmin: isAdmin,
+      isLoggedIn: isLoggedIn,
+      isTelephone: isTelephone,
+      isUser: isUser,
+      login: login,
+      logout: logout,
+      parseCrudPermissions: parseCrudPermissions,
+      queueLogin: queueLogin,
+      reloadPermissions: reloadPermissions,
+      removeCookies: removeCookies,
+      retrieveUser: retrieveUser,
+      setCurrentUser: setCurrentUser,
+      getAuthenticationType: getAuthenticationType,
+      loginSSO: loginSSO
+    };
+
+    return service;
+
+    /**
+     * Gets the authorization token
+     * @return {Object} Authorization token
+     */
+    function getToken() {
+      return $cookies.get('motion.token');
+    }
+
+    /**
+     * Gets the currently logged in user
+     * @return {Object} The currently logged in user
+     */
+    function getCurrentUser() {
+      return motionCurrentUser;
+    }
+
+    /**
+     * Sets the currently logged in user
+     * @param {Object} user - The currently logged in user
+     */
+    function setCurrentUser(user) {
+      motionCurrentUser = _.merge(motionCurrentUser, user);
+    }
+
+    /**
+     * Adds an agent to the queues
+     * @param {Object} intrf - The agent interface
+     * @return {Object} Updated user
+     */
+    function queueLogin(intrf) {
+      return $q(function(resolve, reject) {
+        api.user
+          .login({
+            id: motionCurrentUser.id,
+            device: 'web',
+            intrf: intrf
+          })
+          .$promise.then(function(user) {
+            resolve(user);
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Removes an agent from the queues
+     */
+    function queueLogout() {
+      return $q(function(resolve, reject) {
+        api.user
+          .logout({
+            id: motionCurrentUser.id,
+            device: 'web'
+          })
+          .$promise.then(function() {
+            resolve();
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Sets the user's online status if the role is 'admin' or 'user'
+     * @return {Object} Updated user
+     */
+    function setOnlineStatus(status) {
+      return $q(function(resolve, reject) {
+        var data = {
+          online: status,
+          lastLoginAt: status ? moment().format('YYYY-MM-DD HH:mm:ss') : undefined
+        };
+        api.user
+          .update({
+              id: motionCurrentUser.id
+            },
+            data
+          )
+          .$promise.then(function(user) {
+            resolve(user);
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Authenticate user and save token
+     * @param  {Object} user - The user which requires authentication
+     * @return {Promise}
+     */
+    function login(user) {
+      return $q(function(resolve, reject) {
+        api.auth
+          .local(user)
+          .$promise.then(function(res) {
+            console.log("RES", res.token);
+            $cookies.put('motion.token', res.token, {
+              secure: true,
+              samesite: 'strict'
+            });
+
+            return api.user.get({
+              id: res.id
+            }).$promise;
+          })
+          .then(function(user) {
+            motionCurrentUser = user;
+            motionCurrentUser.lastLoginAt = moment().format('YYYY-MM-DD HH:mm:ss');
+            setAuthenticationType('LOCAL_LOGIN');
+          })
+          .then(function() {
+            if (isAgent() && motionCurrentUser.showWebBar === 1 && motionCurrentUser.hotdesk) {
+              return $mdDialog.show({
+                controller: 'HotDeskDialogController',
+                controllerAs: 'vm',
+                templateUrl: 'app/auth/services/hotdesk/dialog.html',
+                parent: angular.element($document.body),
+                clickOutsideToClose: false,
+                resolve: {
+                  telephones: function(apiResolver) {
+                    return apiResolver.resolve('user@get', {
+                      fields: 'id,fullname,name,internal',
+                      role: 'telephone',
+                      nolimit: true
+                    });
+                  }
+                }
+              });
+            }
+          })
+          .then(function(intrf) {
+            if (isAgent() && motionCurrentUser.showWebBar !== 0) {
+              return queueLogin(intrf);
+            } else if (isAdmin() || isUser()) {
+              return setOnlineStatus(true);
+            } else {
+              return;
+            }
+          })
+          .then(function(updatedUser) {
+            motionCurrentUser = _.assign(motionCurrentUser, updatedUser);
+            resolve();
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Removes authentication cookies and local storage data
+     */
+    function removeCookies() {
+      $cookies.remove('motion.token');
+      if (motionCurrentUser) {
+        $window.localStorage.removeItem('motion.user:' + motionCurrentUser.id);
+        $window.localStorage.removeItem('motion.authenticationtype');
+
+        motionCurrentUser = null;
+      }
+    }
+
+    /**
+     * Delete access token and user info
+     * @param {Boolean} logoutBySomeoneElse Flag to discriminate who initiated the logout
+     */
+    function logout(logoutBySomeoneElse) {
+      return $q(function(resolve, reject) {
+        if (logoutBySomeoneElse) {
+          removeCookies();
+          resolve();
+        } else {
+          $q.resolve()
+            .then(function() {
+              if (isAgent() && motionCurrentUser.showWebBar !== 0) {
+                return queueLogout();
+              } else if (isAdmin() || isUser()) {
+                return setOnlineStatus(false);
+              } else {
+                return;
+              }
+            })
+            .then(function() {
+              removeCookies();
+              resolve();
+            })
+            .catch(function(err) {
+              reject(err);
+            });
+        }
+      });
+    }
+
+    /**
+     * Checks if a user is logged by retrieving the authentication token
+     * @return {Boolean}
+     */
+    function isLoggedIn() {
+      return getToken() ? true : false;
+    }
+
+    /**
+     * Checks if an user is an 'agent'
+     * @return {Boolean}
+     */
+    function isAgent() {
+      return motionCurrentUser.role === 'agent';
+    }
+
+    /**
+     * Checks if an user is an 'admin'
+     * @return {Boolean}
+     */
+    function isAdmin() {
+      return motionCurrentUser.role === 'admin';
+    }
+
+    /**
+     * Checks if an user is an 'user'
+     * @return {Boolean}
+     */
+    function isUser() {
+      return motionCurrentUser.role === 'user';
+    }
+
+    /**
+     * Checks if an user is a 'telephone'
+     * @return {Boolean}
+     */
+    function isTelephone() {
+      return motionCurrentUser.role === 'telephone';
+    }
+
+    /**
+     * Retrieves the current logged in user
+     * @return {Boolean}
+     */
+    function retrieveUser() {
+      return $q(function(resolve, reject) {
+        api.user
+          .whoami()
+          .$promise.then(function(user) {
+            if (user.role === 'user') {
+              return getPermissions(user.userProfileId).then(function(permissions) {
+                user.permissions = permissions;
+                return user;
+              });
+            } else {
+              return user;
+            }
+          })
+          .then(function(user) {
+            motionCurrentUser = user;
+            resolve(motionCurrentUser);
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Checks if a user has a specified role
+     * @param  {String} role - The role to check against
+     * @return {Boolean}
+     */
+    function hasRole(role) {
+      return motionCurrentUser ? motionCurrentUser.role === role : false;
+    }
+
+    /**
+     * Check if a user has a specified permissions
+     * @param  {String} id - The section id to verify
+     * @return {Boolean}
+     */
+    function hasPermission(id) {
+      return motionCurrentUser ? _.includes(motionCurrentUser.permissions, id) : false;
+    }
+
+    /**
+     * Get permissions from User Profile
+     * @param  {Integer} userProfileId - The id of the User Profile to
+     */
+    function getPermissions(userProfileId) {
+      var permissions = [];
+
+      return $q(function(resolve, reject) {
+        if (!userProfileId) {
+          resolve(permissions);
+        }
+
+        return api.userProfile
+          .getSections({
+            id: userProfileId
+          })
+          .$promise.then(function(sections) {
+            for (var i = 0; i < sections.length; i++) {
+              var item = sections[i];
+              permissions.push(item.sectionId);
+              if (item.subsections) {
+                permissions = _.concat(permissions, item.subsections);
+              }
+            }
+
+            return permissions;
+          })
+          .then(function(permissions) {
+            resolve(permissions);
+          })
+          .catch(function(err) {
+            reject('Error retrieving user profile permissions', err);
+          });
+      });
+    }
+
+    /**
+     * Determine if a section should be visible because of the visibility of one of its subsections
+     * @param {Array} ids The list of subsections ids
+     */
+    function hasChildrenPermissions(ids) {
+      if (!ids) return false;
+
+      return _.some(ids, function(id) {
+        return hasPermission(id);
+      });
+    }
+
+    /**
+     * Reload permissions for the current user on a page reload
+     *
+     */
+    function reloadPermissions() {
+      return $q(function(resolve, reject) {
+        getPermissions(motionCurrentUser.userProfileId)
+          .then(function(permissions) {
+            motionCurrentUser.permissions = permissions;
+            resolve();
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Parse the crud permissions
+     * @param {String} crudPermissions The crud permissions as stored on the database (red : Read | Edit | Delete)
+     */
+    function parseCrudPermissions(crudPermissions) {
+      if (isAdmin()) {
+        return {
+          readOnly: false,
+          canEdit: true,
+          canDelete: true
+        };
+      } else {
+        if (!crudPermissions) {
+          return {
+            readOnly: true,
+            canEdit: false,
+            canDelete: false
+          };
+        } else {
+          return {
+            readOnly: _.includes(crudPermissions, 'r') && crudPermissions.length === 1 ? true : false,
+            canEdit: _.includes(crudPermissions, 'e') ? true : false,
+            canDelete: _.includes(crudPermissions, 'd') ? true : false
+          };
+        }
+      }
+    }
+
+    /**
+     * Check if the user has valid permission on a specific resource
+     * @param {Number} sectionId The id of the parent section
+     * @param {Number} resourceId The id of the resource to check
+     */
+    function hasResourcePermission(sectionId, resourceId) {
+      return $q(function(resolve, reject) {
+        return api.userProfileSection
+          .get({
+            userProfileId: motionCurrentUser.userProfileId,
+            sectionId: sectionId
+          })
+          .$promise.then(function(entities) {
+            var section = entities.rows[0];
+            // If AutoAssociation is enabled it means that all resources are available
+            if (section.autoAssociation) return resolve();
+            // Checking if the current section does not require single resource association
+            var navigationItem = msNavigationService.getActiveItem().node;
+            if (navigationItem.permissions && navigationItem.permissions.association === false) return resolve();
+            // Retrieving sections's associated resources
+            return api.userProfileResource
+              .get({
+                sectionId: section.id,
+                nolimit: true
+              })
+              .$promise.then(function(entities) {
+                var resources = entities.rows;
+                _.some(resources, ['resourceId', resourceId]) ? resolve() : reject();
+              });
+          })
+          .catch(function(err) {
+            reject('Error retrieving user profile permissions', err);
+          });
+      });
+    }
+
+    /**
+     * Check if the user has valid permission on a section
+     * @param {Integer} id The section id
+     */
+    function hasSectionPermissions(id) {
+      return $q(function(resolve, reject) {
+        var data = {};
+        return reloadPermissions()
+          .then(function() {
+            if (_.includes(motionCurrentUser.permissions, id)) {
+              data[id] = true;
+            }
+            resolve(data);
+          })
+          .catch(function(err) {
+            reject(err);
+          });
+      });
+    }
+
+    /**
+     * Check if the user has valid permission on all the sections specified
+     * @param {Array} sections The ids of the sections
+     * @return {Object} Object with each section as key
+     */
+    function hasSectionsPermissions(sections) {
+      return $q(function(resolve, reject) {
+        var data = {};
+
+        if (isAdmin()) {
+          sections.forEach(function(key) {
+            data[key] = true;
+          });
+          resolve(data);
+        } else {
+          return reloadPermissions()
+            .then(function() {
+              sections.forEach(function(id) {
+                if (_.includes(motionCurrentUser.permissions, id)) {
+                  data[id] = true;
+                }
+              });
+              resolve(data);
+            })
+            .catch(function(err) {
+              reject(err);
+            });
+        }
+      });
+    }
+
+    /**
+     * Check if the user has valid permissions on at least one section of a module
+     * @param {String} category The category name
+     */
+    function hasModulePermissions(category) {
+      return $q(function(resolve, reject) {
+        if (isAdmin()) {
+          resolve(true);
+        } else {
+          api.userProfileSection
+            .get({
+              userProfileId: motionCurrentUser.userProfileId
+            })
+            .$promise.then(function(entities) {
+              var sections = entities && entities.rows ? entities.rows : [];
+              if (!_.isEmpty(sections)) {
+                var enabledSections = _.filter(sections, function(section) {
+                  return section.enabled;
+                });
+                resolve(_.some(enabledSections, ['category', category]));
+              } else {
+                resolve(false);
+              }
+            })
+            .catch(function(err) {
+              reject(err);
+            });
+        }
+      });
+    }
+
+    /**
+     * Check if the user has valid permissions on at least one section for each module
+     * @param {Array} categories The categories' names
+     * @return {Object} Object with each module as key
+     */
+    function hasModulesPermissions(categories) {
+      return $q(function(resolve, reject) {
+        var data = {};
+
+        if (isAdmin()) {
+          categories.forEach(function(key) {
+            data[key] = true;
+          });
+          resolve(data);
+        } else {
+          api.userProfileSection
+            .get({
+              userProfileId: motionCurrentUser.userProfileId
+            })
+            .$promise.then(function(entities) {
+              var sections = entities && entities.rows ? entities.rows : [];
+              if (!_.isEmpty(sections)) {
+                var enabledCategories = _(sections)
+                  .filter(function(section) {
+                    return section.enabled && _.includes(categories, section.category);
+                  })
+                  .uniqBy(function(section) {
+                    return section.category;
+                  })
+                  .map(function(section) {
+                    return section.category;
+                  })
+                  .value();
+
+                enabledCategories.forEach(function(key) {
+                  data[key] = true;
+                });
+                resolve(data);
+              } else {
+                resolve({});
+              }
+            })
+            .catch(function(err) {
+              reject(err);
+            });
+        }
+      });
+    }
+
+    /**
+     * Return authentication type choose by user
+     */
+    function getAuthenticationType() {
+      return $window.localStorage['motion.authenticationtype'] || 'NONE';
+    }
+
+    function setAuthenticationType(authenticationType) {
+      $window.localStorage['motion.authenticationtype'] = authenticationType;
+    }
+
+    function loginSSO(provider) {
+      setAuthenticationType('SSO_LOGIN');
+      return '/api/auth/' + provider;
+    }
+  }
+})();
\ No newline at end of file
diff --git a/public/tvox/js/index.socket.js b/public/tvox/js/index.socket.js
new file mode 100644
index 0000000..1888bbf
--- /dev/null
+++ b/public/tvox/js/index.socket.js
@@ -0,0 +1,72 @@
+(function() {
+  'use strict';
+
+  angular.module('motion', []).factory('socket', Socket);
+
+  function Socket($rootScope) {
+    var socket;
+
+    function connect() {
+      socket = io({
+        query: $rootScope.userId ? 'id=' + $rootScope.userId : undefined,
+        transports: ['websocket', 'polling']
+      });
+    }
+
+    return {
+      connect: connect,
+      on: function(eventName, callback) {
+        callback = callback || angular.noop;
+        if (!socket) {
+          connect();
+        }
+        socket.on(eventName, function() {
+          var args = arguments;
+          $rootScope.$apply(function() {
+            callback.apply(socket, args);
+          });
+        });
+      },
+      onWithoutApply: function(eventName, callback) {
+        callback = callback || angular.noop;
+        if (!socket) {
+          connect();
+        }
+        socket.on(eventName, function() {
+          callback.apply(socket, arguments);
+        });
+      },
+      emit: function(eventName, data, callback) {
+        console.log("CRIS socket e,int", eventName);
+        callback = callback || angular.noop;
+        if (!socket) {
+          connect();
+        }
+        socket.emit(eventName, data, function() {
+          var args = arguments;
+          $rootScope.$apply(function() {
+            callback.apply(socket, args);
+          });
+        });
+      },
+      removeAllListeners: function(eventName) {
+        if (!socket) {
+          connect();
+        }
+        socket.removeAllListeners(eventName);
+      },
+      removeListener: function(eventName, fn) {
+        if (!socket) {
+          connect();
+        }
+        socket.removeListener(eventName, fn);
+      },
+      disconnect: function() {
+        if (!socket) {
+          connect();
+        }
+        socket.disconnect();
+      }
+    };
+  }
+})();
\ No newline at end of file
diff --git a/public/tvox/js/lodash.min.js b/public/tvox/js/lodash.min.js
new file mode 100644
index 0000000..3c17af7
--- /dev/null
+++ b/public/tvox/js/lodash.min.js
@@ -0,0 +1,17335 @@
+/**
+ * @license
+ * Lodash <https://lodash.com/>
+ * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+;
+(function() {
+
+  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+  var undefined;
+
+  /** Used as the semantic version number. */
+  var VERSION = '4.17.20';
+
+  /** Used as the size to enable large array optimizations. */
+  var LARGE_ARRAY_SIZE = 200;
+
+  /** Error message constants. */
+  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
+    FUNC_ERROR_TEXT = 'Expected a function';
+
+  /** Used to stand-in for `undefined` hash values. */
+  var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+  /** Used as the maximum memoize cache size. */
+  var MAX_MEMOIZE_SIZE = 500;
+
+  /** Used as the internal argument placeholder. */
+  var PLACEHOLDER = '__lodash_placeholder__';
+
+  /** Used to compose bitmasks for cloning. */
+  var CLONE_DEEP_FLAG = 1,
+    CLONE_FLAT_FLAG = 2,
+    CLONE_SYMBOLS_FLAG = 4;
+
+  /** Used to compose bitmasks for value comparisons. */
+  var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+  /** Used to compose bitmasks for function metadata. */
+  var WRAP_BIND_FLAG = 1,
+    WRAP_BIND_KEY_FLAG = 2,
+    WRAP_CURRY_BOUND_FLAG = 4,
+    WRAP_CURRY_FLAG = 8,
+    WRAP_CURRY_RIGHT_FLAG = 16,
+    WRAP_PARTIAL_FLAG = 32,
+    WRAP_PARTIAL_RIGHT_FLAG = 64,
+    WRAP_ARY_FLAG = 128,
+    WRAP_REARG_FLAG = 256,
+    WRAP_FLIP_FLAG = 512;
+
+  /** Used as default options for `_.truncate`. */
+  var DEFAULT_TRUNC_LENGTH = 30,
+    DEFAULT_TRUNC_OMISSION = '...';
+
+  /** Used to detect hot functions by number of calls within a span of milliseconds. */
+  var HOT_COUNT = 800,
+    HOT_SPAN = 16;
+
+  /** Used to indicate the type of lazy iteratees. */
+  var LAZY_FILTER_FLAG = 1,
+    LAZY_MAP_FLAG = 2,
+    LAZY_WHILE_FLAG = 3;
+
+  /** Used as references for various `Number` constants. */
+  var INFINITY = 1 / 0,
+    MAX_SAFE_INTEGER = 9007199254740991,
+    MAX_INTEGER = 1.7976931348623157e+308,
+    NAN = 0 / 0;
+
+  /** Used as references for the maximum length and index of an array. */
+  var MAX_ARRAY_LENGTH = 4294967295,
+    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
+    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+
+  /** Used to associate wrap methods with their bit flags. */
+  var wrapFlags = [
+    ['ary', WRAP_ARY_FLAG],
+    ['bind', WRAP_BIND_FLAG],
+    ['bindKey', WRAP_BIND_KEY_FLAG],
+    ['curry', WRAP_CURRY_FLAG],
+    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
+    ['flip', WRAP_FLIP_FLAG],
+    ['partial', WRAP_PARTIAL_FLAG],
+    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
+    ['rearg', WRAP_REARG_FLAG]
+  ];
+
+  /** `Object#toString` result references. */
+  var argsTag = '[object Arguments]',
+    arrayTag = '[object Array]',
+    asyncTag = '[object AsyncFunction]',
+    boolTag = '[object Boolean]',
+    dateTag = '[object Date]',
+    domExcTag = '[object DOMException]',
+    errorTag = '[object Error]',
+    funcTag = '[object Function]',
+    genTag = '[object GeneratorFunction]',
+    mapTag = '[object Map]',
+    numberTag = '[object Number]',
+    nullTag = '[object Null]',
+    objectTag = '[object Object]',
+    promiseTag = '[object Promise]',
+    proxyTag = '[object Proxy]',
+    regexpTag = '[object RegExp]',
+    setTag = '[object Set]',
+    stringTag = '[object String]',
+    symbolTag = '[object Symbol]',
+    undefinedTag = '[object Undefined]',
+    weakMapTag = '[object WeakMap]',
+    weakSetTag = '[object WeakSet]';
+
+  var arrayBufferTag = '[object ArrayBuffer]',
+    dataViewTag = '[object DataView]',
+    float32Tag = '[object Float32Array]',
+    float64Tag = '[object Float64Array]',
+    int8Tag = '[object Int8Array]',
+    int16Tag = '[object Int16Array]',
+    int32Tag = '[object Int32Array]',
+    uint8Tag = '[object Uint8Array]',
+    uint8ClampedTag = '[object Uint8ClampedArray]',
+    uint16Tag = '[object Uint16Array]',
+    uint32Tag = '[object Uint32Array]';
+
+  /** Used to match empty string literals in compiled template source. */
+  var reEmptyStringLeading = /\b__p \+= '';/g,
+    reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+    reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+
+  /** Used to match HTML entities and HTML characters. */
+  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+    reUnescapedHtml = /[&<>"']/g,
+    reHasEscapedHtml = RegExp(reEscapedHtml.source),
+    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+
+  /** Used to match template delimiters. */
+  var reEscape = /<%-([\s\S]+?)%>/g,
+    reEvaluate = /<%([\s\S]+?)%>/g,
+    reInterpolate = /<%=([\s\S]+?)%>/g;
+
+  /** Used to match property names within property paths. */
+  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+    reIsPlainProp = /^\w*$/,
+    rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+
+  /**
+   * Used to match `RegExp`
+   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+   */
+  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
+    reHasRegExpChar = RegExp(reRegExpChar.source);
+
+  /** Used to match leading and trailing whitespace. */
+  var reTrim = /^\s+|\s+$/g,
+    reTrimStart = /^\s+/,
+    reTrimEnd = /\s+$/;
+
+  /** Used to match wrap detail comments. */
+  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
+    reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+    reSplitDetails = /,? & /;
+
+  /** Used to match words composed of alphanumeric characters. */
+  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+
+  /** Used to match backslashes in property paths. */
+  var reEscapeChar = /\\(\\)?/g;
+
+  /**
+   * Used to match
+   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
+   */
+  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+
+  /** Used to match `RegExp` flags from their coerced string values. */
+  var reFlags = /\w*$/;
+
+  /** Used to detect bad signed hexadecimal string values. */
+  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+  /** Used to detect binary string values. */
+  var reIsBinary = /^0b[01]+$/i;
+
+  /** Used to detect host constructors (Safari). */
+  var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+  /** Used to detect octal string values. */
+  var reIsOctal = /^0o[0-7]+$/i;
+
+  /** Used to detect unsigned integer values. */
+  var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+  /** Used to match Latin Unicode letters (excluding mathematical operators). */
+  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+
+  /** Used to ensure capturing order of template delimiters. */
+  var reNoMatch = /($^)/;
+
+  /** Used to match unescaped characters in compiled string literals. */
+  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+
+  /** Used to compose unicode character classes. */
+  var rsAstralRange = '\\ud800-\\udfff',
+    rsComboMarksRange = '\\u0300-\\u036f',
+    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
+    rsComboSymbolsRange = '\\u20d0-\\u20ff',
+    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
+    rsDingbatRange = '\\u2700-\\u27bf',
+    rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
+    rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
+    rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
+    rsPunctuationRange = '\\u2000-\\u206f',
+    rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
+    rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
+    rsVarRange = '\\ufe0e\\ufe0f',
+    rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
+
+  /** Used to compose unicode capture groups. */
+  var rsApos = "['\u2019]",
+    rsAstral = '[' + rsAstralRange + ']',
+    rsBreak = '[' + rsBreakRange + ']',
+    rsCombo = '[' + rsComboRange + ']',
+    rsDigits = '\\d+',
+    rsDingbat = '[' + rsDingbatRange + ']',
+    rsLower = '[' + rsLowerRange + ']',
+    rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
+    rsFitz = '\\ud83c[\\udffb-\\udfff]',
+    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
+    rsNonAstral = '[^' + rsAstralRange + ']',
+    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
+    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
+    rsUpper = '[' + rsUpperRange + ']',
+    rsZWJ = '\\u200d';
+
+  /** Used to compose unicode regexes. */
+  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
+    rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
+    rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
+    rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
+    reOptMod = rsModifier + '?',
+    rsOptVar = '[' + rsVarRange + ']?',
+    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
+    rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
+    rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
+    rsSeq = rsOptVar + reOptMod + rsOptJoin,
+    rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
+    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
+
+  /** Used to match apostrophes. */
+  var reApos = RegExp(rsApos, 'g');
+
+  /**
+   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+   */
+  var reComboMark = RegExp(rsCombo, 'g');
+
+  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+
+  /** Used to match complex or compound words. */
+  var reUnicodeWord = RegExp([
+    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
+    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
+    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
+    rsUpper + '+' + rsOptContrUpper,
+    rsOrdUpper,
+    rsOrdLower,
+    rsDigits,
+    rsEmoji
+  ].join('|'), 'g');
+
+  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
+
+  /** Used to detect strings that need a more robust regexp to match words. */
+  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
+
+  /** Used to assign default `context` object properties. */
+  var contextProps = [
+    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
+    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
+    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
+    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
+    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
+  ];
+
+  /** Used to make template sourceURLs easier to identify. */
+  var templateCounter = -1;
+
+  /** Used to identify `toStringTag` values of typed arrays. */
+  var typedArrayTags = {};
+  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+    typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+    typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+    typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+    typedArrayTags[uint32Tag] = true;
+  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+    typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+    typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+    typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+    typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+    typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+    typedArrayTags[setTag] = typedArrayTags[stringTag] =
+    typedArrayTags[weakMapTag] = false;
+
+  /** Used to identify `toStringTag` values supported by `_.clone`. */
+  var cloneableTags = {};
+  cloneableTags[argsTag] = cloneableTags[arrayTag] =
+    cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
+    cloneableTags[boolTag] = cloneableTags[dateTag] =
+    cloneableTags[float32Tag] = cloneableTags[float64Tag] =
+    cloneableTags[int8Tag] = cloneableTags[int16Tag] =
+    cloneableTags[int32Tag] = cloneableTags[mapTag] =
+    cloneableTags[numberTag] = cloneableTags[objectTag] =
+    cloneableTags[regexpTag] = cloneableTags[setTag] =
+    cloneableTags[stringTag] = cloneableTags[symbolTag] =
+    cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+    cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+  cloneableTags[errorTag] = cloneableTags[funcTag] =
+    cloneableTags[weakMapTag] = false;
+
+  /** Used to map Latin Unicode letters to basic Latin letters. */
+  var deburredLetters = {
+    // Latin-1 Supplement block.
+    '\xc0': 'A',
+    '\xc1': 'A',
+    '\xc2': 'A',
+    '\xc3': 'A',
+    '\xc4': 'A',
+    '\xc5': 'A',
+    '\xe0': 'a',
+    '\xe1': 'a',
+    '\xe2': 'a',
+    '\xe3': 'a',
+    '\xe4': 'a',
+    '\xe5': 'a',
+    '\xc7': 'C',
+    '\xe7': 'c',
+    '\xd0': 'D',
+    '\xf0': 'd',
+    '\xc8': 'E',
+    '\xc9': 'E',
+    '\xca': 'E',
+    '\xcb': 'E',
+    '\xe8': 'e',
+    '\xe9': 'e',
+    '\xea': 'e',
+    '\xeb': 'e',
+    '\xcc': 'I',
+    '\xcd': 'I',
+    '\xce': 'I',
+    '\xcf': 'I',
+    '\xec': 'i',
+    '\xed': 'i',
+    '\xee': 'i',
+    '\xef': 'i',
+    '\xd1': 'N',
+    '\xf1': 'n',
+    '\xd2': 'O',
+    '\xd3': 'O',
+    '\xd4': 'O',
+    '\xd5': 'O',
+    '\xd6': 'O',
+    '\xd8': 'O',
+    '\xf2': 'o',
+    '\xf3': 'o',
+    '\xf4': 'o',
+    '\xf5': 'o',
+    '\xf6': 'o',
+    '\xf8': 'o',
+    '\xd9': 'U',
+    '\xda': 'U',
+    '\xdb': 'U',
+    '\xdc': 'U',
+    '\xf9': 'u',
+    '\xfa': 'u',
+    '\xfb': 'u',
+    '\xfc': 'u',
+    '\xdd': 'Y',
+    '\xfd': 'y',
+    '\xff': 'y',
+    '\xc6': 'Ae',
+    '\xe6': 'ae',
+    '\xde': 'Th',
+    '\xfe': 'th',
+    '\xdf': 'ss',
+    // Latin Extended-A block.
+    '\u0100': 'A',
+    '\u0102': 'A',
+    '\u0104': 'A',
+    '\u0101': 'a',
+    '\u0103': 'a',
+    '\u0105': 'a',
+    '\u0106': 'C',
+    '\u0108': 'C',
+    '\u010a': 'C',
+    '\u010c': 'C',
+    '\u0107': 'c',
+    '\u0109': 'c',
+    '\u010b': 'c',
+    '\u010d': 'c',
+    '\u010e': 'D',
+    '\u0110': 'D',
+    '\u010f': 'd',
+    '\u0111': 'd',
+    '\u0112': 'E',
+    '\u0114': 'E',
+    '\u0116': 'E',
+    '\u0118': 'E',
+    '\u011a': 'E',
+    '\u0113': 'e',
+    '\u0115': 'e',
+    '\u0117': 'e',
+    '\u0119': 'e',
+    '\u011b': 'e',
+    '\u011c': 'G',
+    '\u011e': 'G',
+    '\u0120': 'G',
+    '\u0122': 'G',
+    '\u011d': 'g',
+    '\u011f': 'g',
+    '\u0121': 'g',
+    '\u0123': 'g',
+    '\u0124': 'H',
+    '\u0126': 'H',
+    '\u0125': 'h',
+    '\u0127': 'h',
+    '\u0128': 'I',
+    '\u012a': 'I',
+    '\u012c': 'I',
+    '\u012e': 'I',
+    '\u0130': 'I',
+    '\u0129': 'i',
+    '\u012b': 'i',
+    '\u012d': 'i',
+    '\u012f': 'i',
+    '\u0131': 'i',
+    '\u0134': 'J',
+    '\u0135': 'j',
+    '\u0136': 'K',
+    '\u0137': 'k',
+    '\u0138': 'k',
+    '\u0139': 'L',
+    '\u013b': 'L',
+    '\u013d': 'L',
+    '\u013f': 'L',
+    '\u0141': 'L',
+    '\u013a': 'l',
+    '\u013c': 'l',
+    '\u013e': 'l',
+    '\u0140': 'l',
+    '\u0142': 'l',
+    '\u0143': 'N',
+    '\u0145': 'N',
+    '\u0147': 'N',
+    '\u014a': 'N',
+    '\u0144': 'n',
+    '\u0146': 'n',
+    '\u0148': 'n',
+    '\u014b': 'n',
+    '\u014c': 'O',
+    '\u014e': 'O',
+    '\u0150': 'O',
+    '\u014d': 'o',
+    '\u014f': 'o',
+    '\u0151': 'o',
+    '\u0154': 'R',
+    '\u0156': 'R',
+    '\u0158': 'R',
+    '\u0155': 'r',
+    '\u0157': 'r',
+    '\u0159': 'r',
+    '\u015a': 'S',
+    '\u015c': 'S',
+    '\u015e': 'S',
+    '\u0160': 'S',
+    '\u015b': 's',
+    '\u015d': 's',
+    '\u015f': 's',
+    '\u0161': 's',
+    '\u0162': 'T',
+    '\u0164': 'T',
+    '\u0166': 'T',
+    '\u0163': 't',
+    '\u0165': 't',
+    '\u0167': 't',
+    '\u0168': 'U',
+    '\u016a': 'U',
+    '\u016c': 'U',
+    '\u016e': 'U',
+    '\u0170': 'U',
+    '\u0172': 'U',
+    '\u0169': 'u',
+    '\u016b': 'u',
+    '\u016d': 'u',
+    '\u016f': 'u',
+    '\u0171': 'u',
+    '\u0173': 'u',
+    '\u0174': 'W',
+    '\u0175': 'w',
+    '\u0176': 'Y',
+    '\u0177': 'y',
+    '\u0178': 'Y',
+    '\u0179': 'Z',
+    '\u017b': 'Z',
+    '\u017d': 'Z',
+    '\u017a': 'z',
+    '\u017c': 'z',
+    '\u017e': 'z',
+    '\u0132': 'IJ',
+    '\u0133': 'ij',
+    '\u0152': 'Oe',
+    '\u0153': 'oe',
+    '\u0149': "'n",
+    '\u017f': 's'
+  };
+
+  /** Used to map characters to HTML entities. */
+  var htmlEscapes = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#39;'
+  };
+
+  /** Used to map HTML entities to characters. */
+  var htmlUnescapes = {
+    '&amp;': '&',
+    '&lt;': '<',
+    '&gt;': '>',
+    '&quot;': '"',
+    '&#39;': "'"
+  };
+
+  /** Used to escape characters for inclusion in compiled string literals. */
+  var stringEscapes = {
+    '\\': '\\',
+    "'": "'",
+    '\n': 'n',
+    '\r': 'r',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  /** Built-in method references without a dependency on `root`. */
+  var freeParseFloat = parseFloat,
+    freeParseInt = parseInt;
+
+  /** Detect free variable `global` from Node.js. */
+  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+  /** Detect free variable `self`. */
+  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+  /** Used as a reference to the global object. */
+  var root = freeGlobal || freeSelf || Function('return this')();
+
+  /** Detect free variable `exports`. */
+  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+
+  /** Detect free variable `module`. */
+  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+  /** Detect the popular CommonJS extension `module.exports`. */
+  var moduleExports = freeModule && freeModule.exports === freeExports;
+
+  /** Detect free variable `process` from Node.js. */
+  var freeProcess = moduleExports && freeGlobal.process;
+
+  /** Used to access faster Node.js helpers. */
+  var nodeUtil = (function() {
+    try {
+      // Use `util.types` for Node.js 10+.
+      var types = freeModule && freeModule.require && freeModule.require('util').types;
+
+      if (types) {
+        return types;
+      }
+
+      // Legacy `process.binding('util')` for Node.js < 10.
+      return freeProcess && freeProcess.binding && freeProcess.binding('util');
+    } catch (e) {}
+  }());
+
+  /* Node.js helper references. */
+  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
+    nodeIsDate = nodeUtil && nodeUtil.isDate,
+    nodeIsMap = nodeUtil && nodeUtil.isMap,
+    nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
+    nodeIsSet = nodeUtil && nodeUtil.isSet,
+    nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * A faster alternative to `Function#apply`, this function invokes `func`
+   * with the `this` binding of `thisArg` and the arguments of `args`.
+   *
+   * @private
+   * @param {Function} func The function to invoke.
+   * @param {*} thisArg The `this` binding of `func`.
+   * @param {Array} args The arguments to invoke `func` with.
+   * @returns {*} Returns the result of `func`.
+   */
+  function apply(func, thisArg, args) {
+    switch (args.length) {
+      case 0:
+        return func.call(thisArg);
+      case 1:
+        return func.call(thisArg, args[0]);
+      case 2:
+        return func.call(thisArg, args[0], args[1]);
+      case 3:
+        return func.call(thisArg, args[0], args[1], args[2]);
+    }
+    return func.apply(thisArg, args);
+  }
+
+  /**
+   * A specialized version of `baseAggregator` for arrays.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} setter The function to set `accumulator` values.
+   * @param {Function} iteratee The iteratee to transform keys.
+   * @param {Object} accumulator The initial aggregated object.
+   * @returns {Function} Returns `accumulator`.
+   */
+  function arrayAggregator(array, setter, iteratee, accumulator) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    while (++index < length) {
+      var value = array[index];
+      setter(accumulator, value, iteratee(value), array);
+    }
+    return accumulator;
+  }
+
+  /**
+   * A specialized version of `_.forEach` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayEach(array, iteratee) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    while (++index < length) {
+      if (iteratee(array[index], index, array) === false) {
+        break;
+      }
+    }
+    return array;
+  }
+
+  /**
+   * A specialized version of `_.forEachRight` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayEachRight(array, iteratee) {
+    var length = array == null ? 0 : array.length;
+
+    while (length--) {
+      if (iteratee(array[length], length, array) === false) {
+        break;
+      }
+    }
+    return array;
+  }
+
+  /**
+   * A specialized version of `_.every` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {boolean} Returns `true` if all elements pass the predicate check,
+   *  else `false`.
+   */
+  function arrayEvery(array, predicate) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    while (++index < length) {
+      if (!predicate(array[index], index, array)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * A specialized version of `_.filter` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {Array} Returns the new filtered array.
+   */
+  function arrayFilter(array, predicate) {
+    var index = -1,
+      length = array == null ? 0 : array.length,
+      resIndex = 0,
+      result = [];
+
+    while (++index < length) {
+      var value = array[index];
+      if (predicate(value, index, array)) {
+        result[resIndex++] = value;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * A specialized version of `_.includes` for arrays without support for
+   * specifying an index to search from.
+   *
+   * @private
+   * @param {Array} [array] The array to inspect.
+   * @param {*} target The value to search for.
+   * @returns {boolean} Returns `true` if `target` is found, else `false`.
+   */
+  function arrayIncludes(array, value) {
+    var length = array == null ? 0 : array.length;
+    return !!length && baseIndexOf(array, value, 0) > -1;
+  }
+
+  /**
+   * This function is like `arrayIncludes` except that it accepts a comparator.
+   *
+   * @private
+   * @param {Array} [array] The array to inspect.
+   * @param {*} target The value to search for.
+   * @param {Function} comparator The comparator invoked per element.
+   * @returns {boolean} Returns `true` if `target` is found, else `false`.
+   */
+  function arrayIncludesWith(array, value, comparator) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    while (++index < length) {
+      if (comparator(value, array[index])) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * A specialized version of `_.map` for arrays without support for iteratee
+   * shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns the new mapped array.
+   */
+  function arrayMap(array, iteratee) {
+    var index = -1,
+      length = array == null ? 0 : array.length,
+      result = Array(length);
+
+    while (++index < length) {
+      result[index] = iteratee(array[index], index, array);
+    }
+    return result;
+  }
+
+  /**
+   * Appends the elements of `values` to `array`.
+   *
+   * @private
+   * @param {Array} array The array to modify.
+   * @param {Array} values The values to append.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayPush(array, values) {
+    var index = -1,
+      length = values.length,
+      offset = array.length;
+
+    while (++index < length) {
+      array[offset + index] = values[index];
+    }
+    return array;
+  }
+
+  /**
+   * A specialized version of `_.reduce` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} [accumulator] The initial value.
+   * @param {boolean} [initAccum] Specify using the first element of `array` as
+   *  the initial value.
+   * @returns {*} Returns the accumulated value.
+   */
+  function arrayReduce(array, iteratee, accumulator, initAccum) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    if (initAccum && length) {
+      accumulator = array[++index];
+    }
+    while (++index < length) {
+      accumulator = iteratee(accumulator, array[index], index, array);
+    }
+    return accumulator;
+  }
+
+  /**
+   * A specialized version of `_.reduceRight` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} [accumulator] The initial value.
+   * @param {boolean} [initAccum] Specify using the last element of `array` as
+   *  the initial value.
+   * @returns {*} Returns the accumulated value.
+   */
+  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
+    var length = array == null ? 0 : array.length;
+    if (initAccum && length) {
+      accumulator = array[--length];
+    }
+    while (length--) {
+      accumulator = iteratee(accumulator, array[length], length, array);
+    }
+    return accumulator;
+  }
+
+  /**
+   * A specialized version of `_.some` for arrays without support for iteratee
+   * shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {boolean} Returns `true` if any element passes the predicate check,
+   *  else `false`.
+   */
+  function arraySome(array, predicate) {
+    var index = -1,
+      length = array == null ? 0 : array.length;
+
+    while (++index < length) {
+      if (predicate(array[index], index, array)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Gets the size of an ASCII `string`.
+   *
+   * @private
+   * @param {string} string The string inspect.
+   * @returns {number} Returns the string size.
+   */
+  var asciiSize = baseProperty('length');
+
+  /**
+   * Converts an ASCII `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function asciiToArray(string) {
+    return string.split('');
+  }
+
+  /**
+   * Splits an ASCII `string` into an array of its words.
+   *
+   * @private
+   * @param {string} The string to inspect.
+   * @returns {Array} Returns the words of `string`.
+   */
+  function asciiWords(string) {
+    return string.match(reAsciiWord) || [];
+  }
+
+  /**
+   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
+   * without support for iteratee shorthands, which iterates over `collection`
+   * using `eachFunc`.
+   *
+   * @private
+   * @param {Array|Object} collection The collection to inspect.
+   * @param {Function} predicate The function invoked per iteration.
+   * @param {Function} eachFunc The function to iterate over `collection`.
+   * @returns {*} Returns the found element or its key, else `undefined`.
+   */
+  function baseFindKey(collection, predicate, eachFunc) {
+    var result;
+    eachFunc(collection, function(value, key, collection) {
+      if (predicate(value, key, collection)) {
+        result = key;
+        return false;
+      }
+    });
+    return result;
+  }
+
+  /**
+   * The base implementation of `_.findIndex` and `_.findLastIndex` without
+   * support for iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {Function} predicate The function invoked per iteration.
+   * @param {number} fromIndex The index to search from.
+   * @param {boolean} [fromRight] Specify iterating from right to left.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseFindIndex(array, predicate, fromIndex, fromRight) {
+    var length = array.length,
+      index = fromIndex + (fromRight ? 1 : -1);
+
+    while ((fromRight ? index-- : ++index < length)) {
+      if (predicate(array[index], index, array)) {
+        return index;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseIndexOf(array, value, fromIndex) {
+    return value === value ?
+      strictIndexOf(array, value, fromIndex) :
+      baseFindIndex(array, baseIsNaN, fromIndex);
+  }
+
+  /**
+   * This function is like `baseIndexOf` except that it accepts a comparator.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @param {Function} comparator The comparator invoked per element.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseIndexOfWith(array, value, fromIndex, comparator) {
+    var index = fromIndex - 1,
+      length = array.length;
+
+    while (++index < length) {
+      if (comparator(array[index], value)) {
+        return index;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * The base implementation of `_.isNaN` without support for number objects.
+   *
+   * @private
+   * @param {*} value The value to check.
+   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+   */
+  function baseIsNaN(value) {
+    return value !== value;
+  }
+
+  /**
+   * The base implementation of `_.mean` and `_.meanBy` without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {number} Returns the mean.
+   */
+  function baseMean(array, iteratee) {
+    var length = array == null ? 0 : array.length;
+    return length ? (baseSum(array, iteratee) / length) : NAN;
+  }
+
+  /**
+   * The base implementation of `_.property` without support for deep paths.
+   *
+   * @private
+   * @param {string} key The key of the property to get.
+   * @returns {Function} Returns the new accessor function.
+   */
+  function baseProperty(key) {
+    return function(object) {
+      return object == null ? undefined : object[key];
+    };
+  }
+
+  /**
+   * The base implementation of `_.propertyOf` without support for deep paths.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @returns {Function} Returns the new accessor function.
+   */
+  function basePropertyOf(object) {
+    return function(key) {
+      return object == null ? undefined : object[key];
+    };
+  }
+
+  /**
+   * The base implementation of `_.reduce` and `_.reduceRight`, without support
+   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
+   *
+   * @private
+   * @param {Array|Object} collection The collection to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} accumulator The initial value.
+   * @param {boolean} initAccum Specify using the first or last element of
+   *  `collection` as the initial value.
+   * @param {Function} eachFunc The function to iterate over `collection`.
+   * @returns {*} Returns the accumulated value.
+   */
+  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+    eachFunc(collection, function(value, index, collection) {
+      accumulator = initAccum ?
+        (initAccum = false, value) :
+        iteratee(accumulator, value, index, collection);
+    });
+    return accumulator;
+  }
+
+  /**
+   * The base implementation of `_.sortBy` which uses `comparer` to define the
+   * sort order of `array` and replaces criteria objects with their corresponding
+   * values.
+   *
+   * @private
+   * @param {Array} array The array to sort.
+   * @param {Function} comparer The function to define sort order.
+   * @returns {Array} Returns `array`.
+   */
+  function baseSortBy(array, comparer) {
+    var length = array.length;
+
+    array.sort(comparer);
+    while (length--) {
+      array[length] = array[length].value;
+    }
+    return array;
+  }
+
+  /**
+   * The base implementation of `_.sum` and `_.sumBy` without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {number} Returns the sum.
+   */
+  function baseSum(array, iteratee) {
+    var result,
+      index = -1,
+      length = array.length;
+
+    while (++index < length) {
+      var current = iteratee(array[index]);
+      if (current !== undefined) {
+        result = result === undefined ? current : (result + current);
+      }
+    }
+    return result;
+  }
+
+  /**
+   * The base implementation of `_.times` without support for iteratee shorthands
+   * or max array length checks.
+   *
+   * @private
+   * @param {number} n The number of times to invoke `iteratee`.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns the array of results.
+   */
+  function baseTimes(n, iteratee) {
+    var index = -1,
+      result = Array(n);
+
+    while (++index < n) {
+      result[index] = iteratee(index);
+    }
+    return result;
+  }
+
+  /**
+   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
+   * of key-value pairs for `object` corresponding to the property names of `props`.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @param {Array} props The property names to get values for.
+   * @returns {Object} Returns the key-value pairs.
+   */
+  function baseToPairs(object, props) {
+    return arrayMap(props, function(key) {
+      return [key, object[key]];
+    });
+  }
+
+  /**
+   * The base implementation of `_.unary` without support for storing metadata.
+   *
+   * @private
+   * @param {Function} func The function to cap arguments for.
+   * @returns {Function} Returns the new capped function.
+   */
+  function baseUnary(func) {
+    return function(value) {
+      return func(value);
+    };
+  }
+
+  /**
+   * The base implementation of `_.values` and `_.valuesIn` which creates an
+   * array of `object` property values corresponding to the property names
+   * of `props`.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @param {Array} props The property names to get values for.
+   * @returns {Object} Returns the array of property values.
+   */
+  function baseValues(object, props) {
+    return arrayMap(props, function(key) {
+      return object[key];
+    });
+  }
+
+  /**
+   * Checks if a `cache` value for `key` exists.
+   *
+   * @private
+   * @param {Object} cache The cache to query.
+   * @param {string} key The key of the entry to check.
+   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+   */
+  function cacheHas(cache, key) {
+    return cache.has(key);
+  }
+
+  /**
+   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
+   * that is not found in the character symbols.
+   *
+   * @private
+   * @param {Array} strSymbols The string symbols to inspect.
+   * @param {Array} chrSymbols The character symbols to find.
+   * @returns {number} Returns the index of the first unmatched string symbol.
+   */
+  function charsStartIndex(strSymbols, chrSymbols) {
+    var index = -1,
+      length = strSymbols.length;
+
+    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+    return index;
+  }
+
+  /**
+   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
+   * that is not found in the character symbols.
+   *
+   * @private
+   * @param {Array} strSymbols The string symbols to inspect.
+   * @param {Array} chrSymbols The character symbols to find.
+   * @returns {number} Returns the index of the last unmatched string symbol.
+   */
+  function charsEndIndex(strSymbols, chrSymbols) {
+    var index = strSymbols.length;
+
+    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+    return index;
+  }
+
+  /**
+   * Gets the number of `placeholder` occurrences in `array`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} placeholder The placeholder to search for.
+   * @returns {number} Returns the placeholder count.
+   */
+  function countHolders(array, placeholder) {
+    var length = array.length,
+      result = 0;
+
+    while (length--) {
+      if (array[length] === placeholder) {
+        ++result;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+   * letters to basic Latin letters.
+   *
+   * @private
+   * @param {string} letter The matched letter to deburr.
+   * @returns {string} Returns the deburred letter.
+   */
+  var deburrLetter = basePropertyOf(deburredLetters);
+
+  /**
+   * Used by `_.escape` to convert characters to HTML entities.
+   *
+   * @private
+   * @param {string} chr The matched character to escape.
+   * @returns {string} Returns the escaped character.
+   */
+  var escapeHtmlChar = basePropertyOf(htmlEscapes);
+
+  /**
+   * Used by `_.template` to escape characters for inclusion in compiled string literals.
+   *
+   * @private
+   * @param {string} chr The matched character to escape.
+   * @returns {string} Returns the escaped character.
+   */
+  function escapeStringChar(chr) {
+    return '\\' + stringEscapes[chr];
+  }
+
+  /**
+   * Gets the value at `key` of `object`.
+   *
+   * @private
+   * @param {Object} [object] The object to query.
+   * @param {string} key The key of the property to get.
+   * @returns {*} Returns the property value.
+   */
+  function getValue(object, key) {
+    return object == null ? undefined : object[key];
+  }
+
+  /**
+   * Checks if `string` contains Unicode symbols.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+   */
+  function hasUnicode(string) {
+    return reHasUnicode.test(string);
+  }
+
+  /**
+   * Checks if `string` contains a word composed of Unicode symbols.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {boolean} Returns `true` if a word is found, else `false`.
+   */
+  function hasUnicodeWord(string) {
+    return reHasUnicodeWord.test(string);
+  }
+
+  /**
+   * Converts `iterator` to an array.
+   *
+   * @private
+   * @param {Object} iterator The iterator to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function iteratorToArray(iterator) {
+    var data,
+      result = [];
+
+    while (!(data = iterator.next()).done) {
+      result.push(data.value);
+    }
+    return result;
+  }
+
+  /**
+   * Converts `map` to its key-value pairs.
+   *
+   * @private
+   * @param {Object} map The map to convert.
+   * @returns {Array} Returns the key-value pairs.
+   */
+  function mapToArray(map) {
+    var index = -1,
+      result = Array(map.size);
+
+    map.forEach(function(value, key) {
+      result[++index] = [key, value];
+    });
+    return result;
+  }
+
+  /**
+   * Creates a unary function that invokes `func` with its argument transformed.
+   *
+   * @private
+   * @param {Function} func The function to wrap.
+   * @param {Function} transform The argument transform.
+   * @returns {Function} Returns the new function.
+   */
+  function overArg(func, transform) {
+    return function(arg) {
+      return func(transform(arg));
+    };
+  }
+
+  /**
+   * Replaces all `placeholder` elements in `array` with an internal placeholder
+   * and returns an array of their indexes.
+   *
+   * @private
+   * @param {Array} array The array to modify.
+   * @param {*} placeholder The placeholder to replace.
+   * @returns {Array} Returns the new array of placeholder indexes.
+   */
+  function replaceHolders(array, placeholder) {
+    var index = -1,
+      length = array.length,
+      resIndex = 0,
+      result = [];
+
+    while (++index < length) {
+      var value = array[index];
+      if (value === placeholder || value === PLACEHOLDER) {
+        array[index] = PLACEHOLDER;
+        result[resIndex++] = index;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Converts `set` to an array of its values.
+   *
+   * @private
+   * @param {Object} set The set to convert.
+   * @returns {Array} Returns the values.
+   */
+  function setToArray(set) {
+    var index = -1,
+      result = Array(set.size);
+
+    set.forEach(function(value) {
+      result[++index] = value;
+    });
+    return result;
+  }
+
+  /**
+   * Converts `set` to its value-value pairs.
+   *
+   * @private
+   * @param {Object} set The set to convert.
+   * @returns {Array} Returns the value-value pairs.
+   */
+  function setToPairs(set) {
+    var index = -1,
+      result = Array(set.size);
+
+    set.forEach(function(value) {
+      result[++index] = [value, value];
+    });
+    return result;
+  }
+
+  /**
+   * A specialized version of `_.indexOf` which performs strict equality
+   * comparisons of values, i.e. `===`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function strictIndexOf(array, value, fromIndex) {
+    var index = fromIndex - 1,
+      length = array.length;
+
+    while (++index < length) {
+      if (array[index] === value) {
+        return index;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * A specialized version of `_.lastIndexOf` which performs strict equality
+   * comparisons of values, i.e. `===`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function strictLastIndexOf(array, value, fromIndex) {
+    var index = fromIndex + 1;
+    while (index--) {
+      if (array[index] === value) {
+        return index;
+      }
+    }
+    return index;
+  }
+
+  /**
+   * Gets the number of symbols in `string`.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {number} Returns the string size.
+   */
+  function stringSize(string) {
+    return hasUnicode(string) ?
+      unicodeSize(string) :
+      asciiSize(string);
+  }
+
+  /**
+   * Converts `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function stringToArray(string) {
+    return hasUnicode(string) ?
+      unicodeToArray(string) :
+      asciiToArray(string);
+  }
+
+  /**
+   * Used by `_.unescape` to convert HTML entities to characters.
+   *
+   * @private
+   * @param {string} chr The matched character to unescape.
+   * @returns {string} Returns the unescaped character.
+   */
+  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+
+  /**
+   * Gets the size of a Unicode `string`.
+   *
+   * @private
+   * @param {string} string The string inspect.
+   * @returns {number} Returns the string size.
+   */
+  function unicodeSize(string) {
+    var result = reUnicode.lastIndex = 0;
+    while (reUnicode.test(string)) {
+      ++result;
+    }
+    return result;
+  }
+
+  /**
+   * Converts a Unicode `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function unicodeToArray(string) {
+    return string.match(reUnicode) || [];
+  }
+
+  /**
+   * Splits a Unicode `string` into an array of its words.
+   *
+   * @private
+   * @param {string} The string to inspect.
+   * @returns {Array} Returns the words of `string`.
+   */
+  function unicodeWords(string) {
+    return string.match(reUnicodeWord) || [];
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Create a new pristine `lodash` function using the `context` object.
+   *
+   * @static
+   * @memberOf _
+   * @since 1.1.0
+   * @category Util
+   * @param {Object} [context=root] The context object.
+   * @returns {Function} Returns a new `lodash` function.
+   * @example
+   *
+   * _.mixin({ 'foo': _.constant('foo') });
+   *
+   * var lodash = _.runInContext();
+   * lodash.mixin({ 'bar': lodash.constant('bar') });
+   *
+   * _.isFunction(_.foo);
+   * // => true
+   * _.isFunction(_.bar);
+   * // => false
+   *
+   * lodash.isFunction(lodash.foo);
+   * // => false
+   * lodash.isFunction(lodash.bar);
+   * // => true
+   *
+   * // Create a suped-up `defer` in Node.js.
+   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+   */
+  var runInContext = (function runInContext(context) {
+    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
+
+    /** Built-in constructor references. */
+    var Array = context.Array,
+      Date = context.Date,
+      Error = context.Error,
+      Function = context.Function,
+      Math = context.Math,
+      Object = context.Object,
+      RegExp = context.RegExp,
+      String = context.String,
+      TypeError = context.TypeError;
+
+    /** Used for built-in method references. */
+    var arrayProto = Array.prototype,
+      funcProto = Function.prototype,
+      objectProto = Object.prototype;
+
+    /** Used to detect overreaching core-js shims. */
+    var coreJsData = context['__core-js_shared__'];
+
+    /** Used to resolve the decompiled source of functions. */
+    var funcToString = funcProto.toString;
+
+    /** Used to check objects for own properties. */
+    var hasOwnProperty = objectProto.hasOwnProperty;
+
+    /** Used to generate unique IDs. */
+    var idCounter = 0;
+
+    /** Used to detect methods masquerading as native. */
+    var maskSrcKey = (function() {
+      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+      return uid ? ('Symbol(src)_1.' + uid) : '';
+    }());
+
+    /**
+     * Used to resolve the
+     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+     * of values.
+     */
+    var nativeObjectToString = objectProto.toString;
+
+    /** Used to infer the `Object` constructor. */
+    var objectCtorString = funcToString.call(Object);
+
+    /** Used to restore the original `_` reference in `_.noConflict`. */
+    var oldDash = root._;
+
+    /** Used to detect if a method is native. */
+    var reIsNative = RegExp('^' +
+      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+    );
+
+    /** Built-in value references. */
+    var Buffer = moduleExports ? context.Buffer : undefined,
+      Symbol = context.Symbol,
+      Uint8Array = context.Uint8Array,
+      allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
+      getPrototype = overArg(Object.getPrototypeOf, Object),
+      objectCreate = Object.create,
+      propertyIsEnumerable = objectProto.propertyIsEnumerable,
+      splice = arrayProto.splice,
+      spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
+      symIterator = Symbol ? Symbol.iterator : undefined,
+      symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+    var defineProperty = (function() {
+      try {
+        var func = getNative(Object, 'defineProperty');
+        func({}, '', {});
+        return func;
+      } catch (e) {}
+    }());
+
+    /** Mocked built-ins. */
+    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
+      ctxNow = Date && Date.now !== root.Date.now && Date.now,
+      ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
+
+    /* Built-in method references for those with the same name as other `lodash` methods. */
+    var nativeCeil = Math.ceil,
+      nativeFloor = Math.floor,
+      nativeGetSymbols = Object.getOwnPropertySymbols,
+      nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
+      nativeIsFinite = context.isFinite,
+      nativeJoin = arrayProto.join,
+      nativeKeys = overArg(Object.keys, Object),
+      nativeMax = Math.max,
+      nativeMin = Math.min,
+      nativeNow = Date.now,
+      nativeParseInt = context.parseInt,
+      nativeRandom = Math.random,
+      nativeReverse = arrayProto.reverse;
+
+    /* Built-in method references that are verified to be native. */
+    var DataView = getNative(context, 'DataView'),
+      Map = getNative(context, 'Map'),
+      Promise = getNative(context, 'Promise'),
+      Set = getNative(context, 'Set'),
+      WeakMap = getNative(context, 'WeakMap'),
+      nativeCreate = getNative(Object, 'create');
+
+    /** Used to store function metadata. */
+    var metaMap = WeakMap && new WeakMap;
+
+    /** Used to lookup unminified function names. */
+    var realNames = {};
+
+    /** Used to detect maps, sets, and weakmaps. */
+    var dataViewCtorString = toSource(DataView),
+      mapCtorString = toSource(Map),
+      promiseCtorString = toSource(Promise),
+      setCtorString = toSource(Set),
+      weakMapCtorString = toSource(WeakMap);
+
+    /** Used to convert symbols to primitives and strings. */
+    var symbolProto = Symbol ? Symbol.prototype : undefined,
+      symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
+      symbolToString = symbolProto ? symbolProto.toString : undefined;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a `lodash` object which wraps `value` to enable implicit method
+     * chain sequences. Methods that operate on and return arrays, collections,
+     * and functions can be chained together. Methods that retrieve a single value
+     * or may return a primitive value will automatically end the chain sequence
+     * and return the unwrapped value. Otherwise, the value must be unwrapped
+     * with `_#value`.
+     *
+     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
+     * enabled using `_.chain`.
+     *
+     * The execution of chained methods is lazy, that is, it's deferred until
+     * `_#value` is implicitly or explicitly called.
+     *
+     * Lazy evaluation allows several methods to support shortcut fusion.
+     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
+     * the creation of intermediate arrays and can greatly reduce the number of
+     * iteratee executions. Sections of a chain sequence qualify for shortcut
+     * fusion if the section is applied to an array and iteratees accept only
+     * one argument. The heuristic for whether a section qualifies for shortcut
+     * fusion is subject to change.
+     *
+     * Chaining is supported in custom builds as long as the `_#value` method is
+     * directly or indirectly included in the build.
+     *
+     * In addition to lodash methods, wrappers have `Array` and `String` methods.
+     *
+     * The wrapper `Array` methods are:
+     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
+     *
+     * The wrapper `String` methods are:
+     * `replace` and `split`
+     *
+     * The wrapper methods that support shortcut fusion are:
+     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
+     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
+     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
+     *
+     * The chainable wrapper methods are:
+     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
+     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
+     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
+     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
+     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
+     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
+     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
+     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
+     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
+     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
+     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
+     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
+     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
+     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
+     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
+     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
+     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
+     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
+     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
+     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
+     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
+     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
+     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
+     * `zipObject`, `zipObjectDeep`, and `zipWith`
+     *
+     * The wrapper methods that are **not** chainable by default are:
+     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
+     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
+     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
+     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
+     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
+     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
+     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
+     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
+     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
+     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
+     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
+     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
+     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
+     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
+     * `upperFirst`, `value`, and `words`
+     *
+     * @name _
+     * @constructor
+     * @category Seq
+     * @param {*} value The value to wrap in a `lodash` instance.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var wrapped = _([1, 2, 3]);
+     *
+     * // Returns an unwrapped value.
+     * wrapped.reduce(_.add);
+     * // => 6
+     *
+     * // Returns a wrapped value.
+     * var squares = wrapped.map(square);
+     *
+     * _.isArray(squares);
+     * // => false
+     *
+     * _.isArray(squares.value());
+     * // => true
+     */
+    function lodash(value) {
+      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
+        if (value instanceof LodashWrapper) {
+          return value;
+        }
+        if (hasOwnProperty.call(value, '__wrapped__')) {
+          return wrapperClone(value);
+        }
+      }
+      return new LodashWrapper(value);
+    }
+
+    /**
+     * The base implementation of `_.create` without support for assigning
+     * properties to the created object.
+     *
+     * @private
+     * @param {Object} proto The object to inherit from.
+     * @returns {Object} Returns the new object.
+     */
+    var baseCreate = (function() {
+      function object() {}
+      return function(proto) {
+        if (!isObject(proto)) {
+          return {};
+        }
+        if (objectCreate) {
+          return objectCreate(proto);
+        }
+        object.prototype = proto;
+        var result = new object;
+        object.prototype = undefined;
+        return result;
+      };
+    }());
+
+    /**
+     * The function whose prototype chain sequence wrappers inherit from.
+     *
+     * @private
+     */
+    function baseLodash() {
+      // No operation performed.
+    }
+
+    /**
+     * The base constructor for creating `lodash` wrapper objects.
+     *
+     * @private
+     * @param {*} value The value to wrap.
+     * @param {boolean} [chainAll] Enable explicit method chain sequences.
+     */
+    function LodashWrapper(value, chainAll) {
+      this.__wrapped__ = value;
+      this.__actions__ = [];
+      this.__chain__ = !!chainAll;
+      this.__index__ = 0;
+      this.__values__ = undefined;
+    }
+
+    /**
+     * By default, the template delimiters used by lodash are like those in
+     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
+     * following template settings to use alternative delimiters.
+     *
+     * @static
+     * @memberOf _
+     * @type {Object}
+     */
+    lodash.templateSettings = {
+
+      /**
+       * Used to detect `data` property values to be HTML-escaped.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'escape': reEscape,
+
+      /**
+       * Used to detect code to be evaluated.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'evaluate': reEvaluate,
+
+      /**
+       * Used to detect `data` property values to inject.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'interpolate': reInterpolate,
+
+      /**
+       * Used to reference the data object in the template text.
+       *
+       * @memberOf _.templateSettings
+       * @type {string}
+       */
+      'variable': '',
+
+      /**
+       * Used to import variables into the compiled template.
+       *
+       * @memberOf _.templateSettings
+       * @type {Object}
+       */
+      'imports': {
+
+        /**
+         * A reference to the `lodash` function.
+         *
+         * @memberOf _.templateSettings.imports
+         * @type {Function}
+         */
+        '_': lodash
+      }
+    };
+
+    // Ensure wrappers are instances of `baseLodash`.
+    lodash.prototype = baseLodash.prototype;
+    lodash.prototype.constructor = lodash;
+
+    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+    LodashWrapper.prototype.constructor = LodashWrapper;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+     *
+     * @private
+     * @constructor
+     * @param {*} value The value to wrap.
+     */
+    function LazyWrapper(value) {
+      this.__wrapped__ = value;
+      this.__actions__ = [];
+      this.__dir__ = 1;
+      this.__filtered__ = false;
+      this.__iteratees__ = [];
+      this.__takeCount__ = MAX_ARRAY_LENGTH;
+      this.__views__ = [];
+    }
+
+    /**
+     * Creates a clone of the lazy wrapper object.
+     *
+     * @private
+     * @name clone
+     * @memberOf LazyWrapper
+     * @returns {Object} Returns the cloned `LazyWrapper` object.
+     */
+    function lazyClone() {
+      var result = new LazyWrapper(this.__wrapped__);
+      result.__actions__ = copyArray(this.__actions__);
+      result.__dir__ = this.__dir__;
+      result.__filtered__ = this.__filtered__;
+      result.__iteratees__ = copyArray(this.__iteratees__);
+      result.__takeCount__ = this.__takeCount__;
+      result.__views__ = copyArray(this.__views__);
+      return result;
+    }
+
+    /**
+     * Reverses the direction of lazy iteration.
+     *
+     * @private
+     * @name reverse
+     * @memberOf LazyWrapper
+     * @returns {Object} Returns the new reversed `LazyWrapper` object.
+     */
+    function lazyReverse() {
+      if (this.__filtered__) {
+        var result = new LazyWrapper(this);
+        result.__dir__ = -1;
+        result.__filtered__ = true;
+      } else {
+        result = this.clone();
+        result.__dir__ *= -1;
+      }
+      return result;
+    }
+
+    /**
+     * Extracts the unwrapped value from its lazy wrapper.
+     *
+     * @private
+     * @name value
+     * @memberOf LazyWrapper
+     * @returns {*} Returns the unwrapped value.
+     */
+    function lazyValue() {
+      var array = this.__wrapped__.value(),
+        dir = this.__dir__,
+        isArr = isArray(array),
+        isRight = dir < 0,
+        arrLength = isArr ? array.length : 0,
+        view = getView(0, arrLength, this.__views__),
+        start = view.start,
+        end = view.end,
+        length = end - start,
+        index = isRight ? end : (start - 1),
+        iteratees = this.__iteratees__,
+        iterLength = iteratees.length,
+        resIndex = 0,
+        takeCount = nativeMin(length, this.__takeCount__);
+
+      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
+        return baseWrapperValue(array, this.__actions__);
+      }
+      var result = [];
+
+      outer:
+        while (length-- && resIndex < takeCount) {
+          index += dir;
+
+          var iterIndex = -1,
+            value = array[index];
+
+          while (++iterIndex < iterLength) {
+            var data = iteratees[iterIndex],
+              iteratee = data.iteratee,
+              type = data.type,
+              computed = iteratee(value);
+
+            if (type == LAZY_MAP_FLAG) {
+              value = computed;
+            } else if (!computed) {
+              if (type == LAZY_FILTER_FLAG) {
+                continue outer;
+              } else {
+                break outer;
+              }
+            }
+          }
+          result[resIndex++] = value;
+        }
+      return result;
+    }
+
+    // Ensure `LazyWrapper` is an instance of `baseLodash`.
+    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+    LazyWrapper.prototype.constructor = LazyWrapper;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a hash object.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function Hash(entries) {
+      var index = -1,
+        length = entries == null ? 0 : entries.length;
+
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+
+    /**
+     * Removes all key-value entries from the hash.
+     *
+     * @private
+     * @name clear
+     * @memberOf Hash
+     */
+    function hashClear() {
+      this.__data__ = nativeCreate ? nativeCreate(null) : {};
+      this.size = 0;
+    }
+
+    /**
+     * Removes `key` and its value from the hash.
+     *
+     * @private
+     * @name delete
+     * @memberOf Hash
+     * @param {Object} hash The hash to modify.
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function hashDelete(key) {
+      var result = this.has(key) && delete this.__data__[key];
+      this.size -= result ? 1 : 0;
+      return result;
+    }
+
+    /**
+     * Gets the hash value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf Hash
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function hashGet(key) {
+      var data = this.__data__;
+      if (nativeCreate) {
+        var result = data[key];
+        return result === HASH_UNDEFINED ? undefined : result;
+      }
+      return hasOwnProperty.call(data, key) ? data[key] : undefined;
+    }
+
+    /**
+     * Checks if a hash value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf Hash
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function hashHas(key) {
+      var data = this.__data__;
+      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
+    }
+
+    /**
+     * Sets the hash `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf Hash
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the hash instance.
+     */
+    function hashSet(key, value) {
+      var data = this.__data__;
+      this.size += this.has(key) ? 0 : 1;
+      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+      return this;
+    }
+
+    // Add methods to `Hash`.
+    Hash.prototype.clear = hashClear;
+    Hash.prototype['delete'] = hashDelete;
+    Hash.prototype.get = hashGet;
+    Hash.prototype.has = hashHas;
+    Hash.prototype.set = hashSet;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates an list cache object.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function ListCache(entries) {
+      var index = -1,
+        length = entries == null ? 0 : entries.length;
+
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+
+    /**
+     * Removes all key-value entries from the list cache.
+     *
+     * @private
+     * @name clear
+     * @memberOf ListCache
+     */
+    function listCacheClear() {
+      this.__data__ = [];
+      this.size = 0;
+    }
+
+    /**
+     * Removes `key` and its value from the list cache.
+     *
+     * @private
+     * @name delete
+     * @memberOf ListCache
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function listCacheDelete(key) {
+      var data = this.__data__,
+        index = assocIndexOf(data, key);
+
+      if (index < 0) {
+        return false;
+      }
+      var lastIndex = data.length - 1;
+      if (index == lastIndex) {
+        data.pop();
+      } else {
+        splice.call(data, index, 1);
+      }
+      --this.size;
+      return true;
+    }
+
+    /**
+     * Gets the list cache value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf ListCache
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function listCacheGet(key) {
+      var data = this.__data__,
+        index = assocIndexOf(data, key);
+
+      return index < 0 ? undefined : data[index][1];
+    }
+
+    /**
+     * Checks if a list cache value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf ListCache
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function listCacheHas(key) {
+      return assocIndexOf(this.__data__, key) > -1;
+    }
+
+    /**
+     * Sets the list cache `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf ListCache
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the list cache instance.
+     */
+    function listCacheSet(key, value) {
+      var data = this.__data__,
+        index = assocIndexOf(data, key);
+
+      if (index < 0) {
+        ++this.size;
+        data.push([key, value]);
+      } else {
+        data[index][1] = value;
+      }
+      return this;
+    }
+
+    // Add methods to `ListCache`.
+    ListCache.prototype.clear = listCacheClear;
+    ListCache.prototype['delete'] = listCacheDelete;
+    ListCache.prototype.get = listCacheGet;
+    ListCache.prototype.has = listCacheHas;
+    ListCache.prototype.set = listCacheSet;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a map cache object to store key-value pairs.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function MapCache(entries) {
+      var index = -1,
+        length = entries == null ? 0 : entries.length;
+
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+
+    /**
+     * Removes all key-value entries from the map.
+     *
+     * @private
+     * @name clear
+     * @memberOf MapCache
+     */
+    function mapCacheClear() {
+      this.size = 0;
+      this.__data__ = {
+        'hash': new Hash,
+        'map': new(Map || ListCache),
+        'string': new Hash
+      };
+    }
+
+    /**
+     * Removes `key` and its value from the map.
+     *
+     * @private
+     * @name delete
+     * @memberOf MapCache
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function mapCacheDelete(key) {
+      var result = getMapData(this, key)['delete'](key);
+      this.size -= result ? 1 : 0;
+      return result;
+    }
+
+    /**
+     * Gets the map value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf MapCache
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function mapCacheGet(key) {
+      return getMapData(this, key).get(key);
+    }
+
+    /**
+     * Checks if a map value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf MapCache
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function mapCacheHas(key) {
+      return getMapData(this, key).has(key);
+    }
+
+    /**
+     * Sets the map `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf MapCache
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the map cache instance.
+     */
+    function mapCacheSet(key, value) {
+      var data = getMapData(this, key),
+        size = data.size;
+
+      data.set(key, value);
+      this.size += data.size == size ? 0 : 1;
+      return this;
+    }
+
+    // Add methods to `MapCache`.
+    MapCache.prototype.clear = mapCacheClear;
+    MapCache.prototype['delete'] = mapCacheDelete;
+    MapCache.prototype.get = mapCacheGet;
+    MapCache.prototype.has = mapCacheHas;
+    MapCache.prototype.set = mapCacheSet;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     *
+     * Creates an array cache object to store unique values.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [values] The values to cache.
+     */
+    function SetCache(values) {
+      var index = -1,
+        length = values == null ? 0 : values.length;
+
+      this.__data__ = new MapCache;
+      while (++index < length) {
+        this.add(values[index]);
+      }
+    }
+
+    /**
+     * Adds `value` to the array cache.
+     *
+     * @private
+     * @name add
+     * @memberOf SetCache
+     * @alias push
+     * @param {*} value The value to cache.
+     * @returns {Object} Returns the cache instance.
+     */
+    function setCacheAdd(value) {
+      this.__data__.set(value, HASH_UNDEFINED);
+      return this;
+    }
+
+    /**
+     * Checks if `value` is in the array cache.
+     *
+     * @private
+     * @name has
+     * @memberOf SetCache
+     * @param {*} value The value to search for.
+     * @returns {number} Returns `true` if `value` is found, else `false`.
+     */
+    function setCacheHas(value) {
+      return this.__data__.has(value);
+    }
+
+    // Add methods to `SetCache`.
+    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+    SetCache.prototype.has = setCacheHas;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a stack cache object to store key-value pairs.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function Stack(entries) {
+      var data = this.__data__ = new ListCache(entries);
+      this.size = data.size;
+    }
+
+    /**
+     * Removes all key-value entries from the stack.
+     *
+     * @private
+     * @name clear
+     * @memberOf Stack
+     */
+    function stackClear() {
+      this.__data__ = new ListCache;
+      this.size = 0;
+    }
+
+    /**
+     * Removes `key` and its value from the stack.
+     *
+     * @private
+     * @name delete
+     * @memberOf Stack
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function stackDelete(key) {
+      var data = this.__data__,
+        result = data['delete'](key);
+
+      this.size = data.size;
+      return result;
+    }
+
+    /**
+     * Gets the stack value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf Stack
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function stackGet(key) {
+      return this.__data__.get(key);
+    }
+
+    /**
+     * Checks if a stack value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf Stack
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function stackHas(key) {
+      return this.__data__.has(key);
+    }
+
+    /**
+     * Sets the stack `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf Stack
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the stack cache instance.
+     */
+    function stackSet(key, value) {
+      var data = this.__data__;
+      if (data instanceof ListCache) {
+        var pairs = data.__data__;
+        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+          pairs.push([key, value]);
+          this.size = ++data.size;
+          return this;
+        }
+        data = this.__data__ = new MapCache(pairs);
+      }
+      data.set(key, value);
+      this.size = data.size;
+      return this;
+    }
+
+    // Add methods to `Stack`.
+    Stack.prototype.clear = stackClear;
+    Stack.prototype['delete'] = stackDelete;
+    Stack.prototype.get = stackGet;
+    Stack.prototype.has = stackHas;
+    Stack.prototype.set = stackSet;
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates an array of the enumerable property names of the array-like `value`.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @param {boolean} inherited Specify returning inherited property names.
+     * @returns {Array} Returns the array of property names.
+     */
+    function arrayLikeKeys(value, inherited) {
+      var isArr = isArray(value),
+        isArg = !isArr && isArguments(value),
+        isBuff = !isArr && !isArg && isBuffer(value),
+        isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+        skipIndexes = isArr || isArg || isBuff || isType,
+        result = skipIndexes ? baseTimes(value.length, String) : [],
+        length = result.length;
+
+      for (var key in value) {
+        if ((inherited || hasOwnProperty.call(value, key)) &&
+          !(skipIndexes && (
+            // Safari 9 has enumerable `arguments.length` in strict mode.
+            key == 'length' ||
+            // Node.js 0.10 has enumerable non-index properties on buffers.
+            (isBuff && (key == 'offset' || key == 'parent')) ||
+            // PhantomJS 2 has enumerable non-index properties on typed arrays.
+            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
+            // Skip index properties.
+            isIndex(key, length)
+          ))) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * A specialized version of `_.sample` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to sample.
+     * @returns {*} Returns the random element.
+     */
+    function arraySample(array) {
+      var length = array.length;
+      return length ? array[baseRandom(0, length - 1)] : undefined;
+    }
+
+    /**
+     * A specialized version of `_.sampleSize` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to sample.
+     * @param {number} n The number of elements to sample.
+     * @returns {Array} Returns the random elements.
+     */
+    function arraySampleSize(array, n) {
+      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
+    }
+
+    /**
+     * A specialized version of `_.shuffle` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     */
+    function arrayShuffle(array) {
+      return shuffleSelf(copyArray(array));
+    }
+
+    /**
+     * This function is like `assignValue` except that it doesn't assign
+     * `undefined` values.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function assignMergeValue(object, key, value) {
+      if ((value !== undefined && !eq(object[key], value)) ||
+        (value === undefined && !(key in object))) {
+        baseAssignValue(object, key, value);
+      }
+    }
+
+    /**
+     * Assigns `value` to `key` of `object` if the existing value is not equivalent
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function assignValue(object, key, value) {
+      var objValue = object[key];
+      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+        (value === undefined && !(key in object))) {
+        baseAssignValue(object, key, value);
+      }
+    }
+
+    /**
+     * Gets the index at which the `key` is found in `array` of key-value pairs.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {*} key The key to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     */
+    function assocIndexOf(array, key) {
+      var length = array.length;
+      while (length--) {
+        if (eq(array[length][0], key)) {
+          return length;
+        }
+      }
+      return -1;
+    }
+
+    /**
+     * Aggregates elements of `collection` on `accumulator` with keys transformed
+     * by `iteratee` and values set by `setter`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} setter The function to set `accumulator` values.
+     * @param {Function} iteratee The iteratee to transform keys.
+     * @param {Object} accumulator The initial aggregated object.
+     * @returns {Function} Returns `accumulator`.
+     */
+    function baseAggregator(collection, setter, iteratee, accumulator) {
+      baseEach(collection, function(value, key, collection) {
+        setter(accumulator, value, iteratee(value), collection);
+      });
+      return accumulator;
+    }
+
+    /**
+     * The base implementation of `_.assign` without support for multiple sources
+     * or `customizer` functions.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @returns {Object} Returns `object`.
+     */
+    function baseAssign(object, source) {
+      return object && copyObject(source, keys(source), object);
+    }
+
+    /**
+     * The base implementation of `_.assignIn` without support for multiple sources
+     * or `customizer` functions.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @returns {Object} Returns `object`.
+     */
+    function baseAssignIn(object, source) {
+      return object && copyObject(source, keysIn(source), object);
+    }
+
+    /**
+     * The base implementation of `assignValue` and `assignMergeValue` without
+     * value checks.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function baseAssignValue(object, key, value) {
+      if (key == '__proto__' && defineProperty) {
+        defineProperty(object, key, {
+          'configurable': true,
+          'enumerable': true,
+          'value': value,
+          'writable': true
+        });
+      } else {
+        object[key] = value;
+      }
+    }
+
+    /**
+     * The base implementation of `_.at` without support for individual paths.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {string[]} paths The property paths to pick.
+     * @returns {Array} Returns the picked elements.
+     */
+    function baseAt(object, paths) {
+      var index = -1,
+        length = paths.length,
+        result = Array(length),
+        skip = object == null;
+
+      while (++index < length) {
+        result[index] = skip ? undefined : get(object, paths[index]);
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.clamp` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {number} number The number to clamp.
+     * @param {number} [lower] The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the clamped number.
+     */
+    function baseClamp(number, lower, upper) {
+      if (number === number) {
+        if (upper !== undefined) {
+          number = number <= upper ? number : upper;
+        }
+        if (lower !== undefined) {
+          number = number >= lower ? number : lower;
+        }
+      }
+      return number;
+    }
+
+    /**
+     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+     * traversed objects.
+     *
+     * @private
+     * @param {*} value The value to clone.
+     * @param {boolean} bitmask The bitmask flags.
+     *  1 - Deep clone
+     *  2 - Flatten inherited properties
+     *  4 - Clone symbols
+     * @param {Function} [customizer] The function to customize cloning.
+     * @param {string} [key] The key of `value`.
+     * @param {Object} [object] The parent object of `value`.
+     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+     * @returns {*} Returns the cloned value.
+     */
+    function baseClone(value, bitmask, customizer, key, object, stack) {
+      var result,
+        isDeep = bitmask & CLONE_DEEP_FLAG,
+        isFlat = bitmask & CLONE_FLAT_FLAG,
+        isFull = bitmask & CLONE_SYMBOLS_FLAG;
+
+      if (customizer) {
+        result = object ? customizer(value, key, object, stack) : customizer(value);
+      }
+      if (result !== undefined) {
+        return result;
+      }
+      if (!isObject(value)) {
+        return value;
+      }
+      var isArr = isArray(value);
+      if (isArr) {
+        result = initCloneArray(value);
+        if (!isDeep) {
+          return copyArray(value, result);
+        }
+      } else {
+        var tag = getTag(value),
+          isFunc = tag == funcTag || tag == genTag;
+
+        if (isBuffer(value)) {
+          return cloneBuffer(value, isDeep);
+        }
+        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+          result = (isFlat || isFunc) ? {} : initCloneObject(value);
+          if (!isDeep) {
+            return isFlat ?
+              copySymbolsIn(value, baseAssignIn(result, value)) :
+              copySymbols(value, baseAssign(result, value));
+          }
+        } else {
+          if (!cloneableTags[tag]) {
+            return object ? value : {};
+          }
+          result = initCloneByTag(value, tag, isDeep);
+        }
+      }
+      // Check for circular references and return its corresponding clone.
+      stack || (stack = new Stack);
+      var stacked = stack.get(value);
+      if (stacked) {
+        return stacked;
+      }
+      stack.set(value, result);
+
+      if (isSet(value)) {
+        value.forEach(function(subValue) {
+          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
+        });
+      } else if (isMap(value)) {
+        value.forEach(function(subValue, key) {
+          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
+        });
+      }
+
+      var keysFunc = isFull ?
+        (isFlat ? getAllKeysIn : getAllKeys) :
+        (isFlat ? keysIn : keys);
+
+      var props = isArr ? undefined : keysFunc(value);
+      arrayEach(props || value, function(subValue, key) {
+        if (props) {
+          key = subValue;
+          subValue = value[key];
+        }
+        // Recursively populate clone (susceptible to call stack limits).
+        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+      });
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.conforms` which doesn't clone `source`.
+     *
+     * @private
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseConforms(source) {
+      var props = keys(source);
+      return function(object) {
+        return baseConformsTo(object, source, props);
+      };
+    }
+
+    /**
+     * The base implementation of `_.conformsTo` which accepts `props` to check.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+     */
+    function baseConformsTo(object, source, props) {
+      var length = props.length;
+      if (object == null) {
+        return !length;
+      }
+      object = Object(object);
+      while (length--) {
+        var key = props[length],
+          predicate = source[key],
+          value = object[key];
+
+        if ((value === undefined && !(key in object)) || !predicate(value)) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    /**
+     * The base implementation of `_.delay` and `_.defer` which accepts `args`
+     * to provide to `func`.
+     *
+     * @private
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @param {Array} args The arguments to provide to `func`.
+     * @returns {number|Object} Returns the timer id or timeout object.
+     */
+    function baseDelay(func, wait, args) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      return setTimeout(function() {
+        func.apply(undefined, args);
+      }, wait);
+    }
+
+    /**
+     * The base implementation of methods like `_.difference` without support
+     * for excluding multiple arrays or iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Array} values The values to exclude.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     */
+    function baseDifference(array, values, iteratee, comparator) {
+      var index = -1,
+        includes = arrayIncludes,
+        isCommon = true,
+        length = array.length,
+        result = [],
+        valuesLength = values.length;
+
+      if (!length) {
+        return result;
+      }
+      if (iteratee) {
+        values = arrayMap(values, baseUnary(iteratee));
+      }
+      if (comparator) {
+        includes = arrayIncludesWith;
+        isCommon = false;
+      } else if (values.length >= LARGE_ARRAY_SIZE) {
+        includes = cacheHas;
+        isCommon = false;
+        values = new SetCache(values);
+      }
+      outer:
+        while (++index < length) {
+          var value = array[index],
+            computed = iteratee == null ? value : iteratee(value);
+
+          value = (comparator || value !== 0) ? value : 0;
+          if (isCommon && computed === computed) {
+            var valuesIndex = valuesLength;
+            while (valuesIndex--) {
+              if (values[valuesIndex] === computed) {
+                continue outer;
+              }
+            }
+            result.push(value);
+          } else if (!includes(values, computed, comparator)) {
+            result.push(value);
+          }
+        }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.forEach` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     */
+    var baseEach = createBaseEach(baseForOwn);
+
+    /**
+     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     */
+    var baseEachRight = createBaseEach(baseForOwnRight, true);
+
+    /**
+     * The base implementation of `_.every` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {boolean} Returns `true` if all elements pass the predicate check,
+     *  else `false`
+     */
+    function baseEvery(collection, predicate) {
+      var result = true;
+      baseEach(collection, function(value, index, collection) {
+        result = !!predicate(value, index, collection);
+        return result;
+      });
+      return result;
+    }
+
+    /**
+     * The base implementation of methods like `_.max` and `_.min` which accepts a
+     * `comparator` to determine the extremum value.
+     *
+     * @private
+     * @param {Array} array The array to iterate over.
+     * @param {Function} iteratee The iteratee invoked per iteration.
+     * @param {Function} comparator The comparator used to compare values.
+     * @returns {*} Returns the extremum value.
+     */
+    function baseExtremum(array, iteratee, comparator) {
+      var index = -1,
+        length = array.length;
+
+      while (++index < length) {
+        var value = array[index],
+          current = iteratee(value);
+
+        if (current != null && (computed === undefined ?
+            (current === current && !isSymbol(current)) :
+            comparator(current, computed)
+          )) {
+          var computed = current,
+            result = value;
+        }
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.fill` without an iteratee call guard.
+     *
+     * @private
+     * @param {Array} array The array to fill.
+     * @param {*} value The value to fill `array` with.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns `array`.
+     */
+    function baseFill(array, value, start, end) {
+      var length = array.length;
+
+      start = toInteger(start);
+      if (start < 0) {
+        start = -start > length ? 0 : (length + start);
+      }
+      end = (end === undefined || end > length) ? length : toInteger(end);
+      if (end < 0) {
+        end += length;
+      }
+      end = start > end ? 0 : toLength(end);
+      while (start < end) {
+        array[start++] = value;
+      }
+      return array;
+    }
+
+    /**
+     * The base implementation of `_.filter` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     */
+    function baseFilter(collection, predicate) {
+      var result = [];
+      baseEach(collection, function(value, index, collection) {
+        if (predicate(value, index, collection)) {
+          result.push(value);
+        }
+      });
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.flatten` with support for restricting flattening.
+     *
+     * @private
+     * @param {Array} array The array to flatten.
+     * @param {number} depth The maximum recursion depth.
+     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+     * @param {Array} [result=[]] The initial result value.
+     * @returns {Array} Returns the new flattened array.
+     */
+    function baseFlatten(array, depth, predicate, isStrict, result) {
+      var index = -1,
+        length = array.length;
+
+      predicate || (predicate = isFlattenable);
+      result || (result = []);
+
+      while (++index < length) {
+        var value = array[index];
+        if (depth > 0 && predicate(value)) {
+          if (depth > 1) {
+            // Recursively flatten arrays (susceptible to call stack limits).
+            baseFlatten(value, depth - 1, predicate, isStrict, result);
+          } else {
+            arrayPush(result, value);
+          }
+        } else if (!isStrict) {
+          result[result.length] = value;
+        }
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `baseForOwn` which iterates over `object`
+     * properties returned by `keysFunc` and invokes `iteratee` for each property.
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @returns {Object} Returns `object`.
+     */
+    var baseFor = createBaseFor();
+
+    /**
+     * This function is like `baseFor` except that it iterates over properties
+     * in the opposite order.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @returns {Object} Returns `object`.
+     */
+    var baseForRight = createBaseFor(true);
+
+    /**
+     * The base implementation of `_.forOwn` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     */
+    function baseForOwn(object, iteratee) {
+      return object && baseFor(object, iteratee, keys);
+    }
+
+    /**
+     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     */
+    function baseForOwnRight(object, iteratee) {
+      return object && baseForRight(object, iteratee, keys);
+    }
+
+    /**
+     * The base implementation of `_.functions` which creates an array of
+     * `object` function property names filtered from `props`.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Array} props The property names to filter.
+     * @returns {Array} Returns the function names.
+     */
+    function baseFunctions(object, props) {
+      return arrayFilter(props, function(key) {
+        return isFunction(object[key]);
+      });
+    }
+
+    /**
+     * The base implementation of `_.get` without support for default values.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to get.
+     * @returns {*} Returns the resolved value.
+     */
+    function baseGet(object, path) {
+      path = castPath(path, object);
+
+      var index = 0,
+        length = path.length;
+
+      while (object != null && index < length) {
+        object = object[toKey(path[index++])];
+      }
+      return (index && index == length) ? object : undefined;
+    }
+
+    /**
+     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+     * symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @param {Function} symbolsFunc The function to get the symbols of `object`.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+      var result = keysFunc(object);
+      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+    }
+
+    /**
+     * The base implementation of `getTag` without fallbacks for buggy environments.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the `toStringTag`.
+     */
+    function baseGetTag(value) {
+      if (value == null) {
+        return value === undefined ? undefinedTag : nullTag;
+      }
+      return (symToStringTag && symToStringTag in Object(value)) ?
+        getRawTag(value) :
+        objectToString(value);
+    }
+
+    /**
+     * The base implementation of `_.gt` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than `other`,
+     *  else `false`.
+     */
+    function baseGt(value, other) {
+      return value > other;
+    }
+
+    /**
+     * The base implementation of `_.has` without support for deep paths.
+     *
+     * @private
+     * @param {Object} [object] The object to query.
+     * @param {Array|string} key The key to check.
+     * @returns {boolean} Returns `true` if `key` exists, else `false`.
+     */
+    function baseHas(object, key) {
+      return object != null && hasOwnProperty.call(object, key);
+    }
+
+    /**
+     * The base implementation of `_.hasIn` without support for deep paths.
+     *
+     * @private
+     * @param {Object} [object] The object to query.
+     * @param {Array|string} key The key to check.
+     * @returns {boolean} Returns `true` if `key` exists, else `false`.
+     */
+    function baseHasIn(object, key) {
+      return object != null && key in Object(object);
+    }
+
+    /**
+     * The base implementation of `_.inRange` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {number} number The number to check.
+     * @param {number} start The start of the range.
+     * @param {number} end The end of the range.
+     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+     */
+    function baseInRange(number, start, end) {
+      return number >= nativeMin(start, end) && number < nativeMax(start, end);
+    }
+
+    /**
+     * The base implementation of methods like `_.intersection`, without support
+     * for iteratee shorthands, that accepts an array of arrays to inspect.
+     *
+     * @private
+     * @param {Array} arrays The arrays to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of shared values.
+     */
+    function baseIntersection(arrays, iteratee, comparator) {
+      var includes = comparator ? arrayIncludesWith : arrayIncludes,
+        length = arrays[0].length,
+        othLength = arrays.length,
+        othIndex = othLength,
+        caches = Array(othLength),
+        maxLength = Infinity,
+        result = [];
+
+      while (othIndex--) {
+        var array = arrays[othIndex];
+        if (othIndex && iteratee) {
+          array = arrayMap(array, baseUnary(iteratee));
+        }
+        maxLength = nativeMin(array.length, maxLength);
+        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) ?
+          new SetCache(othIndex && array) :
+          undefined;
+      }
+      array = arrays[0];
+
+      var index = -1,
+        seen = caches[0];
+
+      outer:
+        while (++index < length && result.length < maxLength) {
+          var value = array[index],
+            computed = iteratee ? iteratee(value) : value;
+
+          value = (comparator || value !== 0) ? value : 0;
+          if (!(seen ?
+              cacheHas(seen, computed) :
+              includes(result, computed, comparator)
+            )) {
+            othIndex = othLength;
+            while (--othIndex) {
+              var cache = caches[othIndex];
+              if (!(cache ?
+                  cacheHas(cache, computed) :
+                  includes(arrays[othIndex], computed, comparator))) {
+                continue outer;
+              }
+            }
+            if (seen) {
+              seen.push(computed);
+            }
+            result.push(value);
+          }
+        }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.invert` and `_.invertBy` which inverts
+     * `object` with values transformed by `iteratee` and set by `setter`.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} setter The function to set `accumulator` values.
+     * @param {Function} iteratee The iteratee to transform values.
+     * @param {Object} accumulator The initial inverted object.
+     * @returns {Function} Returns `accumulator`.
+     */
+    function baseInverter(object, setter, iteratee, accumulator) {
+      baseForOwn(object, function(value, key, object) {
+        setter(accumulator, iteratee(value), key, object);
+      });
+      return accumulator;
+    }
+
+    /**
+     * The base implementation of `_.invoke` without support for individual
+     * method arguments.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {Array} args The arguments to invoke the method with.
+     * @returns {*} Returns the result of the invoked method.
+     */
+    function baseInvoke(object, path, args) {
+      path = castPath(path, object);
+      object = parent(object, path);
+      var func = object == null ? object : object[toKey(last(path))];
+      return func == null ? undefined : apply(func, object, args);
+    }
+
+    /**
+     * The base implementation of `_.isArguments`.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+     */
+    function baseIsArguments(value) {
+      return isObjectLike(value) && baseGetTag(value) == argsTag;
+    }
+
+    /**
+     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+     */
+    function baseIsArrayBuffer(value) {
+      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
+    }
+
+    /**
+     * The base implementation of `_.isDate` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+     */
+    function baseIsDate(value) {
+      return isObjectLike(value) && baseGetTag(value) == dateTag;
+    }
+
+    /**
+     * The base implementation of `_.isEqual` which supports partial comparisons
+     * and tracks traversed objects.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @param {boolean} bitmask The bitmask flags.
+     *  1 - Unordered comparison
+     *  2 - Partial comparison
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     */
+    function baseIsEqual(value, other, bitmask, customizer, stack) {
+      if (value === other) {
+        return true;
+      }
+      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
+        return value !== value && other !== other;
+      }
+      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+    }
+
+    /**
+     * A specialized version of `baseIsEqual` for arrays and objects which performs
+     * deep comparisons and tracks traversed objects enabling objects with circular
+     * references to be compared.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+      var objIsArr = isArray(object),
+        othIsArr = isArray(other),
+        objTag = objIsArr ? arrayTag : getTag(object),
+        othTag = othIsArr ? arrayTag : getTag(other);
+
+      objTag = objTag == argsTag ? objectTag : objTag;
+      othTag = othTag == argsTag ? objectTag : othTag;
+
+      var objIsObj = objTag == objectTag,
+        othIsObj = othTag == objectTag,
+        isSameTag = objTag == othTag;
+
+      if (isSameTag && isBuffer(object)) {
+        if (!isBuffer(other)) {
+          return false;
+        }
+        objIsArr = true;
+        objIsObj = false;
+      }
+      if (isSameTag && !objIsObj) {
+        stack || (stack = new Stack);
+        return (objIsArr || isTypedArray(object)) ?
+          equalArrays(object, other, bitmask, customizer, equalFunc, stack) :
+          equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+      }
+      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+        if (objIsWrapped || othIsWrapped) {
+          var objUnwrapped = objIsWrapped ? object.value() : object,
+            othUnwrapped = othIsWrapped ? other.value() : other;
+
+          stack || (stack = new Stack);
+          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+        }
+      }
+      if (!isSameTag) {
+        return false;
+      }
+      stack || (stack = new Stack);
+      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+    }
+
+    /**
+     * The base implementation of `_.isMap` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+     */
+    function baseIsMap(value) {
+      return isObjectLike(value) && getTag(value) == mapTag;
+    }
+
+    /**
+     * The base implementation of `_.isMatch` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @param {Array} matchData The property names, values, and compare flags to match.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     */
+    function baseIsMatch(object, source, matchData, customizer) {
+      var index = matchData.length,
+        length = index,
+        noCustomizer = !customizer;
+
+      if (object == null) {
+        return !length;
+      }
+      object = Object(object);
+      while (index--) {
+        var data = matchData[index];
+        if ((noCustomizer && data[2]) ?
+          data[1] !== object[data[0]] :
+          !(data[0] in object)
+        ) {
+          return false;
+        }
+      }
+      while (++index < length) {
+        data = matchData[index];
+        var key = data[0],
+          objValue = object[key],
+          srcValue = data[1];
+
+        if (noCustomizer && data[2]) {
+          if (objValue === undefined && !(key in object)) {
+            return false;
+          }
+        } else {
+          var stack = new Stack;
+          if (customizer) {
+            var result = customizer(objValue, srcValue, key, object, source, stack);
+          }
+          if (!(result === undefined ?
+              baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) :
+              result
+            )) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+
+    /**
+     * The base implementation of `_.isNative` without bad shim checks.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a native function,
+     *  else `false`.
+     */
+    function baseIsNative(value) {
+      if (!isObject(value) || isMasked(value)) {
+        return false;
+      }
+      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+      return pattern.test(toSource(value));
+    }
+
+    /**
+     * The base implementation of `_.isRegExp` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+     */
+    function baseIsRegExp(value) {
+      return isObjectLike(value) && baseGetTag(value) == regexpTag;
+    }
+
+    /**
+     * The base implementation of `_.isSet` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+     */
+    function baseIsSet(value) {
+      return isObjectLike(value) && getTag(value) == setTag;
+    }
+
+    /**
+     * The base implementation of `_.isTypedArray` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+     */
+    function baseIsTypedArray(value) {
+      return isObjectLike(value) &&
+        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+    }
+
+    /**
+     * The base implementation of `_.iteratee`.
+     *
+     * @private
+     * @param {*} [value=_.identity] The value to convert to an iteratee.
+     * @returns {Function} Returns the iteratee.
+     */
+    function baseIteratee(value) {
+      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
+      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
+      if (typeof value == 'function') {
+        return value;
+      }
+      if (value == null) {
+        return identity;
+      }
+      if (typeof value == 'object') {
+        return isArray(value) ?
+          baseMatchesProperty(value[0], value[1]) :
+          baseMatches(value);
+      }
+      return property(value);
+    }
+
+    /**
+     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function baseKeys(object) {
+      if (!isPrototype(object)) {
+        return nativeKeys(object);
+      }
+      var result = [];
+      for (var key in Object(object)) {
+        if (hasOwnProperty.call(object, key) && key != 'constructor') {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function baseKeysIn(object) {
+      if (!isObject(object)) {
+        return nativeKeysIn(object);
+      }
+      var isProto = isPrototype(object),
+        result = [];
+
+      for (var key in object) {
+        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.lt` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than `other`,
+     *  else `false`.
+     */
+    function baseLt(value, other) {
+      return value < other;
+    }
+
+    /**
+     * The base implementation of `_.map` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array} Returns the new mapped array.
+     */
+    function baseMap(collection, iteratee) {
+      var index = -1,
+        result = isArrayLike(collection) ? Array(collection.length) : [];
+
+      baseEach(collection, function(value, key, collection) {
+        result[++index] = iteratee(value, key, collection);
+      });
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.matches` which doesn't clone `source`.
+     *
+     * @private
+     * @param {Object} source The object of property values to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseMatches(source) {
+      var matchData = getMatchData(source);
+      if (matchData.length == 1 && matchData[0][2]) {
+        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+      }
+      return function(object) {
+        return object === source || baseIsMatch(object, source, matchData);
+      };
+    }
+
+    /**
+     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+     *
+     * @private
+     * @param {string} path The path of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseMatchesProperty(path, srcValue) {
+      if (isKey(path) && isStrictComparable(srcValue)) {
+        return matchesStrictComparable(toKey(path), srcValue);
+      }
+      return function(object) {
+        var objValue = get(object, path);
+        return (objValue === undefined && objValue === srcValue) ?
+          hasIn(object, path) :
+          baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+      };
+    }
+
+    /**
+     * The base implementation of `_.merge` without support for multiple sources.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @param {number} srcIndex The index of `source`.
+     * @param {Function} [customizer] The function to customize merged values.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     */
+    function baseMerge(object, source, srcIndex, customizer, stack) {
+      if (object === source) {
+        return;
+      }
+      baseFor(source, function(srcValue, key) {
+        stack || (stack = new Stack);
+        if (isObject(srcValue)) {
+          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+        } else {
+          var newValue = customizer ?
+            customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) :
+            undefined;
+
+          if (newValue === undefined) {
+            newValue = srcValue;
+          }
+          assignMergeValue(object, key, newValue);
+        }
+      }, keysIn);
+    }
+
+    /**
+     * A specialized version of `baseMerge` for arrays and objects which performs
+     * deep merges and tracks traversed objects enabling objects with circular
+     * references to be merged.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @param {string} key The key of the value to merge.
+     * @param {number} srcIndex The index of `source`.
+     * @param {Function} mergeFunc The function to merge values.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     */
+    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+      var objValue = safeGet(object, key),
+        srcValue = safeGet(source, key),
+        stacked = stack.get(srcValue);
+
+      if (stacked) {
+        assignMergeValue(object, key, stacked);
+        return;
+      }
+      var newValue = customizer ?
+        customizer(objValue, srcValue, (key + ''), object, source, stack) :
+        undefined;
+
+      var isCommon = newValue === undefined;
+
+      if (isCommon) {
+        var isArr = isArray(srcValue),
+          isBuff = !isArr && isBuffer(srcValue),
+          isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+
+        newValue = srcValue;
+        if (isArr || isBuff || isTyped) {
+          if (isArray(objValue)) {
+            newValue = objValue;
+          } else if (isArrayLikeObject(objValue)) {
+            newValue = copyArray(objValue);
+          } else if (isBuff) {
+            isCommon = false;
+            newValue = cloneBuffer(srcValue, true);
+          } else if (isTyped) {
+            isCommon = false;
+            newValue = cloneTypedArray(srcValue, true);
+          } else {
+            newValue = [];
+          }
+        } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+          newValue = objValue;
+          if (isArguments(objValue)) {
+            newValue = toPlainObject(objValue);
+          } else if (!isObject(objValue) || isFunction(objValue)) {
+            newValue = initCloneObject(srcValue);
+          }
+        } else {
+          isCommon = false;
+        }
+      }
+      if (isCommon) {
+        // Recursively merge objects and arrays (susceptible to call stack limits).
+        stack.set(srcValue, newValue);
+        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+        stack['delete'](srcValue);
+      }
+      assignMergeValue(object, key, newValue);
+    }
+
+    /**
+     * The base implementation of `_.nth` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {Array} array The array to query.
+     * @param {number} n The index of the element to return.
+     * @returns {*} Returns the nth element of `array`.
+     */
+    function baseNth(array, n) {
+      var length = array.length;
+      if (!length) {
+        return;
+      }
+      n += n < 0 ? length : 0;
+      return isIndex(n, length) ? array[n] : undefined;
+    }
+
+    /**
+     * The base implementation of `_.orderBy` without param guards.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+     * @param {string[]} orders The sort orders of `iteratees`.
+     * @returns {Array} Returns the new sorted array.
+     */
+    function baseOrderBy(collection, iteratees, orders) {
+      if (iteratees.length) {
+        iteratees = arrayMap(iteratees, function(iteratee) {
+          if (isArray(iteratee)) {
+            return function(value) {
+              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
+            }
+          }
+          return iteratee;
+        });
+      } else {
+        iteratees = [identity];
+      }
+
+      var index = -1;
+      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+
+      var result = baseMap(collection, function(value, key, collection) {
+        var criteria = arrayMap(iteratees, function(iteratee) {
+          return iteratee(value);
+        });
+        return {
+          'criteria': criteria,
+          'index': ++index,
+          'value': value
+        };
+      });
+
+      return baseSortBy(result, function(object, other) {
+        return compareMultiple(object, other, orders);
+      });
+    }
+
+    /**
+     * The base implementation of `_.pick` without support for individual
+     * property identifiers.
+     *
+     * @private
+     * @param {Object} object The source object.
+     * @param {string[]} paths The property paths to pick.
+     * @returns {Object} Returns the new object.
+     */
+    function basePick(object, paths) {
+      return basePickBy(object, paths, function(value, path) {
+        return hasIn(object, path);
+      });
+    }
+
+    /**
+     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The source object.
+     * @param {string[]} paths The property paths to pick.
+     * @param {Function} predicate The function invoked per property.
+     * @returns {Object} Returns the new object.
+     */
+    function basePickBy(object, paths, predicate) {
+      var index = -1,
+        length = paths.length,
+        result = {};
+
+      while (++index < length) {
+        var path = paths[index],
+          value = baseGet(object, path);
+
+        if (predicate(value, path)) {
+          baseSet(result, castPath(path, object), value);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * A specialized version of `baseProperty` which supports deep paths.
+     *
+     * @private
+     * @param {Array|string} path The path of the property to get.
+     * @returns {Function} Returns the new accessor function.
+     */
+    function basePropertyDeep(path) {
+      return function(object) {
+        return baseGet(object, path);
+      };
+    }
+
+    /**
+     * The base implementation of `_.pullAllBy` without support for iteratee
+     * shorthands.
+     *
+     * @private
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns `array`.
+     */
+    function basePullAll(array, values, iteratee, comparator) {
+      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
+        index = -1,
+        length = values.length,
+        seen = array;
+
+      if (array === values) {
+        values = copyArray(values);
+      }
+      if (iteratee) {
+        seen = arrayMap(array, baseUnary(iteratee));
+      }
+      while (++index < length) {
+        var fromIndex = 0,
+          value = values[index],
+          computed = iteratee ? iteratee(value) : value;
+
+        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
+          if (seen !== array) {
+            splice.call(seen, fromIndex, 1);
+          }
+          splice.call(array, fromIndex, 1);
+        }
+      }
+      return array;
+    }
+
+    /**
+     * The base implementation of `_.pullAt` without support for individual
+     * indexes or capturing the removed elements.
+     *
+     * @private
+     * @param {Array} array The array to modify.
+     * @param {number[]} indexes The indexes of elements to remove.
+     * @returns {Array} Returns `array`.
+     */
+    function basePullAt(array, indexes) {
+      var length = array ? indexes.length : 0,
+        lastIndex = length - 1;
+
+      while (length--) {
+        var index = indexes[length];
+        if (length == lastIndex || index !== previous) {
+          var previous = index;
+          if (isIndex(index)) {
+            splice.call(array, index, 1);
+          } else {
+            baseUnset(array, index);
+          }
+        }
+      }
+      return array;
+    }
+
+    /**
+     * The base implementation of `_.random` without support for returning
+     * floating-point numbers.
+     *
+     * @private
+     * @param {number} lower The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the random number.
+     */
+    function baseRandom(lower, upper) {
+      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
+    }
+
+    /**
+     * The base implementation of `_.range` and `_.rangeRight` which doesn't
+     * coerce arguments.
+     *
+     * @private
+     * @param {number} start The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} step The value to increment or decrement by.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Array} Returns the range of numbers.
+     */
+    function baseRange(start, end, step, fromRight) {
+      var index = -1,
+        length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+        result = Array(length);
+
+      while (length--) {
+        result[fromRight ? length : ++index] = start;
+        start += step;
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.repeat` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {string} string The string to repeat.
+     * @param {number} n The number of times to repeat the string.
+     * @returns {string} Returns the repeated string.
+     */
+    function baseRepeat(string, n) {
+      var result = '';
+      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
+        return result;
+      }
+      // Leverage the exponentiation by squaring algorithm for a faster repeat.
+      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+      do {
+        if (n % 2) {
+          result += string;
+        }
+        n = nativeFloor(n / 2);
+        if (n) {
+          string += string;
+        }
+      } while (n);
+
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @returns {Function} Returns the new function.
+     */
+    function baseRest(func, start) {
+      return setToString(overRest(func, start, identity), func + '');
+    }
+
+    /**
+     * The base implementation of `_.sample`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to sample.
+     * @returns {*} Returns the random element.
+     */
+    function baseSample(collection) {
+      return arraySample(values(collection));
+    }
+
+    /**
+     * The base implementation of `_.sampleSize` without param guards.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to sample.
+     * @param {number} n The number of elements to sample.
+     * @returns {Array} Returns the random elements.
+     */
+    function baseSampleSize(collection, n) {
+      var array = values(collection);
+      return shuffleSelf(array, baseClamp(n, 0, array.length));
+    }
+
+    /**
+     * The base implementation of `_.set`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @param {Function} [customizer] The function to customize path creation.
+     * @returns {Object} Returns `object`.
+     */
+    function baseSet(object, path, value, customizer) {
+      if (!isObject(object)) {
+        return object;
+      }
+      path = castPath(path, object);
+
+      var index = -1,
+        length = path.length,
+        lastIndex = length - 1,
+        nested = object;
+
+      while (nested != null && ++index < length) {
+        var key = toKey(path[index]),
+          newValue = value;
+
+        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
+          return object;
+        }
+
+        if (index != lastIndex) {
+          var objValue = nested[key];
+          newValue = customizer ? customizer(objValue, key, nested) : undefined;
+          if (newValue === undefined) {
+            newValue = isObject(objValue) ?
+              objValue :
+              (isIndex(path[index + 1]) ? [] : {});
+          }
+        }
+        assignValue(nested, key, newValue);
+        nested = nested[key];
+      }
+      return object;
+    }
+
+    /**
+     * The base implementation of `setData` without support for hot loop shorting.
+     *
+     * @private
+     * @param {Function} func The function to associate metadata with.
+     * @param {*} data The metadata.
+     * @returns {Function} Returns `func`.
+     */
+    var baseSetData = !metaMap ? identity : function(func, data) {
+      metaMap.set(func, data);
+      return func;
+    };
+
+    /**
+     * The base implementation of `setToString` without support for hot loop shorting.
+     *
+     * @private
+     * @param {Function} func The function to modify.
+     * @param {Function} string The `toString` result.
+     * @returns {Function} Returns `func`.
+     */
+    var baseSetToString = !defineProperty ? identity : function(func, string) {
+      return defineProperty(func, 'toString', {
+        'configurable': true,
+        'enumerable': false,
+        'value': constant(string),
+        'writable': true
+      });
+    };
+
+    /**
+     * The base implementation of `_.shuffle`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     */
+    function baseShuffle(collection) {
+      return shuffleSelf(values(collection));
+    }
+
+    /**
+     * The base implementation of `_.slice` without an iteratee call guard.
+     *
+     * @private
+     * @param {Array} array The array to slice.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function baseSlice(array, start, end) {
+      var index = -1,
+        length = array.length;
+
+      if (start < 0) {
+        start = -start > length ? 0 : (length + start);
+      }
+      end = end > length ? length : end;
+      if (end < 0) {
+        end += length;
+      }
+      length = start > end ? 0 : ((end - start) >>> 0);
+      start >>>= 0;
+
+      var result = Array(length);
+      while (++index < length) {
+        result[index] = array[index + start];
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.some` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {boolean} Returns `true` if any element passes the predicate check,
+     *  else `false`.
+     */
+    function baseSome(collection, predicate) {
+      var result;
+
+      baseEach(collection, function(value, index, collection) {
+        result = predicate(value, index, collection);
+        return !result;
+      });
+      return !!result;
+    }
+
+    /**
+     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
+     * performs a binary search of `array` to determine the index at which `value`
+     * should be inserted into `array` in order to maintain its sort order.
+     *
+     * @private
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {boolean} [retHighest] Specify returning the highest qualified index.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     */
+    function baseSortedIndex(array, value, retHighest) {
+      var low = 0,
+        high = array == null ? low : array.length;
+
+      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+        while (low < high) {
+          var mid = (low + high) >>> 1,
+            computed = array[mid];
+
+          if (computed !== null && !isSymbol(computed) &&
+            (retHighest ? (computed <= value) : (computed < value))) {
+            low = mid + 1;
+          } else {
+            high = mid;
+          }
+        }
+        return high;
+      }
+      return baseSortedIndexBy(array, value, identity, retHighest);
+    }
+
+    /**
+     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
+     * which invokes `iteratee` for `value` and each element of `array` to compute
+     * their sort ranking. The iteratee is invoked with one argument; (value).
+     *
+     * @private
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} iteratee The iteratee invoked per element.
+     * @param {boolean} [retHighest] Specify returning the highest qualified index.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     */
+    function baseSortedIndexBy(array, value, iteratee, retHighest) {
+      var low = 0,
+        high = array == null ? 0 : array.length;
+      if (high === 0) {
+        return 0;
+      }
+
+      value = iteratee(value);
+      var valIsNaN = value !== value,
+        valIsNull = value === null,
+        valIsSymbol = isSymbol(value),
+        valIsUndefined = value === undefined;
+
+      while (low < high) {
+        var mid = nativeFloor((low + high) / 2),
+          computed = iteratee(array[mid]),
+          othIsDefined = computed !== undefined,
+          othIsNull = computed === null,
+          othIsReflexive = computed === computed,
+          othIsSymbol = isSymbol(computed);
+
+        if (valIsNaN) {
+          var setLow = retHighest || othIsReflexive;
+        } else if (valIsUndefined) {
+          setLow = othIsReflexive && (retHighest || othIsDefined);
+        } else if (valIsNull) {
+          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
+        } else if (valIsSymbol) {
+          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
+        } else if (othIsNull || othIsSymbol) {
+          setLow = false;
+        } else {
+          setLow = retHighest ? (computed <= value) : (computed < value);
+        }
+        if (setLow) {
+          low = mid + 1;
+        } else {
+          high = mid;
+        }
+      }
+      return nativeMin(high, MAX_ARRAY_INDEX);
+    }
+
+    /**
+     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
+     * support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     */
+    function baseSortedUniq(array, iteratee) {
+      var index = -1,
+        length = array.length,
+        resIndex = 0,
+        result = [];
+
+      while (++index < length) {
+        var value = array[index],
+          computed = iteratee ? iteratee(value) : value;
+
+        if (!index || !eq(computed, seen)) {
+          var seen = computed;
+          result[resIndex++] = value === 0 ? 0 : value;
+        }
+      }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.toNumber` which doesn't ensure correct
+     * conversions of binary, hexadecimal, or octal string values.
+     *
+     * @private
+     * @param {*} value The value to process.
+     * @returns {number} Returns the number.
+     */
+    function baseToNumber(value) {
+      if (typeof value == 'number') {
+        return value;
+      }
+      if (isSymbol(value)) {
+        return NAN;
+      }
+      return +value;
+    }
+
+    /**
+     * The base implementation of `_.toString` which doesn't convert nullish
+     * values to empty strings.
+     *
+     * @private
+     * @param {*} value The value to process.
+     * @returns {string} Returns the string.
+     */
+    function baseToString(value) {
+      // Exit early for strings to avoid a performance hit in some environments.
+      if (typeof value == 'string') {
+        return value;
+      }
+      if (isArray(value)) {
+        // Recursively convert values (susceptible to call stack limits).
+        return arrayMap(value, baseToString) + '';
+      }
+      if (isSymbol(value)) {
+        return symbolToString ? symbolToString.call(value) : '';
+      }
+      var result = (value + '');
+      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+    }
+
+    /**
+     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     */
+    function baseUniq(array, iteratee, comparator) {
+      var index = -1,
+        includes = arrayIncludes,
+        length = array.length,
+        isCommon = true,
+        result = [],
+        seen = result;
+
+      if (comparator) {
+        isCommon = false;
+        includes = arrayIncludesWith;
+      } else if (length >= LARGE_ARRAY_SIZE) {
+        var set = iteratee ? null : createSet(array);
+        if (set) {
+          return setToArray(set);
+        }
+        isCommon = false;
+        includes = cacheHas;
+        seen = new SetCache;
+      } else {
+        seen = iteratee ? [] : result;
+      }
+      outer:
+        while (++index < length) {
+          var value = array[index],
+            computed = iteratee ? iteratee(value) : value;
+
+          value = (comparator || value !== 0) ? value : 0;
+          if (isCommon && computed === computed) {
+            var seenIndex = seen.length;
+            while (seenIndex--) {
+              if (seen[seenIndex] === computed) {
+                continue outer;
+              }
+            }
+            if (iteratee) {
+              seen.push(computed);
+            }
+            result.push(value);
+          } else if (!includes(seen, computed, comparator)) {
+            if (seen !== result) {
+              seen.push(computed);
+            }
+            result.push(value);
+          }
+        }
+      return result;
+    }
+
+    /**
+     * The base implementation of `_.unset`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The property path to unset.
+     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+     */
+    function baseUnset(object, path) {
+      path = castPath(path, object);
+      object = parent(object, path);
+      return object == null || delete object[toKey(last(path))];
+    }
+
+    /**
+     * The base implementation of `_.update`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to update.
+     * @param {Function} updater The function to produce the updated value.
+     * @param {Function} [customizer] The function to customize path creation.
+     * @returns {Object} Returns `object`.
+     */
+    function baseUpdate(object, path, updater, customizer) {
+      return baseSet(object, path, updater(baseGet(object, path)), customizer);
+    }
+
+    /**
+     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
+     * without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to query.
+     * @param {Function} predicate The function invoked per iteration.
+     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function baseWhile(array, predicate, isDrop, fromRight) {
+      var length = array.length,
+        index = fromRight ? length : -1;
+
+      while ((fromRight ? index-- : ++index < length) &&
+        predicate(array[index], index, array)) {}
+
+      return isDrop ?
+        baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) :
+        baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
+    }
+
+    /**
+     * The base implementation of `wrapperValue` which returns the result of
+     * performing a sequence of actions on the unwrapped `value`, where each
+     * successive action is supplied the return value of the previous.
+     *
+     * @private
+     * @param {*} value The unwrapped value.
+     * @param {Array} actions Actions to perform to resolve the unwrapped value.
+     * @returns {*} Returns the resolved value.
+     */
+    function baseWrapperValue(value, actions) {
+      var result = value;
+      if (result instanceof LazyWrapper) {
+        result = result.value();
+      }
+      return arrayReduce(actions, function(result, action) {
+        return action.func.apply(action.thisArg, arrayPush([result], action.args));
+      }, result);
+    }
+
+    /**
+     * The base implementation of methods like `_.xor`, without support for
+     * iteratee shorthands, that accepts an array of arrays to inspect.
+     *
+     * @private
+     * @param {Array} arrays The arrays to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of values.
+     */
+    function baseXor(arrays, iteratee, comparator) {
+      var length = arrays.length;
+      if (length < 2) {
+        return length ? baseUniq(arrays[0]) : [];
+      }
+      var index = -1,
+        result = Array(length);
+
+      while (++index < length) {
+        var array = arrays[index],
+          othIndex = -1;
+
+        while (++othIndex < length) {
+          if (othIndex != index) {
+            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
+          }
+        }
+      }
+      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
+    }
+
+    /**
+     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
+     *
+     * @private
+     * @param {Array} props The property identifiers.
+     * @param {Array} values The property values.
+     * @param {Function} assignFunc The function to assign values.
+     * @returns {Object} Returns the new object.
+     */
+    function baseZipObject(props, values, assignFunc) {
+      var index = -1,
+        length = props.length,
+        valsLength = values.length,
+        result = {};
+
+      while (++index < length) {
+        var value = index < valsLength ? values[index] : undefined;
+        assignFunc(result, props[index], value);
+      }
+      return result;
+    }
+
+    /**
+     * Casts `value` to an empty array if it's not an array like object.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {Array|Object} Returns the cast array-like object.
+     */
+    function castArrayLikeObject(value) {
+      return isArrayLikeObject(value) ? value : [];
+    }
+
+    /**
+     * Casts `value` to `identity` if it's not a function.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {Function} Returns cast function.
+     */
+    function castFunction(value) {
+      return typeof value == 'function' ? value : identity;
+    }
+
+    /**
+     * Casts `value` to a path array if it's not one.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @param {Object} [object] The object to query keys on.
+     * @returns {Array} Returns the cast property path array.
+     */
+    function castPath(value, object) {
+      if (isArray(value)) {
+        return value;
+      }
+      return isKey(value, object) ? [value] : stringToPath(toString(value));
+    }
+
+    /**
+     * A `baseRest` alias which can be replaced with `identity` by module
+     * replacement plugins.
+     *
+     * @private
+     * @type {Function}
+     * @param {Function} func The function to apply a rest parameter to.
+     * @returns {Function} Returns the new function.
+     */
+    var castRest = baseRest;
+
+    /**
+     * Casts `array` to a slice if it's needed.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {number} start The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the cast slice.
+     */
+    function castSlice(array, start, end) {
+      var length = array.length;
+      end = end === undefined ? length : end;
+      return (!start && end >= length) ? array : baseSlice(array, start, end);
+    }
+
+    /**
+     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
+     *
+     * @private
+     * @param {number|Object} id The timer id or timeout object of the timer to clear.
+     */
+    var clearTimeout = ctxClearTimeout || function(id) {
+      return root.clearTimeout(id);
+    };
+
+    /**
+     * Creates a clone of  `buffer`.
+     *
+     * @private
+     * @param {Buffer} buffer The buffer to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Buffer} Returns the cloned buffer.
+     */
+    function cloneBuffer(buffer, isDeep) {
+      if (isDeep) {
+        return buffer.slice();
+      }
+      var length = buffer.length,
+        result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+
+      buffer.copy(result);
+      return result;
+    }
+
+    /**
+     * Creates a clone of `arrayBuffer`.
+     *
+     * @private
+     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+     * @returns {ArrayBuffer} Returns the cloned array buffer.
+     */
+    function cloneArrayBuffer(arrayBuffer) {
+      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+      return result;
+    }
+
+    /**
+     * Creates a clone of `dataView`.
+     *
+     * @private
+     * @param {Object} dataView The data view to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned data view.
+     */
+    function cloneDataView(dataView, isDeep) {
+      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+    }
+
+    /**
+     * Creates a clone of `regexp`.
+     *
+     * @private
+     * @param {Object} regexp The regexp to clone.
+     * @returns {Object} Returns the cloned regexp.
+     */
+    function cloneRegExp(regexp) {
+      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+      result.lastIndex = regexp.lastIndex;
+      return result;
+    }
+
+    /**
+     * Creates a clone of the `symbol` object.
+     *
+     * @private
+     * @param {Object} symbol The symbol object to clone.
+     * @returns {Object} Returns the cloned symbol object.
+     */
+    function cloneSymbol(symbol) {
+      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+    }
+
+    /**
+     * Creates a clone of `typedArray`.
+     *
+     * @private
+     * @param {Object} typedArray The typed array to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned typed array.
+     */
+    function cloneTypedArray(typedArray, isDeep) {
+      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+    }
+
+    /**
+     * Compares values to sort them in ascending order.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {number} Returns the sort order indicator for `value`.
+     */
+    function compareAscending(value, other) {
+      if (value !== other) {
+        var valIsDefined = value !== undefined,
+          valIsNull = value === null,
+          valIsReflexive = value === value,
+          valIsSymbol = isSymbol(value);
+
+        var othIsDefined = other !== undefined,
+          othIsNull = other === null,
+          othIsReflexive = other === other,
+          othIsSymbol = isSymbol(other);
+
+        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
+          (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
+          (valIsNull && othIsDefined && othIsReflexive) ||
+          (!valIsDefined && othIsReflexive) ||
+          !valIsReflexive) {
+          return 1;
+        }
+        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
+          (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
+          (othIsNull && valIsDefined && valIsReflexive) ||
+          (!othIsDefined && valIsReflexive) ||
+          !othIsReflexive) {
+          return -1;
+        }
+      }
+      return 0;
+    }
+
+    /**
+     * Used by `_.orderBy` to compare multiple properties of a value to another
+     * and stable sort them.
+     *
+     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
+     * specify an order of "desc" for descending or "asc" for ascending sort order
+     * of corresponding values.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {boolean[]|string[]} orders The order to sort by for each property.
+     * @returns {number} Returns the sort order indicator for `object`.
+     */
+    function compareMultiple(object, other, orders) {
+      var index = -1,
+        objCriteria = object.criteria,
+        othCriteria = other.criteria,
+        length = objCriteria.length,
+        ordersLength = orders.length;
+
+      while (++index < length) {
+        var result = compareAscending(objCriteria[index], othCriteria[index]);
+        if (result) {
+          if (index >= ordersLength) {
+            return result;
+          }
+          var order = orders[index];
+          return result * (order == 'desc' ? -1 : 1);
+        }
+      }
+      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+      // that causes it, under certain circumstances, to provide the same value for
+      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+      // for more details.
+      //
+      // This also ensures a stable sort in V8 and other engines.
+      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
+      return object.index - other.index;
+    }
+
+    /**
+     * Creates an array that is the composition of partially applied arguments,
+     * placeholders, and provided arguments into a single array of arguments.
+     *
+     * @private
+     * @param {Array} args The provided arguments.
+     * @param {Array} partials The arguments to prepend to those provided.
+     * @param {Array} holders The `partials` placeholder indexes.
+     * @params {boolean} [isCurried] Specify composing for a curried function.
+     * @returns {Array} Returns the new array of composed arguments.
+     */
+    function composeArgs(args, partials, holders, isCurried) {
+      var argsIndex = -1,
+        argsLength = args.length,
+        holdersLength = holders.length,
+        leftIndex = -1,
+        leftLength = partials.length,
+        rangeLength = nativeMax(argsLength - holdersLength, 0),
+        result = Array(leftLength + rangeLength),
+        isUncurried = !isCurried;
+
+      while (++leftIndex < leftLength) {
+        result[leftIndex] = partials[leftIndex];
+      }
+      while (++argsIndex < holdersLength) {
+        if (isUncurried || argsIndex < argsLength) {
+          result[holders[argsIndex]] = args[argsIndex];
+        }
+      }
+      while (rangeLength--) {
+        result[leftIndex++] = args[argsIndex++];
+      }
+      return result;
+    }
+
+    /**
+     * This function is like `composeArgs` except that the arguments composition
+     * is tailored for `_.partialRight`.
+     *
+     * @private
+     * @param {Array} args The provided arguments.
+     * @param {Array} partials The arguments to append to those provided.
+     * @param {Array} holders The `partials` placeholder indexes.
+     * @params {boolean} [isCurried] Specify composing for a curried function.
+     * @returns {Array} Returns the new array of composed arguments.
+     */
+    function composeArgsRight(args, partials, holders, isCurried) {
+      var argsIndex = -1,
+        argsLength = args.length,
+        holdersIndex = -1,
+        holdersLength = holders.length,
+        rightIndex = -1,
+        rightLength = partials.length,
+        rangeLength = nativeMax(argsLength - holdersLength, 0),
+        result = Array(rangeLength + rightLength),
+        isUncurried = !isCurried;
+
+      while (++argsIndex < rangeLength) {
+        result[argsIndex] = args[argsIndex];
+      }
+      var offset = argsIndex;
+      while (++rightIndex < rightLength) {
+        result[offset + rightIndex] = partials[rightIndex];
+      }
+      while (++holdersIndex < holdersLength) {
+        if (isUncurried || argsIndex < argsLength) {
+          result[offset + holders[holdersIndex]] = args[argsIndex++];
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Copies the values of `source` to `array`.
+     *
+     * @private
+     * @param {Array} source The array to copy values from.
+     * @param {Array} [array=[]] The array to copy values to.
+     * @returns {Array} Returns `array`.
+     */
+    function copyArray(source, array) {
+      var index = -1,
+        length = source.length;
+
+      array || (array = Array(length));
+      while (++index < length) {
+        array[index] = source[index];
+      }
+      return array;
+    }
+
+    /**
+     * Copies properties of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy properties from.
+     * @param {Array} props The property identifiers to copy.
+     * @param {Object} [object={}] The object to copy properties to.
+     * @param {Function} [customizer] The function to customize copied values.
+     * @returns {Object} Returns `object`.
+     */
+    function copyObject(source, props, object, customizer) {
+      var isNew = !object;
+      object || (object = {});
+
+      var index = -1,
+        length = props.length;
+
+      while (++index < length) {
+        var key = props[index];
+
+        var newValue = customizer ?
+          customizer(object[key], source[key], key, object, source) :
+          undefined;
+
+        if (newValue === undefined) {
+          newValue = source[key];
+        }
+        if (isNew) {
+          baseAssignValue(object, key, newValue);
+        } else {
+          assignValue(object, key, newValue);
+        }
+      }
+      return object;
+    }
+
+    /**
+     * Copies own symbols of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy symbols from.
+     * @param {Object} [object={}] The object to copy symbols to.
+     * @returns {Object} Returns `object`.
+     */
+    function copySymbols(source, object) {
+      return copyObject(source, getSymbols(source), object);
+    }
+
+    /**
+     * Copies own and inherited symbols of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy symbols from.
+     * @param {Object} [object={}] The object to copy symbols to.
+     * @returns {Object} Returns `object`.
+     */
+    function copySymbolsIn(source, object) {
+      return copyObject(source, getSymbolsIn(source), object);
+    }
+
+    /**
+     * Creates a function like `_.groupBy`.
+     *
+     * @private
+     * @param {Function} setter The function to set accumulator values.
+     * @param {Function} [initializer] The accumulator object initializer.
+     * @returns {Function} Returns the new aggregator function.
+     */
+    function createAggregator(setter, initializer) {
+      return function(collection, iteratee) {
+        var func = isArray(collection) ? arrayAggregator : baseAggregator,
+          accumulator = initializer ? initializer() : {};
+
+        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
+      };
+    }
+
+    /**
+     * Creates a function like `_.assign`.
+     *
+     * @private
+     * @param {Function} assigner The function to assign values.
+     * @returns {Function} Returns the new assigner function.
+     */
+    function createAssigner(assigner) {
+      return baseRest(function(object, sources) {
+        var index = -1,
+          length = sources.length,
+          customizer = length > 1 ? sources[length - 1] : undefined,
+          guard = length > 2 ? sources[2] : undefined;
+
+        customizer = (assigner.length > 3 && typeof customizer == 'function') ?
+          (length--, customizer) :
+          undefined;
+
+        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+          customizer = length < 3 ? undefined : customizer;
+          length = 1;
+        }
+        object = Object(object);
+        while (++index < length) {
+          var source = sources[index];
+          if (source) {
+            assigner(object, source, index, customizer);
+          }
+        }
+        return object;
+      });
+    }
+
+    /**
+     * Creates a `baseEach` or `baseEachRight` function.
+     *
+     * @private
+     * @param {Function} eachFunc The function to iterate over a collection.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new base function.
+     */
+    function createBaseEach(eachFunc, fromRight) {
+      return function(collection, iteratee) {
+        if (collection == null) {
+          return collection;
+        }
+        if (!isArrayLike(collection)) {
+          return eachFunc(collection, iteratee);
+        }
+        var length = collection.length,
+          index = fromRight ? length : -1,
+          iterable = Object(collection);
+
+        while ((fromRight ? index-- : ++index < length)) {
+          if (iteratee(iterable[index], index, iterable) === false) {
+            break;
+          }
+        }
+        return collection;
+      };
+    }
+
+    /**
+     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new base function.
+     */
+    function createBaseFor(fromRight) {
+      return function(object, iteratee, keysFunc) {
+        var index = -1,
+          iterable = Object(object),
+          props = keysFunc(object),
+          length = props.length;
+
+        while (length--) {
+          var key = props[fromRight ? length : ++index];
+          if (iteratee(iterable[key], key, iterable) === false) {
+            break;
+          }
+        }
+        return object;
+      };
+    }
+
+    /**
+     * Creates a function that wraps `func` to invoke it with the optional `this`
+     * binding of `thisArg`.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createBind(func, bitmask, thisArg) {
+      var isBind = bitmask & WRAP_BIND_FLAG,
+        Ctor = createCtor(func);
+
+      function wrapper() {
+        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+        return fn.apply(isBind ? thisArg : this, arguments);
+      }
+      return wrapper;
+    }
+
+    /**
+     * Creates a function like `_.lowerFirst`.
+     *
+     * @private
+     * @param {string} methodName The name of the `String` case method to use.
+     * @returns {Function} Returns the new case function.
+     */
+    function createCaseFirst(methodName) {
+      return function(string) {
+        string = toString(string);
+
+        var strSymbols = hasUnicode(string) ?
+          stringToArray(string) :
+          undefined;
+
+        var chr = strSymbols ?
+          strSymbols[0] :
+          string.charAt(0);
+
+        var trailing = strSymbols ?
+          castSlice(strSymbols, 1).join('') :
+          string.slice(1);
+
+        return chr[methodName]() + trailing;
+      };
+    }
+
+    /**
+     * Creates a function like `_.camelCase`.
+     *
+     * @private
+     * @param {Function} callback The function to combine each word.
+     * @returns {Function} Returns the new compounder function.
+     */
+    function createCompounder(callback) {
+      return function(string) {
+        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
+      };
+    }
+
+    /**
+     * Creates a function that produces an instance of `Ctor` regardless of
+     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+     *
+     * @private
+     * @param {Function} Ctor The constructor to wrap.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createCtor(Ctor) {
+      return function() {
+        // Use a `switch` statement to work with class constructors. See
+        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+        // for more details.
+        var args = arguments;
+        switch (args.length) {
+          case 0:
+            return new Ctor;
+          case 1:
+            return new Ctor(args[0]);
+          case 2:
+            return new Ctor(args[0], args[1]);
+          case 3:
+            return new Ctor(args[0], args[1], args[2]);
+          case 4:
+            return new Ctor(args[0], args[1], args[2], args[3]);
+          case 5:
+            return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+          case 6:
+            return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+          case 7:
+            return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+        }
+        var thisBinding = baseCreate(Ctor.prototype),
+          result = Ctor.apply(thisBinding, args);
+
+        // Mimic the constructor's `return` behavior.
+        // See https://es5.github.io/#x13.2.2 for more details.
+        return isObject(result) ? result : thisBinding;
+      };
+    }
+
+    /**
+     * Creates a function that wraps `func` to enable currying.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {number} arity The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createCurry(func, bitmask, arity) {
+      var Ctor = createCtor(func);
+
+      function wrapper() {
+        var length = arguments.length,
+          args = Array(length),
+          index = length,
+          placeholder = getHolder(wrapper);
+
+        while (index--) {
+          args[index] = arguments[index];
+        }
+        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) ? [] :
+          replaceHolders(args, placeholder);
+
+        length -= holders.length;
+        if (length < arity) {
+          return createRecurry(
+            func, bitmask, createHybrid, wrapper.placeholder, undefined,
+            args, holders, undefined, undefined, arity - length);
+        }
+        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+        return apply(fn, this, args);
+      }
+      return wrapper;
+    }
+
+    /**
+     * Creates a `_.find` or `_.findLast` function.
+     *
+     * @private
+     * @param {Function} findIndexFunc The function to find the collection index.
+     * @returns {Function} Returns the new find function.
+     */
+    function createFind(findIndexFunc) {
+      return function(collection, predicate, fromIndex) {
+        var iterable = Object(collection);
+        if (!isArrayLike(collection)) {
+          var iteratee = getIteratee(predicate, 3);
+          collection = keys(collection);
+          predicate = function(key) {
+            return iteratee(iterable[key], key, iterable);
+          };
+        }
+        var index = findIndexFunc(collection, predicate, fromIndex);
+        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
+      };
+    }
+
+    /**
+     * Creates a `_.flow` or `_.flowRight` function.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new flow function.
+     */
+    function createFlow(fromRight) {
+      return flatRest(function(funcs) {
+        var length = funcs.length,
+          index = length,
+          prereq = LodashWrapper.prototype.thru;
+
+        if (fromRight) {
+          funcs.reverse();
+        }
+        while (index--) {
+          var func = funcs[index];
+          if (typeof func != 'function') {
+            throw new TypeError(FUNC_ERROR_TEXT);
+          }
+          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
+            var wrapper = new LodashWrapper([], true);
+          }
+        }
+        index = wrapper ? index : length;
+        while (++index < length) {
+          func = funcs[index];
+
+          var funcName = getFuncName(func),
+            data = funcName == 'wrapper' ? getData(func) : undefined;
+
+          if (data && isLaziable(data[0]) &&
+            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
+            !data[4].length && data[9] == 1
+          ) {
+            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+          } else {
+            wrapper = (func.length == 1 && isLaziable(func)) ?
+              wrapper[funcName]() :
+              wrapper.thru(func);
+          }
+        }
+        return function() {
+          var args = arguments,
+            value = args[0];
+
+          if (wrapper && args.length == 1 && isArray(value)) {
+            return wrapper.plant(value).value();
+          }
+          var index = 0,
+            result = length ? funcs[index].apply(this, args) : value;
+
+          while (++index < length) {
+            result = funcs[index].call(this, result);
+          }
+          return result;
+        };
+      });
+    }
+
+    /**
+     * Creates a function that wraps `func` to invoke it with optional `this`
+     * binding of `thisArg`, partial application, and currying.
+     *
+     * @private
+     * @param {Function|string} func The function or method name to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to prepend to those provided to
+     *  the new function.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [partialsRight] The arguments to append to those provided
+     *  to the new function.
+     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+      var isAry = bitmask & WRAP_ARY_FLAG,
+        isBind = bitmask & WRAP_BIND_FLAG,
+        isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
+        isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
+        isFlip = bitmask & WRAP_FLIP_FLAG,
+        Ctor = isBindKey ? undefined : createCtor(func);
+
+      function wrapper() {
+        var length = arguments.length,
+          args = Array(length),
+          index = length;
+
+        while (index--) {
+          args[index] = arguments[index];
+        }
+        if (isCurried) {
+          var placeholder = getHolder(wrapper),
+            holdersCount = countHolders(args, placeholder);
+        }
+        if (partials) {
+          args = composeArgs(args, partials, holders, isCurried);
+        }
+        if (partialsRight) {
+          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
+        }
+        length -= holdersCount;
+        if (isCurried && length < arity) {
+          var newHolders = replaceHolders(args, placeholder);
+          return createRecurry(
+            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
+            args, newHolders, argPos, ary, arity - length
+          );
+        }
+        var thisBinding = isBind ? thisArg : this,
+          fn = isBindKey ? thisBinding[func] : func;
+
+        length = args.length;
+        if (argPos) {
+          args = reorder(args, argPos);
+        } else if (isFlip && length > 1) {
+          args.reverse();
+        }
+        if (isAry && ary < length) {
+          args.length = ary;
+        }
+        if (this && this !== root && this instanceof wrapper) {
+          fn = Ctor || createCtor(fn);
+        }
+        return fn.apply(thisBinding, args);
+      }
+      return wrapper;
+    }
+
+    /**
+     * Creates a function like `_.invertBy`.
+     *
+     * @private
+     * @param {Function} setter The function to set accumulator values.
+     * @param {Function} toIteratee The function to resolve iteratees.
+     * @returns {Function} Returns the new inverter function.
+     */
+    function createInverter(setter, toIteratee) {
+      return function(object, iteratee) {
+        return baseInverter(object, setter, toIteratee(iteratee), {});
+      };
+    }
+
+    /**
+     * Creates a function that performs a mathematical operation on two values.
+     *
+     * @private
+     * @param {Function} operator The function to perform the operation.
+     * @param {number} [defaultValue] The value used for `undefined` arguments.
+     * @returns {Function} Returns the new mathematical operation function.
+     */
+    function createMathOperation(operator, defaultValue) {
+      return function(value, other) {
+        var result;
+        if (value === undefined && other === undefined) {
+          return defaultValue;
+        }
+        if (value !== undefined) {
+          result = value;
+        }
+        if (other !== undefined) {
+          if (result === undefined) {
+            return other;
+          }
+          if (typeof value == 'string' || typeof other == 'string') {
+            value = baseToString(value);
+            other = baseToString(other);
+          } else {
+            value = baseToNumber(value);
+            other = baseToNumber(other);
+          }
+          result = operator(value, other);
+        }
+        return result;
+      };
+    }
+
+    /**
+     * Creates a function like `_.over`.
+     *
+     * @private
+     * @param {Function} arrayFunc The function to iterate over iteratees.
+     * @returns {Function} Returns the new over function.
+     */
+    function createOver(arrayFunc) {
+      return flatRest(function(iteratees) {
+        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+        return baseRest(function(args) {
+          var thisArg = this;
+          return arrayFunc(iteratees, function(iteratee) {
+            return apply(iteratee, thisArg, args);
+          });
+        });
+      });
+    }
+
+    /**
+     * Creates the padding for `string` based on `length`. The `chars` string
+     * is truncated if the number of characters exceeds `length`.
+     *
+     * @private
+     * @param {number} length The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padding for `string`.
+     */
+    function createPadding(length, chars) {
+      chars = chars === undefined ? ' ' : baseToString(chars);
+
+      var charsLength = chars.length;
+      if (charsLength < 2) {
+        return charsLength ? baseRepeat(chars, length) : chars;
+      }
+      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
+      return hasUnicode(chars) ?
+        castSlice(stringToArray(result), 0, length).join('') :
+        result.slice(0, length);
+    }
+
+    /**
+     * Creates a function that wraps `func` to invoke it with the `this` binding
+     * of `thisArg` and `partials` prepended to the arguments it receives.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} thisArg The `this` binding of `func`.
+     * @param {Array} partials The arguments to prepend to those provided to
+     *  the new function.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createPartial(func, bitmask, thisArg, partials) {
+      var isBind = bitmask & WRAP_BIND_FLAG,
+        Ctor = createCtor(func);
+
+      function wrapper() {
+        var argsIndex = -1,
+          argsLength = arguments.length,
+          leftIndex = -1,
+          leftLength = partials.length,
+          args = Array(leftLength + argsLength),
+          fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+
+        while (++leftIndex < leftLength) {
+          args[leftIndex] = partials[leftIndex];
+        }
+        while (argsLength--) {
+          args[leftIndex++] = arguments[++argsIndex];
+        }
+        return apply(fn, isBind ? thisArg : this, args);
+      }
+      return wrapper;
+    }
+
+    /**
+     * Creates a `_.range` or `_.rangeRight` function.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new range function.
+     */
+    function createRange(fromRight) {
+      return function(start, end, step) {
+        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
+          end = step = undefined;
+        }
+        // Ensure the sign of `-0` is preserved.
+        start = toFinite(start);
+        if (end === undefined) {
+          end = start;
+          start = 0;
+        } else {
+          end = toFinite(end);
+        }
+        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
+        return baseRange(start, end, step, fromRight);
+      };
+    }
+
+    /**
+     * Creates a function that performs a relational operation on two values.
+     *
+     * @private
+     * @param {Function} operator The function to perform the operation.
+     * @returns {Function} Returns the new relational operation function.
+     */
+    function createRelationalOperation(operator) {
+      return function(value, other) {
+        if (!(typeof value == 'string' && typeof other == 'string')) {
+          value = toNumber(value);
+          other = toNumber(other);
+        }
+        return operator(value, other);
+      };
+    }
+
+    /**
+     * Creates a function that wraps `func` to continue currying.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {Function} wrapFunc The function to create the `func` wrapper.
+     * @param {*} placeholder The placeholder value.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to prepend to those provided to
+     *  the new function.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+      var isCurry = bitmask & WRAP_CURRY_FLAG,
+        newHolders = isCurry ? holders : undefined,
+        newHoldersRight = isCurry ? undefined : holders,
+        newPartials = isCurry ? partials : undefined,
+        newPartialsRight = isCurry ? undefined : partials;
+
+      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
+      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
+
+      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
+        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
+      }
+      var newData = [
+        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
+        newHoldersRight, argPos, ary, arity
+      ];
+
+      var result = wrapFunc.apply(undefined, newData);
+      if (isLaziable(func)) {
+        setData(result, newData);
+      }
+      result.placeholder = placeholder;
+      return setWrapToString(result, func, bitmask);
+    }
+
+    /**
+     * Creates a function like `_.round`.
+     *
+     * @private
+     * @param {string} methodName The name of the `Math` method to use when rounding.
+     * @returns {Function} Returns the new round function.
+     */
+    function createRound(methodName) {
+      var func = Math[methodName];
+      return function(number, precision) {
+        number = toNumber(number);
+        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
+        if (precision && nativeIsFinite(number)) {
+          // Shift with exponential notation to avoid floating-point issues.
+          // See [MDN](https://mdn.io/round#Examples) for more details.
+          var pair = (toString(number) + 'e').split('e'),
+            value = func(pair[0] + 'e' + (+pair[1] + precision));
+
+          pair = (toString(value) + 'e').split('e');
+          return +(pair[0] + 'e' + (+pair[1] - precision));
+        }
+        return func(number);
+      };
+    }
+
+    /**
+     * Creates a set object of `values`.
+     *
+     * @private
+     * @param {Array} values The values to add to the set.
+     * @returns {Object} Returns the new set.
+     */
+    var createSet = !(Set && (1 / setToArray(new Set([, -0]))[1]) == INFINITY) ? noop : function(values) {
+      return new Set(values);
+    };
+
+    /**
+     * Creates a `_.toPairs` or `_.toPairsIn` function.
+     *
+     * @private
+     * @param {Function} keysFunc The function to get the keys of a given object.
+     * @returns {Function} Returns the new pairs function.
+     */
+    function createToPairs(keysFunc) {
+      return function(object) {
+        var tag = getTag(object);
+        if (tag == mapTag) {
+          return mapToArray(object);
+        }
+        if (tag == setTag) {
+          return setToPairs(object);
+        }
+        return baseToPairs(object, keysFunc(object));
+      };
+    }
+
+    /**
+     * Creates a function that either curries or invokes `func` with optional
+     * `this` binding and partially applied arguments.
+     *
+     * @private
+     * @param {Function|string} func The function or method name to wrap.
+     * @param {number} bitmask The bitmask flags.
+     *    1 - `_.bind`
+     *    2 - `_.bindKey`
+     *    4 - `_.curry` or `_.curryRight` of a bound function
+     *    8 - `_.curry`
+     *   16 - `_.curryRight`
+     *   32 - `_.partial`
+     *   64 - `_.partialRight`
+     *  128 - `_.rearg`
+     *  256 - `_.ary`
+     *  512 - `_.flip`
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to be partially applied.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+      if (!isBindKey && typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      var length = partials ? partials.length : 0;
+      if (!length) {
+        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
+        partials = holders = undefined;
+      }
+      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
+      arity = arity === undefined ? arity : toInteger(arity);
+      length -= holders ? holders.length : 0;
+
+      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+        var partialsRight = partials,
+          holdersRight = holders;
+
+        partials = holders = undefined;
+      }
+      var data = isBindKey ? undefined : getData(func);
+
+      var newData = [
+        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
+        argPos, ary, arity
+      ];
+
+      if (data) {
+        mergeData(newData, data);
+      }
+      func = newData[0];
+      bitmask = newData[1];
+      thisArg = newData[2];
+      partials = newData[3];
+      holders = newData[4];
+      arity = newData[9] = newData[9] === undefined ?
+        (isBindKey ? 0 : func.length) :
+        nativeMax(newData[9] - length, 0);
+
+      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
+        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+      }
+      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
+        var result = createBind(func, bitmask, thisArg);
+      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+        result = createCurry(func, bitmask, arity);
+      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
+        result = createPartial(func, bitmask, thisArg, partials);
+      } else {
+        result = createHybrid.apply(undefined, newData);
+      }
+      var setter = data ? baseSetData : setData;
+      return setWrapToString(setter(result, newData), func, bitmask);
+    }
+
+    /**
+     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
+     * of source objects to the destination object for all destination properties
+     * that resolve to `undefined`.
+     *
+     * @private
+     * @param {*} objValue The destination value.
+     * @param {*} srcValue The source value.
+     * @param {string} key The key of the property to assign.
+     * @param {Object} object The parent object of `objValue`.
+     * @returns {*} Returns the value to assign.
+     */
+    function customDefaultsAssignIn(objValue, srcValue, key, object) {
+      if (objValue === undefined ||
+        (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
+        return srcValue;
+      }
+      return objValue;
+    }
+
+    /**
+     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
+     * objects into destination objects that are passed thru.
+     *
+     * @private
+     * @param {*} objValue The destination value.
+     * @param {*} srcValue The source value.
+     * @param {string} key The key of the property to merge.
+     * @param {Object} object The parent object of `objValue`.
+     * @param {Object} source The parent object of `srcValue`.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     * @returns {*} Returns the value to assign.
+     */
+    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
+      if (isObject(objValue) && isObject(srcValue)) {
+        // Recursively merge objects and arrays (susceptible to call stack limits).
+        stack.set(srcValue, objValue);
+        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
+        stack['delete'](srcValue);
+      }
+      return objValue;
+    }
+
+    /**
+     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
+     * objects.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @param {string} key The key of the property to inspect.
+     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
+     */
+    function customOmitClone(value) {
+      return isPlainObject(value) ? undefined : value;
+    }
+
+    /**
+     * A specialized version of `baseIsEqualDeep` for arrays with support for
+     * partial deep comparisons.
+     *
+     * @private
+     * @param {Array} array The array to compare.
+     * @param {Array} other The other array to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `array` and `other` objects.
+     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+     */
+    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+        arrLength = array.length,
+        othLength = other.length;
+
+      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+        return false;
+      }
+      // Check that cyclic values are equal.
+      var arrStacked = stack.get(array);
+      var othStacked = stack.get(other);
+      if (arrStacked && othStacked) {
+        return arrStacked == other && othStacked == array;
+      }
+      var index = -1,
+        result = true,
+        seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
+
+      stack.set(array, other);
+      stack.set(other, array);
+
+      // Ignore non-index properties.
+      while (++index < arrLength) {
+        var arrValue = array[index],
+          othValue = other[index];
+
+        if (customizer) {
+          var compared = isPartial ?
+            customizer(othValue, arrValue, index, other, array, stack) :
+            customizer(arrValue, othValue, index, array, other, stack);
+        }
+        if (compared !== undefined) {
+          if (compared) {
+            continue;
+          }
+          result = false;
+          break;
+        }
+        // Recursively compare arrays (susceptible to call stack limits).
+        if (seen) {
+          if (!arraySome(other, function(othValue, othIndex) {
+              if (!cacheHas(seen, othIndex) &&
+                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+                return seen.push(othIndex);
+              }
+            })) {
+            result = false;
+            break;
+          }
+        } else if (!(
+            arrValue === othValue ||
+            equalFunc(arrValue, othValue, bitmask, customizer, stack)
+          )) {
+          result = false;
+          break;
+        }
+      }
+      stack['delete'](array);
+      stack['delete'](other);
+      return result;
+    }
+
+    /**
+     * A specialized version of `baseIsEqualDeep` for comparing objects of
+     * the same `toStringTag`.
+     *
+     * **Note:** This function only supports comparing values with tags of
+     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {string} tag The `toStringTag` of the objects to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+      switch (tag) {
+        case dataViewTag:
+          if ((object.byteLength != other.byteLength) ||
+            (object.byteOffset != other.byteOffset)) {
+            return false;
+          }
+          object = object.buffer;
+          other = other.buffer;
+
+        case arrayBufferTag:
+          if ((object.byteLength != other.byteLength) ||
+            !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+            return false;
+          }
+          return true;
+
+        case boolTag:
+        case dateTag:
+        case numberTag:
+          // Coerce booleans to `1` or `0` and dates to milliseconds.
+          // Invalid dates are coerced to `NaN`.
+          return eq(+object, +other);
+
+        case errorTag:
+          return object.name == other.name && object.message == other.message;
+
+        case regexpTag:
+        case stringTag:
+          // Coerce regexes to strings and treat strings, primitives and objects,
+          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+          // for more details.
+          return object == (other + '');
+
+        case mapTag:
+          var convert = mapToArray;
+
+        case setTag:
+          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+          convert || (convert = setToArray);
+
+          if (object.size != other.size && !isPartial) {
+            return false;
+          }
+          // Assume cyclic values are equal.
+          var stacked = stack.get(object);
+          if (stacked) {
+            return stacked == other;
+          }
+          bitmask |= COMPARE_UNORDERED_FLAG;
+
+          // Recursively compare objects (susceptible to call stack limits).
+          stack.set(object, other);
+          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+          stack['delete'](object);
+          return result;
+
+        case symbolTag:
+          if (symbolValueOf) {
+            return symbolValueOf.call(object) == symbolValueOf.call(other);
+          }
+      }
+      return false;
+    }
+
+    /**
+     * A specialized version of `baseIsEqualDeep` for objects with support for
+     * partial deep comparisons.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+        objProps = getAllKeys(object),
+        objLength = objProps.length,
+        othProps = getAllKeys(other),
+        othLength = othProps.length;
+
+      if (objLength != othLength && !isPartial) {
+        return false;
+      }
+      var index = objLength;
+      while (index--) {
+        var key = objProps[index];
+        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+          return false;
+        }
+      }
+      // Check that cyclic values are equal.
+      var objStacked = stack.get(object);
+      var othStacked = stack.get(other);
+      if (objStacked && othStacked) {
+        return objStacked == other && othStacked == object;
+      }
+      var result = true;
+      stack.set(object, other);
+      stack.set(other, object);
+
+      var skipCtor = isPartial;
+      while (++index < objLength) {
+        key = objProps[index];
+        var objValue = object[key],
+          othValue = other[key];
+
+        if (customizer) {
+          var compared = isPartial ?
+            customizer(othValue, objValue, key, other, object, stack) :
+            customizer(objValue, othValue, key, object, other, stack);
+        }
+        // Recursively compare objects (susceptible to call stack limits).
+        if (!(compared === undefined ?
+            (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) :
+            compared
+          )) {
+          result = false;
+          break;
+        }
+        skipCtor || (skipCtor = key == 'constructor');
+      }
+      if (result && !skipCtor) {
+        var objCtor = object.constructor,
+          othCtor = other.constructor;
+
+        // Non `Object` object instances with different constructors are not equal.
+        if (objCtor != othCtor &&
+          ('constructor' in object && 'constructor' in other) &&
+          !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
+            typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+          result = false;
+        }
+      }
+      stack['delete'](object);
+      stack['delete'](other);
+      return result;
+    }
+
+    /**
+     * A specialized version of `baseRest` which flattens the rest array.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @returns {Function} Returns the new function.
+     */
+    function flatRest(func) {
+      return setToString(overRest(func, undefined, flatten), func + '');
+    }
+
+    /**
+     * Creates an array of own enumerable property names and symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function getAllKeys(object) {
+      return baseGetAllKeys(object, keys, getSymbols);
+    }
+
+    /**
+     * Creates an array of own and inherited enumerable property names and
+     * symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function getAllKeysIn(object) {
+      return baseGetAllKeys(object, keysIn, getSymbolsIn);
+    }
+
+    /**
+     * Gets metadata for `func`.
+     *
+     * @private
+     * @param {Function} func The function to query.
+     * @returns {*} Returns the metadata for `func`.
+     */
+    var getData = !metaMap ? noop : function(func) {
+      return metaMap.get(func);
+    };
+
+    /**
+     * Gets the name of `func`.
+     *
+     * @private
+     * @param {Function} func The function to query.
+     * @returns {string} Returns the function name.
+     */
+    function getFuncName(func) {
+      var result = (func.name + ''),
+        array = realNames[result],
+        length = hasOwnProperty.call(realNames, result) ? array.length : 0;
+
+      while (length--) {
+        var data = array[length],
+          otherFunc = data.func;
+        if (otherFunc == null || otherFunc == func) {
+          return data.name;
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Gets the argument placeholder value for `func`.
+     *
+     * @private
+     * @param {Function} func The function to inspect.
+     * @returns {*} Returns the placeholder value.
+     */
+    function getHolder(func) {
+      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
+      return object.placeholder;
+    }
+
+    /**
+     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
+     * this function returns the custom method, otherwise it returns `baseIteratee`.
+     * If arguments are provided, the chosen function is invoked with them and
+     * its result is returned.
+     *
+     * @private
+     * @param {*} [value] The value to convert to an iteratee.
+     * @param {number} [arity] The arity of the created iteratee.
+     * @returns {Function} Returns the chosen function or its result.
+     */
+    function getIteratee() {
+      var result = lodash.iteratee || iteratee;
+      result = result === iteratee ? baseIteratee : result;
+      return arguments.length ? result(arguments[0], arguments[1]) : result;
+    }
+
+    /**
+     * Gets the data for `map`.
+     *
+     * @private
+     * @param {Object} map The map to query.
+     * @param {string} key The reference key.
+     * @returns {*} Returns the map data.
+     */
+    function getMapData(map, key) {
+      var data = map.__data__;
+      return isKeyable(key) ?
+        data[typeof key == 'string' ? 'string' : 'hash'] :
+        data.map;
+    }
+
+    /**
+     * Gets the property names, values, and compare flags of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the match data of `object`.
+     */
+    function getMatchData(object) {
+      var result = keys(object),
+        length = result.length;
+
+      while (length--) {
+        var key = result[length],
+          value = object[key];
+
+        result[length] = [key, value, isStrictComparable(value)];
+      }
+      return result;
+    }
+
+    /**
+     * Gets the native function at `key` of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {string} key The key of the method to get.
+     * @returns {*} Returns the function if it's native, else `undefined`.
+     */
+    function getNative(object, key) {
+      var value = getValue(object, key);
+      return baseIsNative(value) ? value : undefined;
+    }
+
+    /**
+     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the raw `toStringTag`.
+     */
+    function getRawTag(value) {
+      var isOwn = hasOwnProperty.call(value, symToStringTag),
+        tag = value[symToStringTag];
+
+      try {
+        value[symToStringTag] = undefined;
+        var unmasked = true;
+      } catch (e) {}
+
+      var result = nativeObjectToString.call(value);
+      if (unmasked) {
+        if (isOwn) {
+          value[symToStringTag] = tag;
+        } else {
+          delete value[symToStringTag];
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Creates an array of the own enumerable symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of symbols.
+     */
+    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+      if (object == null) {
+        return [];
+      }
+      object = Object(object);
+      return arrayFilter(nativeGetSymbols(object), function(symbol) {
+        return propertyIsEnumerable.call(object, symbol);
+      });
+    };
+
+    /**
+     * Creates an array of the own and inherited enumerable symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of symbols.
+     */
+    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
+      var result = [];
+      while (object) {
+        arrayPush(result, getSymbols(object));
+        object = getPrototype(object);
+      }
+      return result;
+    };
+
+    /**
+     * Gets the `toStringTag` of `value`.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the `toStringTag`.
+     */
+    var getTag = baseGetTag;
+
+    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+      (Map && getTag(new Map) != mapTag) ||
+      (Promise && getTag(Promise.resolve()) != promiseTag) ||
+      (Set && getTag(new Set) != setTag) ||
+      (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+      getTag = function(value) {
+        var result = baseGetTag(value),
+          Ctor = result == objectTag ? value.constructor : undefined,
+          ctorString = Ctor ? toSource(Ctor) : '';
+
+        if (ctorString) {
+          switch (ctorString) {
+            case dataViewCtorString:
+              return dataViewTag;
+            case mapCtorString:
+              return mapTag;
+            case promiseCtorString:
+              return promiseTag;
+            case setCtorString:
+              return setTag;
+            case weakMapCtorString:
+              return weakMapTag;
+          }
+        }
+        return result;
+      };
+    }
+
+    /**
+     * Gets the view, applying any `transforms` to the `start` and `end` positions.
+     *
+     * @private
+     * @param {number} start The start of the view.
+     * @param {number} end The end of the view.
+     * @param {Array} transforms The transformations to apply to the view.
+     * @returns {Object} Returns an object containing the `start` and `end`
+     *  positions of the view.
+     */
+    function getView(start, end, transforms) {
+      var index = -1,
+        length = transforms.length;
+
+      while (++index < length) {
+        var data = transforms[index],
+          size = data.size;
+
+        switch (data.type) {
+          case 'drop':
+            start += size;
+            break;
+          case 'dropRight':
+            end -= size;
+            break;
+          case 'take':
+            end = nativeMin(end, start + size);
+            break;
+          case 'takeRight':
+            start = nativeMax(start, end - size);
+            break;
+        }
+      }
+      return {
+        'start': start,
+        'end': end
+      };
+    }
+
+    /**
+     * Extracts wrapper details from the `source` body comment.
+     *
+     * @private
+     * @param {string} source The source to inspect.
+     * @returns {Array} Returns the wrapper details.
+     */
+    function getWrapDetails(source) {
+      var match = source.match(reWrapDetails);
+      return match ? match[1].split(reSplitDetails) : [];
+    }
+
+    /**
+     * Checks if `path` exists on `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @param {Function} hasFunc The function to check properties.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     */
+    function hasPath(object, path, hasFunc) {
+      path = castPath(path, object);
+
+      var index = -1,
+        length = path.length,
+        result = false;
+
+      while (++index < length) {
+        var key = toKey(path[index]);
+        if (!(result = object != null && hasFunc(object, key))) {
+          break;
+        }
+        object = object[key];
+      }
+      if (result || ++index != length) {
+        return result;
+      }
+      length = object == null ? 0 : object.length;
+      return !!length && isLength(length) && isIndex(key, length) &&
+        (isArray(object) || isArguments(object));
+    }
+
+    /**
+     * Initializes an array clone.
+     *
+     * @private
+     * @param {Array} array The array to clone.
+     * @returns {Array} Returns the initialized clone.
+     */
+    function initCloneArray(array) {
+      var length = array.length,
+        result = new array.constructor(length);
+
+      // Add properties assigned by `RegExp#exec`.
+      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+        result.index = array.index;
+        result.input = array.input;
+      }
+      return result;
+    }
+
+    /**
+     * Initializes an object clone.
+     *
+     * @private
+     * @param {Object} object The object to clone.
+     * @returns {Object} Returns the initialized clone.
+     */
+    function initCloneObject(object) {
+      return (typeof object.constructor == 'function' && !isPrototype(object)) ?
+        baseCreate(getPrototype(object)) : {};
+    }
+
+    /**
+     * Initializes an object clone based on its `toStringTag`.
+     *
+     * **Note:** This function only supports cloning values with tags of
+     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
+     *
+     * @private
+     * @param {Object} object The object to clone.
+     * @param {string} tag The `toStringTag` of the object to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the initialized clone.
+     */
+    function initCloneByTag(object, tag, isDeep) {
+      var Ctor = object.constructor;
+      switch (tag) {
+        case arrayBufferTag:
+          return cloneArrayBuffer(object);
+
+        case boolTag:
+        case dateTag:
+          return new Ctor(+object);
+
+        case dataViewTag:
+          return cloneDataView(object, isDeep);
+
+        case float32Tag:
+        case float64Tag:
+        case int8Tag:
+        case int16Tag:
+        case int32Tag:
+        case uint8Tag:
+        case uint8ClampedTag:
+        case uint16Tag:
+        case uint32Tag:
+          return cloneTypedArray(object, isDeep);
+
+        case mapTag:
+          return new Ctor;
+
+        case numberTag:
+        case stringTag:
+          return new Ctor(object);
+
+        case regexpTag:
+          return cloneRegExp(object);
+
+        case setTag:
+          return new Ctor;
+
+        case symbolTag:
+          return cloneSymbol(object);
+      }
+    }
+
+    /**
+     * Inserts wrapper `details` in a comment at the top of the `source` body.
+     *
+     * @private
+     * @param {string} source The source to modify.
+     * @returns {Array} details The details to insert.
+     * @returns {string} Returns the modified source.
+     */
+    function insertWrapDetails(source, details) {
+      var length = details.length;
+      if (!length) {
+        return source;
+      }
+      var lastIndex = length - 1;
+      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+      details = details.join(length > 2 ? ', ' : ' ');
+      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+    }
+
+    /**
+     * Checks if `value` is a flattenable `arguments` object or array.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+     */
+    function isFlattenable(value) {
+      return isArray(value) || isArguments(value) ||
+        !!(spreadableSymbol && value && value[spreadableSymbol]);
+    }
+
+    /**
+     * Checks if `value` is a valid array-like index.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+     */
+    function isIndex(value, length) {
+      var type = typeof value;
+      length = length == null ? MAX_SAFE_INTEGER : length;
+
+      return !!length &&
+        (type == 'number' ||
+          (type != 'symbol' && reIsUint.test(value))) &&
+        (value > -1 && value % 1 == 0 && value < length);
+    }
+
+    /**
+     * Checks if the given arguments are from an iteratee call.
+     *
+     * @private
+     * @param {*} value The potential iteratee value argument.
+     * @param {*} index The potential iteratee index or key argument.
+     * @param {*} object The potential iteratee object argument.
+     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+     *  else `false`.
+     */
+    function isIterateeCall(value, index, object) {
+      if (!isObject(object)) {
+        return false;
+      }
+      var type = typeof index;
+      if (type == 'number' ?
+        (isArrayLike(object) && isIndex(index, object.length)) :
+        (type == 'string' && index in object)
+      ) {
+        return eq(object[index], value);
+      }
+      return false;
+    }
+
+    /**
+     * Checks if `value` is a property name and not a property path.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @param {Object} [object] The object to query keys on.
+     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+     */
+    function isKey(value, object) {
+      if (isArray(value)) {
+        return false;
+      }
+      var type = typeof value;
+      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
+        value == null || isSymbol(value)) {
+        return true;
+      }
+      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
+        (object != null && value in Object(object));
+    }
+
+    /**
+     * Checks if `value` is suitable for use as unique object key.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+     */
+    function isKeyable(value) {
+      var type = typeof value;
+      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ?
+        (value !== '__proto__') :
+        (value === null);
+    }
+
+    /**
+     * Checks if `func` has a lazy counterpart.
+     *
+     * @private
+     * @param {Function} func The function to check.
+     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
+     *  else `false`.
+     */
+    function isLaziable(func) {
+      var funcName = getFuncName(func),
+        other = lodash[funcName];
+
+      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
+        return false;
+      }
+      if (func === other) {
+        return true;
+      }
+      var data = getData(other);
+      return !!data && func === data[0];
+    }
+
+    /**
+     * Checks if `func` has its source masked.
+     *
+     * @private
+     * @param {Function} func The function to check.
+     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+     */
+    function isMasked(func) {
+      return !!maskSrcKey && (maskSrcKey in func);
+    }
+
+    /**
+     * Checks if `func` is capable of being masked.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
+     */
+    var isMaskable = coreJsData ? isFunction : stubFalse;
+
+    /**
+     * Checks if `value` is likely a prototype object.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+     */
+    function isPrototype(value) {
+      var Ctor = value && value.constructor,
+        proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+
+      return value === proto;
+    }
+
+    /**
+     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` if suitable for strict
+     *  equality comparisons, else `false`.
+     */
+    function isStrictComparable(value) {
+      return value === value && !isObject(value);
+    }
+
+    /**
+     * A specialized version of `matchesProperty` for source values suitable
+     * for strict equality comparisons, i.e. `===`.
+     *
+     * @private
+     * @param {string} key The key of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function matchesStrictComparable(key, srcValue) {
+      return function(object) {
+        if (object == null) {
+          return false;
+        }
+        return object[key] === srcValue &&
+          (srcValue !== undefined || (key in Object(object)));
+      };
+    }
+
+    /**
+     * A specialized version of `_.memoize` which clears the memoized function's
+     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+     *
+     * @private
+     * @param {Function} func The function to have its output memoized.
+     * @returns {Function} Returns the new memoized function.
+     */
+    function memoizeCapped(func) {
+      var result = memoize(func, function(key) {
+        if (cache.size === MAX_MEMOIZE_SIZE) {
+          cache.clear();
+        }
+        return key;
+      });
+
+      var cache = result.cache;
+      return result;
+    }
+
+    /**
+     * Merges the function metadata of `source` into `data`.
+     *
+     * Merging metadata reduces the number of wrappers used to invoke a function.
+     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+     * may be applied regardless of execution order. Methods like `_.ary` and
+     * `_.rearg` modify function arguments, making the order in which they are
+     * executed important, preventing the merging of metadata. However, we make
+     * an exception for a safe combined case where curried functions have `_.ary`
+     * and or `_.rearg` applied.
+     *
+     * @private
+     * @param {Array} data The destination metadata.
+     * @param {Array} source The source metadata.
+     * @returns {Array} Returns `data`.
+     */
+    function mergeData(data, source) {
+      var bitmask = data[1],
+        srcBitmask = source[1],
+        newBitmask = bitmask | srcBitmask,
+        isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
+
+      var isCombo =
+        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
+        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
+        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
+
+      // Exit early if metadata can't be merged.
+      if (!(isCommon || isCombo)) {
+        return data;
+      }
+      // Use source `thisArg` if available.
+      if (srcBitmask & WRAP_BIND_FLAG) {
+        data[2] = source[2];
+        // Set when currying a bound function.
+        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
+      }
+      // Compose partial arguments.
+      var value = source[3];
+      if (value) {
+        var partials = data[3];
+        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
+        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
+      }
+      // Compose partial right arguments.
+      value = source[5];
+      if (value) {
+        partials = data[5];
+        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
+        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
+      }
+      // Use source `argPos` if available.
+      value = source[7];
+      if (value) {
+        data[7] = value;
+      }
+      // Use source `ary` if it's smaller.
+      if (srcBitmask & WRAP_ARY_FLAG) {
+        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+      }
+      // Use source `arity` if one is not provided.
+      if (data[9] == null) {
+        data[9] = source[9];
+      }
+      // Use source `func` and merge bitmasks.
+      data[0] = source[0];
+      data[1] = newBitmask;
+
+      return data;
+    }
+
+    /**
+     * This function is like
+     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+     * except that it includes inherited enumerable properties.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function nativeKeysIn(object) {
+      var result = [];
+      if (object != null) {
+        for (var key in Object(object)) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Converts `value` to a string using `Object.prototype.toString`.
+     *
+     * @private
+     * @param {*} value The value to convert.
+     * @returns {string} Returns the converted string.
+     */
+    function objectToString(value) {
+      return nativeObjectToString.call(value);
+    }
+
+    /**
+     * A specialized version of `baseRest` which transforms the rest array.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @param {Function} transform The rest array transform.
+     * @returns {Function} Returns the new function.
+     */
+    function overRest(func, start, transform) {
+      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+      return function() {
+        var args = arguments,
+          index = -1,
+          length = nativeMax(args.length - start, 0),
+          array = Array(length);
+
+        while (++index < length) {
+          array[index] = args[start + index];
+        }
+        index = -1;
+        var otherArgs = Array(start + 1);
+        while (++index < start) {
+          otherArgs[index] = args[index];
+        }
+        otherArgs[start] = transform(array);
+        return apply(func, this, otherArgs);
+      };
+    }
+
+    /**
+     * Gets the parent value at `path` of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array} path The path to get the parent value of.
+     * @returns {*} Returns the parent value.
+     */
+    function parent(object, path) {
+      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
+    }
+
+    /**
+     * Reorder `array` according to the specified indexes where the element at
+     * the first index is assigned as the first element, the element at
+     * the second index is assigned as the second element, and so on.
+     *
+     * @private
+     * @param {Array} array The array to reorder.
+     * @param {Array} indexes The arranged array indexes.
+     * @returns {Array} Returns `array`.
+     */
+    function reorder(array, indexes) {
+      var arrLength = array.length,
+        length = nativeMin(indexes.length, arrLength),
+        oldArray = copyArray(array);
+
+      while (length--) {
+        var index = indexes[length];
+        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
+      }
+      return array;
+    }
+
+    /**
+     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {string} key The key of the property to get.
+     * @returns {*} Returns the property value.
+     */
+    function safeGet(object, key) {
+      if (key === 'constructor' && typeof object[key] === 'function') {
+        return;
+      }
+
+      if (key == '__proto__') {
+        return;
+      }
+
+      return object[key];
+    }
+
+    /**
+     * Sets metadata for `func`.
+     *
+     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+     * period of time, it will trip its breaker and transition to an identity
+     * function to avoid garbage collection pauses in V8. See
+     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
+     * for more details.
+     *
+     * @private
+     * @param {Function} func The function to associate metadata with.
+     * @param {*} data The metadata.
+     * @returns {Function} Returns `func`.
+     */
+    var setData = shortOut(baseSetData);
+
+    /**
+     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
+     *
+     * @private
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @returns {number|Object} Returns the timer id or timeout object.
+     */
+    var setTimeout = ctxSetTimeout || function(func, wait) {
+      return root.setTimeout(func, wait);
+    };
+
+    /**
+     * Sets the `toString` method of `func` to return `string`.
+     *
+     * @private
+     * @param {Function} func The function to modify.
+     * @param {Function} string The `toString` result.
+     * @returns {Function} Returns `func`.
+     */
+    var setToString = shortOut(baseSetToString);
+
+    /**
+     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+     * with wrapper details in a comment at the top of the source body.
+     *
+     * @private
+     * @param {Function} wrapper The function to modify.
+     * @param {Function} reference The reference function.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @returns {Function} Returns `wrapper`.
+     */
+    function setWrapToString(wrapper, reference, bitmask) {
+      var source = (reference + '');
+      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
+    }
+
+    /**
+     * Creates a function that'll short out and invoke `identity` instead
+     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+     * milliseconds.
+     *
+     * @private
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new shortable function.
+     */
+    function shortOut(func) {
+      var count = 0,
+        lastCalled = 0;
+
+      return function() {
+        var stamp = nativeNow(),
+          remaining = HOT_SPAN - (stamp - lastCalled);
+
+        lastCalled = stamp;
+        if (remaining > 0) {
+          if (++count >= HOT_COUNT) {
+            return arguments[0];
+          }
+        } else {
+          count = 0;
+        }
+        return func.apply(undefined, arguments);
+      };
+    }
+
+    /**
+     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
+     *
+     * @private
+     * @param {Array} array The array to shuffle.
+     * @param {number} [size=array.length] The size of `array`.
+     * @returns {Array} Returns `array`.
+     */
+    function shuffleSelf(array, size) {
+      var index = -1,
+        length = array.length,
+        lastIndex = length - 1;
+
+      size = size === undefined ? length : size;
+      while (++index < size) {
+        var rand = baseRandom(index, lastIndex),
+          value = array[rand];
+
+        array[rand] = array[index];
+        array[index] = value;
+      }
+      array.length = size;
+      return array;
+    }
+
+    /**
+     * Converts `string` to a property path array.
+     *
+     * @private
+     * @param {string} string The string to convert.
+     * @returns {Array} Returns the property path array.
+     */
+    var stringToPath = memoizeCapped(function(string) {
+      var result = [];
+      if (string.charCodeAt(0) === 46 /* . */ ) {
+        result.push('');
+      }
+      string.replace(rePropName, function(match, number, quote, subString) {
+        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
+      });
+      return result;
+    });
+
+    /**
+     * Converts `value` to a string key if it's not a string or symbol.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {string|symbol} Returns the key.
+     */
+    function toKey(value) {
+      if (typeof value == 'string' || isSymbol(value)) {
+        return value;
+      }
+      var result = (value + '');
+      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+    }
+
+    /**
+     * Converts `func` to its source code.
+     *
+     * @private
+     * @param {Function} func The function to convert.
+     * @returns {string} Returns the source code.
+     */
+    function toSource(func) {
+      if (func != null) {
+        try {
+          return funcToString.call(func);
+        } catch (e) {}
+        try {
+          return (func + '');
+        } catch (e) {}
+      }
+      return '';
+    }
+
+    /**
+     * Updates wrapper `details` based on `bitmask` flags.
+     *
+     * @private
+     * @returns {Array} details The details to modify.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @returns {Array} Returns `details`.
+     */
+    function updateWrapDetails(details, bitmask) {
+      arrayEach(wrapFlags, function(pair) {
+        var value = '_.' + pair[0];
+        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
+          details.push(value);
+        }
+      });
+      return details.sort();
+    }
+
+    /**
+     * Creates a clone of `wrapper`.
+     *
+     * @private
+     * @param {Object} wrapper The wrapper to clone.
+     * @returns {Object} Returns the cloned wrapper.
+     */
+    function wrapperClone(wrapper) {
+      if (wrapper instanceof LazyWrapper) {
+        return wrapper.clone();
+      }
+      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
+      result.__actions__ = copyArray(wrapper.__actions__);
+      result.__index__ = wrapper.__index__;
+      result.__values__ = wrapper.__values__;
+      return result;
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates an array of elements split into groups the length of `size`.
+     * If `array` can't be split evenly, the final chunk will be the remaining
+     * elements.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to process.
+     * @param {number} [size=1] The length of each chunk
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the new array of chunks.
+     * @example
+     *
+     * _.chunk(['a', 'b', 'c', 'd'], 2);
+     * // => [['a', 'b'], ['c', 'd']]
+     *
+     * _.chunk(['a', 'b', 'c', 'd'], 3);
+     * // => [['a', 'b', 'c'], ['d']]
+     */
+    function chunk(array, size, guard) {
+      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
+        size = 1;
+      } else {
+        size = nativeMax(toInteger(size), 0);
+      }
+      var length = array == null ? 0 : array.length;
+      if (!length || size < 1) {
+        return [];
+      }
+      var index = 0,
+        resIndex = 0,
+        result = Array(nativeCeil(length / size));
+
+      while (index < length) {
+        result[resIndex++] = baseSlice(array, index, (index += size));
+      }
+      return result;
+    }
+
+    /**
+     * Creates an array with all falsey values removed. The values `false`, `null`,
+     * `0`, `""`, `undefined`, and `NaN` are falsey.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to compact.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.compact([0, 1, false, 2, '', 3]);
+     * // => [1, 2, 3]
+     */
+    function compact(array) {
+      var index = -1,
+        length = array == null ? 0 : array.length,
+        resIndex = 0,
+        result = [];
+
+      while (++index < length) {
+        var value = array[index];
+        if (value) {
+          result[resIndex++] = value;
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Creates a new array concatenating `array` with any additional arrays
+     * and/or values.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to concatenate.
+     * @param {...*} [values] The values to concatenate.
+     * @returns {Array} Returns the new concatenated array.
+     * @example
+     *
+     * var array = [1];
+     * var other = _.concat(array, 2, [3], [[4]]);
+     *
+     * console.log(other);
+     * // => [1, 2, 3, [4]]
+     *
+     * console.log(array);
+     * // => [1]
+     */
+    function concat() {
+      var length = arguments.length;
+      if (!length) {
+        return [];
+      }
+      var args = Array(length - 1),
+        array = arguments[0],
+        index = length;
+
+      while (index--) {
+        args[index - 1] = arguments[index];
+      }
+      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
+    }
+
+    /**
+     * Creates an array of `array` values not included in the other given arrays
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. The order and references of result values are
+     * determined by the first array.
+     *
+     * **Note:** Unlike `_.pullAll`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.without, _.xor
+     * @example
+     *
+     * _.difference([2, 1], [2, 3]);
+     * // => [1]
+     */
+    var difference = baseRest(function(array, values) {
+      return isArrayLikeObject(array) ?
+        baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : [];
+    });
+
+    /**
+     * This method is like `_.difference` except that it accepts `iteratee` which
+     * is invoked for each element of `array` and `values` to generate the criterion
+     * by which they're compared. The order and references of result values are
+     * determined by the first array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
+     * // => [{ 'x': 2 }]
+     */
+    var differenceBy = baseRest(function(array, values) {
+      var iteratee = last(values);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return isArrayLikeObject(array) ?
+        baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) : [];
+    });
+
+    /**
+     * This method is like `_.difference` except that it accepts `comparator`
+     * which is invoked to compare elements of `array` to `values`. The order and
+     * references of result values are determined by the first array. The comparator
+     * is invoked with two arguments: (arrVal, othVal).
+     *
+     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     *
+     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+     * // => [{ 'x': 2, 'y': 1 }]
+     */
+    var differenceWith = baseRest(function(array, values) {
+      var comparator = last(values);
+      if (isArrayLikeObject(comparator)) {
+        comparator = undefined;
+      }
+      return isArrayLikeObject(array) ?
+        baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) : [];
+    });
+
+    /**
+     * Creates a slice of `array` with `n` elements dropped from the beginning.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to drop.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.drop([1, 2, 3]);
+     * // => [2, 3]
+     *
+     * _.drop([1, 2, 3], 2);
+     * // => [3]
+     *
+     * _.drop([1, 2, 3], 5);
+     * // => []
+     *
+     * _.drop([1, 2, 3], 0);
+     * // => [1, 2, 3]
+     */
+    function drop(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      return baseSlice(array, n < 0 ? 0 : n, length);
+    }
+
+    /**
+     * Creates a slice of `array` with `n` elements dropped from the end.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to drop.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.dropRight([1, 2, 3]);
+     * // => [1, 2]
+     *
+     * _.dropRight([1, 2, 3], 2);
+     * // => [1]
+     *
+     * _.dropRight([1, 2, 3], 5);
+     * // => []
+     *
+     * _.dropRight([1, 2, 3], 0);
+     * // => [1, 2, 3]
+     */
+    function dropRight(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      n = length - n;
+      return baseSlice(array, 0, n < 0 ? 0 : n);
+    }
+
+    /**
+     * Creates a slice of `array` excluding elements dropped from the end.
+     * Elements are dropped until `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.dropRightWhile(users, function(o) { return !o.active; });
+     * // => objects for ['barney']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.dropRightWhile(users, ['active', false]);
+     * // => objects for ['barney']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.dropRightWhile(users, 'active');
+     * // => objects for ['barney', 'fred', 'pebbles']
+     */
+    function dropRightWhile(array, predicate) {
+      return (array && array.length) ?
+        baseWhile(array, getIteratee(predicate, 3), true, true) : [];
+    }
+
+    /**
+     * Creates a slice of `array` excluding elements dropped from the beginning.
+     * Elements are dropped until `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.dropWhile(users, function(o) { return !o.active; });
+     * // => objects for ['pebbles']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.dropWhile(users, { 'user': 'barney', 'active': false });
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.dropWhile(users, ['active', false]);
+     * // => objects for ['pebbles']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.dropWhile(users, 'active');
+     * // => objects for ['barney', 'fred', 'pebbles']
+     */
+    function dropWhile(array, predicate) {
+      return (array && array.length) ?
+        baseWhile(array, getIteratee(predicate, 3), true) : [];
+    }
+
+    /**
+     * Fills elements of `array` with `value` from `start` up to, but not
+     * including, `end`.
+     *
+     * **Note:** This method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Array
+     * @param {Array} array The array to fill.
+     * @param {*} value The value to fill `array` with.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _.fill(array, 'a');
+     * console.log(array);
+     * // => ['a', 'a', 'a']
+     *
+     * _.fill(Array(3), 2);
+     * // => [2, 2, 2]
+     *
+     * _.fill([4, 6, 8, 10], '*', 1, 3);
+     * // => [4, '*', '*', 10]
+     */
+    function fill(array, value, start, end) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
+        start = 0;
+        end = length;
+      }
+      return baseFill(array, value, start, end);
+    }
+
+    /**
+     * This method is like `_.find` except that it returns the index of the first
+     * element `predicate` returns truthy for instead of the element itself.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {number} Returns the index of the found element, else `-1`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.findIndex(users, function(o) { return o.user == 'barney'; });
+     * // => 0
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findIndex(users, { 'user': 'fred', 'active': false });
+     * // => 1
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findIndex(users, ['active', false]);
+     * // => 0
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findIndex(users, 'active');
+     * // => 2
+     */
+    function findIndex(array, predicate, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = fromIndex == null ? 0 : toInteger(fromIndex);
+      if (index < 0) {
+        index = nativeMax(length + index, 0);
+      }
+      return baseFindIndex(array, getIteratee(predicate, 3), index);
+    }
+
+    /**
+     * This method is like `_.findIndex` except that it iterates over elements
+     * of `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=array.length-1] The index to search from.
+     * @returns {number} Returns the index of the found element, else `-1`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
+     * // => 2
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+     * // => 0
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findLastIndex(users, ['active', false]);
+     * // => 2
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findLastIndex(users, 'active');
+     * // => 0
+     */
+    function findLastIndex(array, predicate, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = length - 1;
+      if (fromIndex !== undefined) {
+        index = toInteger(fromIndex);
+        index = fromIndex < 0 ?
+          nativeMax(length + index, 0) :
+          nativeMin(index, length - 1);
+      }
+      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
+    }
+
+    /**
+     * Flattens `array` a single level deep.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * _.flatten([1, [2, [3, [4]], 5]]);
+     * // => [1, 2, [3, [4]], 5]
+     */
+    function flatten(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseFlatten(array, 1) : [];
+    }
+
+    /**
+     * Recursively flattens `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * _.flattenDeep([1, [2, [3, [4]], 5]]);
+     * // => [1, 2, 3, 4, 5]
+     */
+    function flattenDeep(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseFlatten(array, INFINITY) : [];
+    }
+
+    /**
+     * Recursively flatten `array` up to `depth` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.4.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @param {number} [depth=1] The maximum recursion depth.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * var array = [1, [2, [3, [4]], 5]];
+     *
+     * _.flattenDepth(array, 1);
+     * // => [1, 2, [3, [4]], 5]
+     *
+     * _.flattenDepth(array, 2);
+     * // => [1, 2, 3, [4], 5]
+     */
+    function flattenDepth(array, depth) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      depth = depth === undefined ? 1 : toInteger(depth);
+      return baseFlatten(array, depth);
+    }
+
+    /**
+     * The inverse of `_.toPairs`; this method returns an object composed
+     * from key-value `pairs`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} pairs The key-value pairs.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.fromPairs([['a', 1], ['b', 2]]);
+     * // => { 'a': 1, 'b': 2 }
+     */
+    function fromPairs(pairs) {
+      var index = -1,
+        length = pairs == null ? 0 : pairs.length,
+        result = {};
+
+      while (++index < length) {
+        var pair = pairs[index];
+        result[pair[0]] = pair[1];
+      }
+      return result;
+    }
+
+    /**
+     * Gets the first element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @alias first
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {*} Returns the first element of `array`.
+     * @example
+     *
+     * _.head([1, 2, 3]);
+     * // => 1
+     *
+     * _.head([]);
+     * // => undefined
+     */
+    function head(array) {
+      return (array && array.length) ? array[0] : undefined;
+    }
+
+    /**
+     * Gets the index at which the first occurrence of `value` is found in `array`
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. If `fromIndex` is negative, it's used as the
+     * offset from the end of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.indexOf([1, 2, 1, 2], 2);
+     * // => 1
+     *
+     * // Search from the `fromIndex`.
+     * _.indexOf([1, 2, 1, 2], 2, 2);
+     * // => 3
+     */
+    function indexOf(array, value, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = fromIndex == null ? 0 : toInteger(fromIndex);
+      if (index < 0) {
+        index = nativeMax(length + index, 0);
+      }
+      return baseIndexOf(array, value, index);
+    }
+
+    /**
+     * Gets all but the last element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.initial([1, 2, 3]);
+     * // => [1, 2]
+     */
+    function initial(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseSlice(array, 0, -1) : [];
+    }
+
+    /**
+     * Creates an array of unique values that are included in all given arrays
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. The order and references of result values are
+     * determined by the first array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * _.intersection([2, 1], [2, 3]);
+     * // => [2]
+     */
+    var intersection = baseRest(function(arrays) {
+      var mapped = arrayMap(arrays, castArrayLikeObject);
+      return (mapped.length && mapped[0] === arrays[0]) ?
+        baseIntersection(mapped) : [];
+    });
+
+    /**
+     * This method is like `_.intersection` except that it accepts `iteratee`
+     * which is invoked for each element of each `arrays` to generate the criterion
+     * by which they're compared. The order and references of result values are
+     * determined by the first array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [2.1]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }]
+     */
+    var intersectionBy = baseRest(function(arrays) {
+      var iteratee = last(arrays),
+        mapped = arrayMap(arrays, castArrayLikeObject);
+
+      if (iteratee === last(mapped)) {
+        iteratee = undefined;
+      } else {
+        mapped.pop();
+      }
+      return (mapped.length && mapped[0] === arrays[0]) ?
+        baseIntersection(mapped, getIteratee(iteratee, 2)) : [];
+    });
+
+    /**
+     * This method is like `_.intersection` except that it accepts `comparator`
+     * which is invoked to compare elements of `arrays`. The order and references
+     * of result values are determined by the first array. The comparator is
+     * invoked with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.intersectionWith(objects, others, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }]
+     */
+    var intersectionWith = baseRest(function(arrays) {
+      var comparator = last(arrays),
+        mapped = arrayMap(arrays, castArrayLikeObject);
+
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      if (comparator) {
+        mapped.pop();
+      }
+      return (mapped.length && mapped[0] === arrays[0]) ?
+        baseIntersection(mapped, undefined, comparator) : [];
+    });
+
+    /**
+     * Converts all elements in `array` into a string separated by `separator`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to convert.
+     * @param {string} [separator=','] The element separator.
+     * @returns {string} Returns the joined string.
+     * @example
+     *
+     * _.join(['a', 'b', 'c'], '~');
+     * // => 'a~b~c'
+     */
+    function join(array, separator) {
+      return array == null ? '' : nativeJoin.call(array, separator);
+    }
+
+    /**
+     * Gets the last element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {*} Returns the last element of `array`.
+     * @example
+     *
+     * _.last([1, 2, 3]);
+     * // => 3
+     */
+    function last(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? array[length - 1] : undefined;
+    }
+
+    /**
+     * This method is like `_.indexOf` except that it iterates over elements of
+     * `array` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=array.length-1] The index to search from.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.lastIndexOf([1, 2, 1, 2], 2);
+     * // => 3
+     *
+     * // Search from the `fromIndex`.
+     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+     * // => 1
+     */
+    function lastIndexOf(array, value, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = length;
+      if (fromIndex !== undefined) {
+        index = toInteger(fromIndex);
+        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
+      }
+      return value === value ?
+        strictLastIndexOf(array, value, index) :
+        baseFindIndex(array, baseIsNaN, index, true);
+    }
+
+    /**
+     * Gets the element at index `n` of `array`. If `n` is negative, the nth
+     * element from the end is returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.11.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=0] The index of the element to return.
+     * @returns {*} Returns the nth element of `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'd'];
+     *
+     * _.nth(array, 1);
+     * // => 'b'
+     *
+     * _.nth(array, -2);
+     * // => 'c';
+     */
+    function nth(array, n) {
+      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
+    }
+
+    /**
+     * Removes all given values from `array` using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+     * to remove elements from an array by predicate.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {...*} [values] The values to remove.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+     *
+     * _.pull(array, 'a', 'c');
+     * console.log(array);
+     * // => ['b', 'b']
+     */
+    var pull = baseRest(pullAll);
+
+    /**
+     * This method is like `_.pull` except that it accepts an array of values to remove.
+     *
+     * **Note:** Unlike `_.difference`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+     *
+     * _.pullAll(array, ['a', 'c']);
+     * console.log(array);
+     * // => ['b', 'b']
+     */
+    function pullAll(array, values) {
+      return (array && array.length && values && values.length) ?
+        basePullAll(array, values) :
+        array;
+    }
+
+    /**
+     * This method is like `_.pullAll` except that it accepts `iteratee` which is
+     * invoked for each element of `array` and `values` to generate the criterion
+     * by which they're compared. The iteratee is invoked with one argument: (value).
+     *
+     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+     *
+     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+     * console.log(array);
+     * // => [{ 'x': 2 }]
+     */
+    function pullAllBy(array, values, iteratee) {
+      return (array && array.length && values && values.length) ?
+        basePullAll(array, values, getIteratee(iteratee, 2)) :
+        array;
+    }
+
+    /**
+     * This method is like `_.pullAll` except that it accepts `comparator` which
+     * is invoked to compare elements of `array` to `values`. The comparator is
+     * invoked with two arguments: (arrVal, othVal).
+     *
+     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+     *
+     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+     * console.log(array);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+     */
+    function pullAllWith(array, values, comparator) {
+      return (array && array.length && values && values.length) ?
+        basePullAll(array, values, undefined, comparator) :
+        array;
+    }
+
+    /**
+     * Removes elements from `array` corresponding to `indexes` and returns an
+     * array of removed elements.
+     *
+     * **Note:** Unlike `_.at`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
+     * @returns {Array} Returns the new array of removed elements.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'd'];
+     * var pulled = _.pullAt(array, [1, 3]);
+     *
+     * console.log(array);
+     * // => ['a', 'c']
+     *
+     * console.log(pulled);
+     * // => ['b', 'd']
+     */
+    var pullAt = flatRest(function(array, indexes) {
+      var length = array == null ? 0 : array.length,
+        result = baseAt(array, indexes);
+
+      basePullAt(array, arrayMap(indexes, function(index) {
+        return isIndex(index, length) ? +index : index;
+      }).sort(compareAscending));
+
+      return result;
+    });
+
+    /**
+     * Removes all elements from `array` that `predicate` returns truthy for
+     * and returns an array of the removed elements. The predicate is invoked
+     * with three arguments: (value, index, array).
+     *
+     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+     * to pull elements from an array by value.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new array of removed elements.
+     * @example
+     *
+     * var array = [1, 2, 3, 4];
+     * var evens = _.remove(array, function(n) {
+     *   return n % 2 == 0;
+     * });
+     *
+     * console.log(array);
+     * // => [1, 3]
+     *
+     * console.log(evens);
+     * // => [2, 4]
+     */
+    function remove(array, predicate) {
+      var result = [];
+      if (!(array && array.length)) {
+        return result;
+      }
+      var index = -1,
+        indexes = [],
+        length = array.length;
+
+      predicate = getIteratee(predicate, 3);
+      while (++index < length) {
+        var value = array[index];
+        if (predicate(value, index, array)) {
+          result.push(value);
+          indexes.push(index);
+        }
+      }
+      basePullAt(array, indexes);
+      return result;
+    }
+
+    /**
+     * Reverses `array` so that the first element becomes the last, the second
+     * element becomes the second to last, and so on.
+     *
+     * **Note:** This method mutates `array` and is based on
+     * [`Array#reverse`](https://mdn.io/Array/reverse).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _.reverse(array);
+     * // => [3, 2, 1]
+     *
+     * console.log(array);
+     * // => [3, 2, 1]
+     */
+    function reverse(array) {
+      return array == null ? array : nativeReverse.call(array);
+    }
+
+    /**
+     * Creates a slice of `array` from `start` up to, but not including, `end`.
+     *
+     * **Note:** This method is used instead of
+     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
+     * returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to slice.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function slice(array, start, end) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
+        start = 0;
+        end = length;
+      } else {
+        start = start == null ? 0 : toInteger(start);
+        end = end === undefined ? length : toInteger(end);
+      }
+      return baseSlice(array, start, end);
+    }
+
+    /**
+     * Uses a binary search to determine the lowest index at which `value`
+     * should be inserted into `array` in order to maintain its sort order.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * _.sortedIndex([30, 50], 40);
+     * // => 1
+     */
+    function sortedIndex(array, value) {
+      return baseSortedIndex(array, value);
+    }
+
+    /**
+     * This method is like `_.sortedIndex` except that it accepts `iteratee`
+     * which is invoked for `value` and each element of `array` to compute their
+     * sort ranking. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * var objects = [{ 'x': 4 }, { 'x': 5 }];
+     *
+     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+     * // => 0
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
+     * // => 0
+     */
+    function sortedIndexBy(array, value, iteratee) {
+      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
+    }
+
+    /**
+     * This method is like `_.indexOf` except that it performs a binary
+     * search on a sorted `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
+     * // => 1
+     */
+    function sortedIndexOf(array, value) {
+      var length = array == null ? 0 : array.length;
+      if (length) {
+        var index = baseSortedIndex(array, value);
+        if (index < length && eq(array[index], value)) {
+          return index;
+        }
+      }
+      return -1;
+    }
+
+    /**
+     * This method is like `_.sortedIndex` except that it returns the highest
+     * index at which `value` should be inserted into `array` in order to
+     * maintain its sort order.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
+     * // => 4
+     */
+    function sortedLastIndex(array, value) {
+      return baseSortedIndex(array, value, true);
+    }
+
+    /**
+     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+     * which is invoked for `value` and each element of `array` to compute their
+     * sort ranking. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * var objects = [{ 'x': 4 }, { 'x': 5 }];
+     *
+     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+     * // => 1
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
+     * // => 1
+     */
+    function sortedLastIndexBy(array, value, iteratee) {
+      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
+    }
+
+    /**
+     * This method is like `_.lastIndexOf` except that it performs a binary
+     * search on a sorted `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
+     * // => 3
+     */
+    function sortedLastIndexOf(array, value) {
+      var length = array == null ? 0 : array.length;
+      if (length) {
+        var index = baseSortedIndex(array, value, true) - 1;
+        if (eq(array[index], value)) {
+          return index;
+        }
+      }
+      return -1;
+    }
+
+    /**
+     * This method is like `_.uniq` except that it's designed and optimized
+     * for sorted arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.sortedUniq([1, 1, 2]);
+     * // => [1, 2]
+     */
+    function sortedUniq(array) {
+      return (array && array.length) ?
+        baseSortedUniq(array) : [];
+    }
+
+    /**
+     * This method is like `_.uniqBy` except that it's designed and optimized
+     * for sorted arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+     * // => [1.1, 2.3]
+     */
+    function sortedUniqBy(array, iteratee) {
+      return (array && array.length) ?
+        baseSortedUniq(array, getIteratee(iteratee, 2)) : [];
+    }
+
+    /**
+     * Gets all but the first element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.tail([1, 2, 3]);
+     * // => [2, 3]
+     */
+    function tail(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseSlice(array, 1, length) : [];
+    }
+
+    /**
+     * Creates a slice of `array` with `n` elements taken from the beginning.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to take.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.take([1, 2, 3]);
+     * // => [1]
+     *
+     * _.take([1, 2, 3], 2);
+     * // => [1, 2]
+     *
+     * _.take([1, 2, 3], 5);
+     * // => [1, 2, 3]
+     *
+     * _.take([1, 2, 3], 0);
+     * // => []
+     */
+    function take(array, n, guard) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      return baseSlice(array, 0, n < 0 ? 0 : n);
+    }
+
+    /**
+     * Creates a slice of `array` with `n` elements taken from the end.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to take.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.takeRight([1, 2, 3]);
+     * // => [3]
+     *
+     * _.takeRight([1, 2, 3], 2);
+     * // => [2, 3]
+     *
+     * _.takeRight([1, 2, 3], 5);
+     * // => [1, 2, 3]
+     *
+     * _.takeRight([1, 2, 3], 0);
+     * // => []
+     */
+    function takeRight(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      n = length - n;
+      return baseSlice(array, n < 0 ? 0 : n, length);
+    }
+
+    /**
+     * Creates a slice of `array` with elements taken from the end. Elements are
+     * taken until `predicate` returns falsey. The predicate is invoked with
+     * three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.takeRightWhile(users, function(o) { return !o.active; });
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
+     * // => objects for ['pebbles']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.takeRightWhile(users, ['active', false]);
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.takeRightWhile(users, 'active');
+     * // => []
+     */
+    function takeRightWhile(array, predicate) {
+      return (array && array.length) ?
+        baseWhile(array, getIteratee(predicate, 3), false, true) : [];
+    }
+
+    /**
+     * Creates a slice of `array` with elements taken from the beginning. Elements
+     * are taken until `predicate` returns falsey. The predicate is invoked with
+     * three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.takeWhile(users, function(o) { return !o.active; });
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.takeWhile(users, { 'user': 'barney', 'active': false });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.takeWhile(users, ['active', false]);
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.takeWhile(users, 'active');
+     * // => []
+     */
+    function takeWhile(array, predicate) {
+      return (array && array.length) ?
+        baseWhile(array, getIteratee(predicate, 3)) : [];
+    }
+
+    /**
+     * Creates an array of unique values, in order, from all given arrays using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * _.union([2], [1, 2]);
+     * // => [2, 1]
+     */
+    var union = baseRest(function(arrays) {
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+    });
+
+    /**
+     * This method is like `_.union` except that it accepts `iteratee` which is
+     * invoked for each element of each `arrays` to generate the criterion by
+     * which uniqueness is computed. Result values are chosen from the first
+     * array in which the value occurs. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
+     * // => [2.1, 1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }, { 'x': 2 }]
+     */
+    var unionBy = baseRest(function(arrays) {
+      var iteratee = last(arrays);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
+    });
+
+    /**
+     * This method is like `_.union` except that it accepts `comparator` which
+     * is invoked to compare elements of `arrays`. Result values are chosen from
+     * the first array in which the value occurs. The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.unionWith(objects, others, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+     */
+    var unionWith = baseRest(function(arrays) {
+      var comparator = last(arrays);
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
+    });
+
+    /**
+     * Creates a duplicate-free version of an array, using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons, in which only the first occurrence of each element
+     * is kept. The order of result values is determined by the order they occur
+     * in the array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.uniq([2, 1, 2]);
+     * // => [2, 1]
+     */
+    function uniq(array) {
+      return (array && array.length) ? baseUniq(array) : [];
+    }
+
+    /**
+     * This method is like `_.uniq` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * uniqueness is computed. The order of result values is determined by the
+     * order they occur in the array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+     * // => [2.1, 1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }, { 'x': 2 }]
+     */
+    function uniqBy(array, iteratee) {
+      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
+    }
+
+    /**
+     * This method is like `_.uniq` except that it accepts `comparator` which
+     * is invoked to compare elements of `array`. The order of result values is
+     * determined by the order they occur in the array.The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.uniqWith(objects, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+     */
+    function uniqWith(array, comparator) {
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
+    }
+
+    /**
+     * This method is like `_.zip` except that it accepts an array of grouped
+     * elements and creates an array regrouping the elements to their pre-zip
+     * configuration.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.2.0
+     * @category Array
+     * @param {Array} array The array of grouped elements to process.
+     * @returns {Array} Returns the new array of regrouped elements.
+     * @example
+     *
+     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+     * // => [['a', 1, true], ['b', 2, false]]
+     *
+     * _.unzip(zipped);
+     * // => [['a', 'b'], [1, 2], [true, false]]
+     */
+    function unzip(array) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      var length = 0;
+      array = arrayFilter(array, function(group) {
+        if (isArrayLikeObject(group)) {
+          length = nativeMax(group.length, length);
+          return true;
+        }
+      });
+      return baseTimes(length, function(index) {
+        return arrayMap(array, baseProperty(index));
+      });
+    }
+
+    /**
+     * This method is like `_.unzip` except that it accepts `iteratee` to specify
+     * how regrouped values should be combined. The iteratee is invoked with the
+     * elements of each group: (...group).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Array
+     * @param {Array} array The array of grouped elements to process.
+     * @param {Function} [iteratee=_.identity] The function to combine
+     *  regrouped values.
+     * @returns {Array} Returns the new array of regrouped elements.
+     * @example
+     *
+     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+     * // => [[1, 10, 100], [2, 20, 200]]
+     *
+     * _.unzipWith(zipped, _.add);
+     * // => [3, 30, 300]
+     */
+    function unzipWith(array, iteratee) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      var result = unzip(array);
+      if (iteratee == null) {
+        return result;
+      }
+      return arrayMap(result, function(group) {
+        return apply(iteratee, undefined, group);
+      });
+    }
+
+    /**
+     * Creates an array excluding all given values using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * **Note:** Unlike `_.pull`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...*} [values] The values to exclude.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.difference, _.xor
+     * @example
+     *
+     * _.without([2, 1, 2, 3], 1, 2);
+     * // => [3]
+     */
+    var without = baseRest(function(array, values) {
+      return isArrayLikeObject(array) ?
+        baseDifference(array, values) : [];
+    });
+
+    /**
+     * Creates an array of unique values that is the
+     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+     * of the given arrays. The order of result values is determined by the order
+     * they occur in the arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.difference, _.without
+     * @example
+     *
+     * _.xor([2, 1], [2, 3]);
+     * // => [1, 3]
+     */
+    var xor = baseRest(function(arrays) {
+      return baseXor(arrayFilter(arrays, isArrayLikeObject));
+    });
+
+    /**
+     * This method is like `_.xor` except that it accepts `iteratee` which is
+     * invoked for each element of each `arrays` to generate the criterion by
+     * which by which they're compared. The order of result values is determined
+     * by the order they occur in the arrays. The iteratee is invoked with one
+     * argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [1.2, 3.4]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 2 }]
+     */
+    var xorBy = baseRest(function(arrays) {
+      var iteratee = last(arrays);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
+    });
+
+    /**
+     * This method is like `_.xor` except that it accepts `comparator` which is
+     * invoked to compare elements of `arrays`. The order of result values is
+     * determined by the order they occur in the arrays. The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.xorWith(objects, others, _.isEqual);
+     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+     */
+    var xorWith = baseRest(function(arrays) {
+      var comparator = last(arrays);
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
+    });
+
+    /**
+     * Creates an array of grouped elements, the first of which contains the
+     * first elements of the given arrays, the second of which contains the
+     * second elements of the given arrays, and so on.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to process.
+     * @returns {Array} Returns the new array of grouped elements.
+     * @example
+     *
+     * _.zip(['a', 'b'], [1, 2], [true, false]);
+     * // => [['a', 1, true], ['b', 2, false]]
+     */
+    var zip = baseRest(unzip);
+
+    /**
+     * This method is like `_.fromPairs` except that it accepts two arrays,
+     * one of property identifiers and one of corresponding values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.4.0
+     * @category Array
+     * @param {Array} [props=[]] The property identifiers.
+     * @param {Array} [values=[]] The property values.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.zipObject(['a', 'b'], [1, 2]);
+     * // => { 'a': 1, 'b': 2 }
+     */
+    function zipObject(props, values) {
+      return baseZipObject(props || [], values || [], assignValue);
+    }
+
+    /**
+     * This method is like `_.zipObject` except that it supports property paths.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.1.0
+     * @category Array
+     * @param {Array} [props=[]] The property identifiers.
+     * @param {Array} [values=[]] The property values.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
+     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
+     */
+    function zipObjectDeep(props, values) {
+      return baseZipObject(props || [], values || [], baseSet);
+    }
+
+    /**
+     * This method is like `_.zip` except that it accepts `iteratee` to specify
+     * how grouped values should be combined. The iteratee is invoked with the
+     * elements of each group: (...group).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to process.
+     * @param {Function} [iteratee=_.identity] The function to combine
+     *  grouped values.
+     * @returns {Array} Returns the new array of grouped elements.
+     * @example
+     *
+     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
+     *   return a + b + c;
+     * });
+     * // => [111, 222]
+     */
+    var zipWith = baseRest(function(arrays) {
+      var length = arrays.length,
+        iteratee = length > 1 ? arrays[length - 1] : undefined;
+
+      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
+      return unzipWith(arrays, iteratee);
+    });
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
+     * chain sequences enabled. The result of such sequences must be unwrapped
+     * with `_#value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.3.0
+     * @category Seq
+     * @param {*} value The value to wrap.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36 },
+     *   { 'user': 'fred',    'age': 40 },
+     *   { 'user': 'pebbles', 'age': 1 }
+     * ];
+     *
+     * var youngest = _
+     *   .chain(users)
+     *   .sortBy('age')
+     *   .map(function(o) {
+     *     return o.user + ' is ' + o.age;
+     *   })
+     *   .head()
+     *   .value();
+     * // => 'pebbles is 1'
+     */
+    function chain(value) {
+      var result = lodash(value);
+      result.__chain__ = true;
+      return result;
+    }
+
+    /**
+     * This method invokes `interceptor` and returns `value`. The interceptor
+     * is invoked with one argument; (value). The purpose of this method is to
+     * "tap into" a method chain sequence in order to modify intermediate results.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @param {*} value The value to provide to `interceptor`.
+     * @param {Function} interceptor The function to invoke.
+     * @returns {*} Returns `value`.
+     * @example
+     *
+     * _([1, 2, 3])
+     *  .tap(function(array) {
+     *    // Mutate input array.
+     *    array.pop();
+     *  })
+     *  .reverse()
+     *  .value();
+     * // => [2, 1]
+     */
+    function tap(value, interceptor) {
+      interceptor(value);
+      return value;
+    }
+
+    /**
+     * This method is like `_.tap` except that it returns the result of `interceptor`.
+     * The purpose of this method is to "pass thru" values replacing intermediate
+     * results in a method chain sequence.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Seq
+     * @param {*} value The value to provide to `interceptor`.
+     * @param {Function} interceptor The function to invoke.
+     * @returns {*} Returns the result of `interceptor`.
+     * @example
+     *
+     * _('  abc  ')
+     *  .chain()
+     *  .trim()
+     *  .thru(function(value) {
+     *    return [value];
+     *  })
+     *  .value();
+     * // => ['abc']
+     */
+    function thru(value, interceptor) {
+      return interceptor(value);
+    }
+
+    /**
+     * This method is the wrapper version of `_.at`.
+     *
+     * @name at
+     * @memberOf _
+     * @since 1.0.0
+     * @category Seq
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+     *
+     * _(object).at(['a[0].b.c', 'a[1]']).value();
+     * // => [3, 4]
+     */
+    var wrapperAt = flatRest(function(paths) {
+      var length = paths.length,
+        start = length ? paths[0] : 0,
+        value = this.__wrapped__,
+        interceptor = function(object) {
+          return baseAt(object, paths);
+        };
+
+      if (length > 1 || this.__actions__.length ||
+        !(value instanceof LazyWrapper) || !isIndex(start)) {
+        return this.thru(interceptor);
+      }
+      value = value.slice(start, +start + (length ? 1 : 0));
+      value.__actions__.push({
+        'func': thru,
+        'args': [interceptor],
+        'thisArg': undefined
+      });
+      return new LodashWrapper(value, this.__chain__).thru(function(array) {
+        if (length && !array.length) {
+          array.push(undefined);
+        }
+        return array;
+      });
+    });
+
+    /**
+     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
+     *
+     * @name chain
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36 },
+     *   { 'user': 'fred',   'age': 40 }
+     * ];
+     *
+     * // A sequence without explicit chaining.
+     * _(users).head();
+     * // => { 'user': 'barney', 'age': 36 }
+     *
+     * // A sequence with explicit chaining.
+     * _(users)
+     *   .chain()
+     *   .head()
+     *   .pick('user')
+     *   .value();
+     * // => { 'user': 'barney' }
+     */
+    function wrapperChain() {
+      return chain(this);
+    }
+
+    /**
+     * Executes the chain sequence and returns the wrapped result.
+     *
+     * @name commit
+     * @memberOf _
+     * @since 3.2.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var array = [1, 2];
+     * var wrapped = _(array).push(3);
+     *
+     * console.log(array);
+     * // => [1, 2]
+     *
+     * wrapped = wrapped.commit();
+     * console.log(array);
+     * // => [1, 2, 3]
+     *
+     * wrapped.last();
+     * // => 3
+     *
+     * console.log(array);
+     * // => [1, 2, 3]
+     */
+    function wrapperCommit() {
+      return new LodashWrapper(this.value(), this.__chain__);
+    }
+
+    /**
+     * Gets the next value on a wrapped object following the
+     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
+     *
+     * @name next
+     * @memberOf _
+     * @since 4.0.0
+     * @category Seq
+     * @returns {Object} Returns the next iterator value.
+     * @example
+     *
+     * var wrapped = _([1, 2]);
+     *
+     * wrapped.next();
+     * // => { 'done': false, 'value': 1 }
+     *
+     * wrapped.next();
+     * // => { 'done': false, 'value': 2 }
+     *
+     * wrapped.next();
+     * // => { 'done': true, 'value': undefined }
+     */
+    function wrapperNext() {
+      if (this.__values__ === undefined) {
+        this.__values__ = toArray(this.value());
+      }
+      var done = this.__index__ >= this.__values__.length,
+        value = done ? undefined : this.__values__[this.__index__++];
+
+      return {
+        'done': done,
+        'value': value
+      };
+    }
+
+    /**
+     * Enables the wrapper to be iterable.
+     *
+     * @name Symbol.iterator
+     * @memberOf _
+     * @since 4.0.0
+     * @category Seq
+     * @returns {Object} Returns the wrapper object.
+     * @example
+     *
+     * var wrapped = _([1, 2]);
+     *
+     * wrapped[Symbol.iterator]() === wrapped;
+     * // => true
+     *
+     * Array.from(wrapped);
+     * // => [1, 2]
+     */
+    function wrapperToIterator() {
+      return this;
+    }
+
+    /**
+     * Creates a clone of the chain sequence planting `value` as the wrapped value.
+     *
+     * @name plant
+     * @memberOf _
+     * @since 3.2.0
+     * @category Seq
+     * @param {*} value The value to plant.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var wrapped = _([1, 2]).map(square);
+     * var other = wrapped.plant([3, 4]);
+     *
+     * other.value();
+     * // => [9, 16]
+     *
+     * wrapped.value();
+     * // => [1, 4]
+     */
+    function wrapperPlant(value) {
+      var result,
+        parent = this;
+
+      while (parent instanceof baseLodash) {
+        var clone = wrapperClone(parent);
+        clone.__index__ = 0;
+        clone.__values__ = undefined;
+        if (result) {
+          previous.__wrapped__ = clone;
+        } else {
+          result = clone;
+        }
+        var previous = clone;
+        parent = parent.__wrapped__;
+      }
+      previous.__wrapped__ = value;
+      return result;
+    }
+
+    /**
+     * This method is the wrapper version of `_.reverse`.
+     *
+     * **Note:** This method mutates the wrapped array.
+     *
+     * @name reverse
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _(array).reverse().value()
+     * // => [3, 2, 1]
+     *
+     * console.log(array);
+     * // => [3, 2, 1]
+     */
+    function wrapperReverse() {
+      var value = this.__wrapped__;
+      if (value instanceof LazyWrapper) {
+        var wrapped = value;
+        if (this.__actions__.length) {
+          wrapped = new LazyWrapper(this);
+        }
+        wrapped = wrapped.reverse();
+        wrapped.__actions__.push({
+          'func': thru,
+          'args': [reverse],
+          'thisArg': undefined
+        });
+        return new LodashWrapper(wrapped, this.__chain__);
+      }
+      return this.thru(reverse);
+    }
+
+    /**
+     * Executes the chain sequence to resolve the unwrapped value.
+     *
+     * @name value
+     * @memberOf _
+     * @since 0.1.0
+     * @alias toJSON, valueOf
+     * @category Seq
+     * @returns {*} Returns the resolved unwrapped value.
+     * @example
+     *
+     * _([1, 2, 3]).value();
+     * // => [1, 2, 3]
+     */
+    function wrapperValue() {
+      return baseWrapperValue(this.__wrapped__, this.__actions__);
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The corresponding value of
+     * each key is the number of times the key was returned by `iteratee`. The
+     * iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * _.countBy([6.1, 4.2, 6.3], Math.floor);
+     * // => { '4': 1, '6': 2 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.countBy(['one', 'two', 'three'], 'length');
+     * // => { '3': 2, '5': 1 }
+     */
+    var countBy = createAggregator(function(result, value, key) {
+      if (hasOwnProperty.call(result, key)) {
+        ++result[key];
+      } else {
+        baseAssignValue(result, key, 1);
+      }
+    });
+
+    /**
+     * Checks if `predicate` returns truthy for **all** elements of `collection`.
+     * Iteration is stopped once `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index|key, collection).
+     *
+     * **Note:** This method returns `true` for
+     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
+     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
+     * elements of empty collections.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {boolean} Returns `true` if all elements pass the predicate check,
+     *  else `false`.
+     * @example
+     *
+     * _.every([true, 1, null, 'yes'], Boolean);
+     * // => false
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': false },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.every(users, { 'user': 'barney', 'active': false });
+     * // => false
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.every(users, ['active', false]);
+     * // => true
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.every(users, 'active');
+     * // => false
+     */
+    function every(collection, predicate, guard) {
+      var func = isArray(collection) ? arrayEvery : baseEvery;
+      if (guard && isIterateeCall(collection, predicate, guard)) {
+        predicate = undefined;
+      }
+      return func(collection, getIteratee(predicate, 3));
+    }
+
+    /**
+     * Iterates over elements of `collection`, returning an array of all elements
+     * `predicate` returns truthy for. The predicate is invoked with three
+     * arguments: (value, index|key, collection).
+     *
+     * **Note:** Unlike `_.remove`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     * @see _.reject
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': true },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * _.filter(users, function(o) { return !o.active; });
+     * // => objects for ['fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.filter(users, { 'age': 36, 'active': true });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.filter(users, ['active', false]);
+     * // => objects for ['fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.filter(users, 'active');
+     * // => objects for ['barney']
+     *
+     * // Combining several predicates using `_.overEvery` or `_.overSome`.
+     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
+     * // => objects for ['fred', 'barney']
+     */
+    function filter(collection, predicate) {
+      var func = isArray(collection) ? arrayFilter : baseFilter;
+      return func(collection, getIteratee(predicate, 3));
+    }
+
+    /**
+     * Iterates over elements of `collection`, returning the first element
+     * `predicate` returns truthy for. The predicate is invoked with three
+     * arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {*} Returns the matched element, else `undefined`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36, 'active': true },
+     *   { 'user': 'fred',    'age': 40, 'active': false },
+     *   { 'user': 'pebbles', 'age': 1,  'active': true }
+     * ];
+     *
+     * _.find(users, function(o) { return o.age < 40; });
+     * // => object for 'barney'
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.find(users, { 'age': 1, 'active': true });
+     * // => object for 'pebbles'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.find(users, ['active', false]);
+     * // => object for 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.find(users, 'active');
+     * // => object for 'barney'
+     */
+    var find = createFind(findIndex);
+
+    /**
+     * This method is like `_.find` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=collection.length-1] The index to search from.
+     * @returns {*} Returns the matched element, else `undefined`.
+     * @example
+     *
+     * _.findLast([1, 2, 3, 4], function(n) {
+     *   return n % 2 == 1;
+     * });
+     * // => 3
+     */
+    var findLast = createFind(findLastIndex);
+
+    /**
+     * Creates a flattened array of values by running each element in `collection`
+     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
+     * with three arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [n, n];
+     * }
+     *
+     * _.flatMap([1, 2], duplicate);
+     * // => [1, 1, 2, 2]
+     */
+    function flatMap(collection, iteratee) {
+      return baseFlatten(map(collection, iteratee), 1);
+    }
+
+    /**
+     * This method is like `_.flatMap` except that it recursively flattens the
+     * mapped results.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [[[n, n]]];
+     * }
+     *
+     * _.flatMapDeep([1, 2], duplicate);
+     * // => [1, 1, 2, 2]
+     */
+    function flatMapDeep(collection, iteratee) {
+      return baseFlatten(map(collection, iteratee), INFINITY);
+    }
+
+    /**
+     * This method is like `_.flatMap` except that it recursively flattens the
+     * mapped results up to `depth` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {number} [depth=1] The maximum recursion depth.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [[[n, n]]];
+     * }
+     *
+     * _.flatMapDepth([1, 2], duplicate, 2);
+     * // => [[1, 1], [2, 2]]
+     */
+    function flatMapDepth(collection, iteratee, depth) {
+      depth = depth === undefined ? 1 : toInteger(depth);
+      return baseFlatten(map(collection, iteratee), depth);
+    }
+
+    /**
+     * Iterates over elements of `collection` and invokes `iteratee` for each element.
+     * The iteratee is invoked with three arguments: (value, index|key, collection).
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * **Note:** As with other "Collections" methods, objects with a "length"
+     * property are iterated like arrays. To avoid this behavior use `_.forIn`
+     * or `_.forOwn` for object iteration.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @alias each
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     * @see _.forEachRight
+     * @example
+     *
+     * _.forEach([1, 2], function(value) {
+     *   console.log(value);
+     * });
+     * // => Logs `1` then `2`.
+     *
+     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+     */
+    function forEach(collection, iteratee) {
+      var func = isArray(collection) ? arrayEach : baseEach;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+
+    /**
+     * This method is like `_.forEach` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @alias eachRight
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     * @see _.forEach
+     * @example
+     *
+     * _.forEachRight([1, 2], function(value) {
+     *   console.log(value);
+     * });
+     * // => Logs `2` then `1`.
+     */
+    function forEachRight(collection, iteratee) {
+      var func = isArray(collection) ? arrayEachRight : baseEachRight;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The order of grouped values
+     * is determined by the order they occur in `collection`. The corresponding
+     * value of each key is an array of elements responsible for generating the
+     * key. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+     * // => { '4': [4.2], '6': [6.1, 6.3] }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.groupBy(['one', 'two', 'three'], 'length');
+     * // => { '3': ['one', 'two'], '5': ['three'] }
+     */
+    var groupBy = createAggregator(function(result, value, key) {
+      if (hasOwnProperty.call(result, key)) {
+        result[key].push(value);
+      } else {
+        baseAssignValue(result, key, [value]);
+      }
+    });
+
+    /**
+     * Checks if `value` is in `collection`. If `collection` is a string, it's
+     * checked for a substring of `value`, otherwise
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * is used for equality comparisons. If `fromIndex` is negative, it's used as
+     * the offset from the end of `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object|string} collection The collection to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+     * @returns {boolean} Returns `true` if `value` is found, else `false`.
+     * @example
+     *
+     * _.includes([1, 2, 3], 1);
+     * // => true
+     *
+     * _.includes([1, 2, 3], 1, 2);
+     * // => false
+     *
+     * _.includes({ 'a': 1, 'b': 2 }, 1);
+     * // => true
+     *
+     * _.includes('abcd', 'bc');
+     * // => true
+     */
+    function includes(collection, value, fromIndex, guard) {
+      collection = isArrayLike(collection) ? collection : values(collection);
+      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
+
+      var length = collection.length;
+      if (fromIndex < 0) {
+        fromIndex = nativeMax(length + fromIndex, 0);
+      }
+      return isString(collection) ?
+        (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) :
+        (!!length && baseIndexOf(collection, value, fromIndex) > -1);
+    }
+
+    /**
+     * Invokes the method at `path` of each element in `collection`, returning
+     * an array of the results of each invoked method. Any additional arguments
+     * are provided to each invoked method. If `path` is a function, it's invoked
+     * for, and `this` bound to, each element in `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Array|Function|string} path The path of the method to invoke or
+     *  the function invoked per iteration.
+     * @param {...*} [args] The arguments to invoke each method with.
+     * @returns {Array} Returns the array of results.
+     * @example
+     *
+     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
+     * // => [[1, 5, 7], [1, 2, 3]]
+     *
+     * _.invokeMap([123, 456], String.prototype.split, '');
+     * // => [['1', '2', '3'], ['4', '5', '6']]
+     */
+    var invokeMap = baseRest(function(collection, path, args) {
+      var index = -1,
+        isFunc = typeof path == 'function',
+        result = isArrayLike(collection) ? Array(collection.length) : [];
+
+      baseEach(collection, function(value) {
+        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
+      });
+      return result;
+    });
+
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The corresponding value of
+     * each key is the last element responsible for generating the key. The
+     * iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * var array = [
+     *   { 'dir': 'left', 'code': 97 },
+     *   { 'dir': 'right', 'code': 100 }
+     * ];
+     *
+     * _.keyBy(array, function(o) {
+     *   return String.fromCharCode(o.code);
+     * });
+     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+     *
+     * _.keyBy(array, 'dir');
+     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+     */
+    var keyBy = createAggregator(function(result, value, key) {
+      baseAssignValue(result, key, value);
+    });
+
+    /**
+     * Creates an array of values by running each element in `collection` thru
+     * `iteratee`. The iteratee is invoked with three arguments:
+     * (value, index|key, collection).
+     *
+     * Many lodash methods are guarded to work as iteratees for methods like
+     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+     *
+     * The guarded methods are:
+     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new mapped array.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * _.map([4, 8], square);
+     * // => [16, 64]
+     *
+     * _.map({ 'a': 4, 'b': 8 }, square);
+     * // => [16, 64] (iteration order is not guaranteed)
+     *
+     * var users = [
+     *   { 'user': 'barney' },
+     *   { 'user': 'fred' }
+     * ];
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.map(users, 'user');
+     * // => ['barney', 'fred']
+     */
+    function map(collection, iteratee) {
+      var func = isArray(collection) ? arrayMap : baseMap;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+
+    /**
+     * This method is like `_.sortBy` except that it allows specifying the sort
+     * orders of the iteratees to sort by. If `orders` is unspecified, all values
+     * are sorted in ascending order. Otherwise, specify an order of "desc" for
+     * descending or "asc" for ascending sort order of corresponding values.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
+     *  The iteratees to sort by.
+     * @param {string[]} [orders] The sort orders of `iteratees`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+     * @returns {Array} Returns the new sorted array.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'fred',   'age': 48 },
+     *   { 'user': 'barney', 'age': 34 },
+     *   { 'user': 'fred',   'age': 40 },
+     *   { 'user': 'barney', 'age': 36 }
+     * ];
+     *
+     * // Sort by `user` in ascending order and by `age` in descending order.
+     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+     */
+    function orderBy(collection, iteratees, orders, guard) {
+      if (collection == null) {
+        return [];
+      }
+      if (!isArray(iteratees)) {
+        iteratees = iteratees == null ? [] : [iteratees];
+      }
+      orders = guard ? undefined : orders;
+      if (!isArray(orders)) {
+        orders = orders == null ? [] : [orders];
+      }
+      return baseOrderBy(collection, iteratees, orders);
+    }
+
+    /**
+     * Creates an array of elements split into two groups, the first of which
+     * contains elements `predicate` returns truthy for, the second of which
+     * contains elements `predicate` returns falsey for. The predicate is
+     * invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the array of grouped elements.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36, 'active': false },
+     *   { 'user': 'fred',    'age': 40, 'active': true },
+     *   { 'user': 'pebbles', 'age': 1,  'active': false }
+     * ];
+     *
+     * _.partition(users, function(o) { return o.active; });
+     * // => objects for [['fred'], ['barney', 'pebbles']]
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.partition(users, { 'age': 1, 'active': false });
+     * // => objects for [['pebbles'], ['barney', 'fred']]
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.partition(users, ['active', false]);
+     * // => objects for [['barney', 'pebbles'], ['fred']]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.partition(users, 'active');
+     * // => objects for [['fred'], ['barney', 'pebbles']]
+     */
+    var partition = createAggregator(function(result, value, key) {
+      result[key ? 0 : 1].push(value);
+    }, function() {
+      return [
+        [],
+        []
+      ];
+    });
+
+    /**
+     * Reduces `collection` to a value which is the accumulated result of running
+     * each element in `collection` thru `iteratee`, where each successive
+     * invocation is supplied the return value of the previous. If `accumulator`
+     * is not given, the first element of `collection` is used as the initial
+     * value. The iteratee is invoked with four arguments:
+     * (accumulator, value, index|key, collection).
+     *
+     * Many lodash methods are guarded to work as iteratees for methods like
+     * `_.reduce`, `_.reduceRight`, and `_.transform`.
+     *
+     * The guarded methods are:
+     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+     * and `sortBy`
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The initial value.
+     * @returns {*} Returns the accumulated value.
+     * @see _.reduceRight
+     * @example
+     *
+     * _.reduce([1, 2], function(sum, n) {
+     *   return sum + n;
+     * }, 0);
+     * // => 3
+     *
+     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+     *   (result[value] || (result[value] = [])).push(key);
+     *   return result;
+     * }, {});
+     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+     */
+    function reduce(collection, iteratee, accumulator) {
+      var func = isArray(collection) ? arrayReduce : baseReduce,
+        initAccum = arguments.length < 3;
+
+      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
+    }
+
+    /**
+     * This method is like `_.reduce` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The initial value.
+     * @returns {*} Returns the accumulated value.
+     * @see _.reduce
+     * @example
+     *
+     * var array = [[0, 1], [2, 3], [4, 5]];
+     *
+     * _.reduceRight(array, function(flattened, other) {
+     *   return flattened.concat(other);
+     * }, []);
+     * // => [4, 5, 2, 3, 0, 1]
+     */
+    function reduceRight(collection, iteratee, accumulator) {
+      var func = isArray(collection) ? arrayReduceRight : baseReduce,
+        initAccum = arguments.length < 3;
+
+      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
+    }
+
+    /**
+     * The opposite of `_.filter`; this method returns the elements of `collection`
+     * that `predicate` does **not** return truthy for.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     * @see _.filter
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': false },
+     *   { 'user': 'fred',   'age': 40, 'active': true }
+     * ];
+     *
+     * _.reject(users, function(o) { return !o.active; });
+     * // => objects for ['fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.reject(users, { 'age': 40, 'active': true });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.reject(users, ['active', false]);
+     * // => objects for ['fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.reject(users, 'active');
+     * // => objects for ['barney']
+     */
+    function reject(collection, predicate) {
+      var func = isArray(collection) ? arrayFilter : baseFilter;
+      return func(collection, negate(getIteratee(predicate, 3)));
+    }
+
+    /**
+     * Gets a random element from `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to sample.
+     * @returns {*} Returns the random element.
+     * @example
+     *
+     * _.sample([1, 2, 3, 4]);
+     * // => 2
+     */
+    function sample(collection) {
+      var func = isArray(collection) ? arraySample : baseSample;
+      return func(collection);
+    }
+
+    /**
+     * Gets `n` random elements at unique keys from `collection` up to the
+     * size of `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to sample.
+     * @param {number} [n=1] The number of elements to sample.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the random elements.
+     * @example
+     *
+     * _.sampleSize([1, 2, 3], 2);
+     * // => [3, 1]
+     *
+     * _.sampleSize([1, 2, 3], 4);
+     * // => [2, 3, 1]
+     */
+    function sampleSize(collection, n, guard) {
+      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
+        n = 1;
+      } else {
+        n = toInteger(n);
+      }
+      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
+      return func(collection, n);
+    }
+
+    /**
+     * Creates an array of shuffled values, using a version of the
+     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     * @example
+     *
+     * _.shuffle([1, 2, 3, 4]);
+     * // => [4, 1, 3, 2]
+     */
+    function shuffle(collection) {
+      var func = isArray(collection) ? arrayShuffle : baseShuffle;
+      return func(collection);
+    }
+
+    /**
+     * Gets the size of `collection` by returning its length for array-like
+     * values or the number of own enumerable string keyed properties for objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object|string} collection The collection to inspect.
+     * @returns {number} Returns the collection size.
+     * @example
+     *
+     * _.size([1, 2, 3]);
+     * // => 3
+     *
+     * _.size({ 'a': 1, 'b': 2 });
+     * // => 2
+     *
+     * _.size('pebbles');
+     * // => 7
+     */
+    function size(collection) {
+      if (collection == null) {
+        return 0;
+      }
+      if (isArrayLike(collection)) {
+        return isString(collection) ? stringSize(collection) : collection.length;
+      }
+      var tag = getTag(collection);
+      if (tag == mapTag || tag == setTag) {
+        return collection.size;
+      }
+      return baseKeys(collection).length;
+    }
+
+    /**
+     * Checks if `predicate` returns truthy for **any** element of `collection`.
+     * Iteration is stopped once `predicate` returns truthy. The predicate is
+     * invoked with three arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {boolean} Returns `true` if any element passes the predicate check,
+     *  else `false`.
+     * @example
+     *
+     * _.some([null, 0, 'yes', false], Boolean);
+     * // => true
+     *
+     * var users = [
+     *   { 'user': 'barney', 'active': true },
+     *   { 'user': 'fred',   'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.some(users, { 'user': 'barney', 'active': false });
+     * // => false
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.some(users, ['active', false]);
+     * // => true
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.some(users, 'active');
+     * // => true
+     */
+    function some(collection, predicate, guard) {
+      var func = isArray(collection) ? arraySome : baseSome;
+      if (guard && isIterateeCall(collection, predicate, guard)) {
+        predicate = undefined;
+      }
+      return func(collection, getIteratee(predicate, 3));
+    }
+
+    /**
+     * Creates an array of elements, sorted in ascending order by the results of
+     * running each element in a collection thru each iteratee. This method
+     * performs a stable sort, that is, it preserves the original sort order of
+     * equal elements. The iteratees are invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {...(Function|Function[])} [iteratees=[_.identity]]
+     *  The iteratees to sort by.
+     * @returns {Array} Returns the new sorted array.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'fred',   'age': 48 },
+     *   { 'user': 'barney', 'age': 36 },
+     *   { 'user': 'fred',   'age': 30 },
+     *   { 'user': 'barney', 'age': 34 }
+     * ];
+     *
+     * _.sortBy(users, [function(o) { return o.user; }]);
+     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
+     *
+     * _.sortBy(users, ['user', 'age']);
+     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
+     */
+    var sortBy = baseRest(function(collection, iteratees) {
+      if (collection == null) {
+        return [];
+      }
+      var length = iteratees.length;
+      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+        iteratees = [];
+      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+        iteratees = [iteratees[0]];
+      }
+      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+    });
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Gets the timestamp of the number of milliseconds that have elapsed since
+     * the Unix epoch (1 January 1970 00:00:00 UTC).
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Date
+     * @returns {number} Returns the timestamp.
+     * @example
+     *
+     * _.defer(function(stamp) {
+     *   console.log(_.now() - stamp);
+     * }, _.now());
+     * // => Logs the number of milliseconds it took for the deferred invocation.
+     */
+    var now = ctxNow || function() {
+      return root.Date.now();
+    };
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * The opposite of `_.before`; this method creates a function that invokes
+     * `func` once it's called `n` or more times.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {number} n The number of calls before `func` is invoked.
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * var saves = ['profile', 'settings'];
+     *
+     * var done = _.after(saves.length, function() {
+     *   console.log('done saving!');
+     * });
+     *
+     * _.forEach(saves, function(type) {
+     *   asyncSave({ 'type': type, 'complete': done });
+     * });
+     * // => Logs 'done saving!' after the two async saves have completed.
+     */
+    function after(n, func) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      n = toInteger(n);
+      return function() {
+        if (--n < 1) {
+          return func.apply(this, arguments);
+        }
+      };
+    }
+
+    /**
+     * Creates a function that invokes `func`, with up to `n` arguments,
+     * ignoring any additional arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to cap arguments for.
+     * @param {number} [n=func.length] The arity cap.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new capped function.
+     * @example
+     *
+     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+     * // => [6, 8, 10]
+     */
+    function ary(func, n, guard) {
+      n = guard ? undefined : n;
+      n = (func && n == null) ? func.length : n;
+      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
+    }
+
+    /**
+     * Creates a function that invokes `func`, with the `this` binding and arguments
+     * of the created function, while it's called less than `n` times. Subsequent
+     * calls to the created function return the result of the last `func` invocation.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {number} n The number of calls at which `func` is no longer invoked.
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * jQuery(element).on('click', _.before(5, addContactToList));
+     * // => Allows adding up to 4 contacts to the list.
+     */
+    function before(n, func) {
+      var result;
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      n = toInteger(n);
+      return function() {
+        if (--n > 0) {
+          result = func.apply(this, arguments);
+        }
+        if (n <= 1) {
+          func = undefined;
+        }
+        return result;
+      };
+    }
+
+    /**
+     * Creates a function that invokes `func` with the `this` binding of `thisArg`
+     * and `partials` prepended to the arguments it receives.
+     *
+     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+     * may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
+     * property of bound functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to bind.
+     * @param {*} thisArg The `this` binding of `func`.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new bound function.
+     * @example
+     *
+     * function greet(greeting, punctuation) {
+     *   return greeting + ' ' + this.user + punctuation;
+     * }
+     *
+     * var object = { 'user': 'fred' };
+     *
+     * var bound = _.bind(greet, object, 'hi');
+     * bound('!');
+     * // => 'hi fred!'
+     *
+     * // Bound with placeholders.
+     * var bound = _.bind(greet, object, _, '!');
+     * bound('hi');
+     * // => 'hi fred!'
+     */
+    var bind = baseRest(function(func, thisArg, partials) {
+      var bitmask = WRAP_BIND_FLAG;
+      if (partials.length) {
+        var holders = replaceHolders(partials, getHolder(bind));
+        bitmask |= WRAP_PARTIAL_FLAG;
+      }
+      return createWrap(func, bitmask, thisArg, partials, holders);
+    });
+
+    /**
+     * Creates a function that invokes the method at `object[key]` with `partials`
+     * prepended to the arguments it receives.
+     *
+     * This method differs from `_.bind` by allowing bound functions to reference
+     * methods that may be redefined or don't yet exist. See
+     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+     * for more details.
+     *
+     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.10.0
+     * @category Function
+     * @param {Object} object The object to invoke the method on.
+     * @param {string} key The key of the method.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new bound function.
+     * @example
+     *
+     * var object = {
+     *   'user': 'fred',
+     *   'greet': function(greeting, punctuation) {
+     *     return greeting + ' ' + this.user + punctuation;
+     *   }
+     * };
+     *
+     * var bound = _.bindKey(object, 'greet', 'hi');
+     * bound('!');
+     * // => 'hi fred!'
+     *
+     * object.greet = function(greeting, punctuation) {
+     *   return greeting + 'ya ' + this.user + punctuation;
+     * };
+     *
+     * bound('!');
+     * // => 'hiya fred!'
+     *
+     * // Bound with placeholders.
+     * var bound = _.bindKey(object, 'greet', _, '!');
+     * bound('hi');
+     * // => 'hiya fred!'
+     */
+    var bindKey = baseRest(function(object, key, partials) {
+      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
+      if (partials.length) {
+        var holders = replaceHolders(partials, getHolder(bindKey));
+        bitmask |= WRAP_PARTIAL_FLAG;
+      }
+      return createWrap(key, bitmask, object, partials, holders);
+    });
+
+    /**
+     * Creates a function that accepts arguments of `func` and either invokes
+     * `func` returning its result, if at least `arity` number of arguments have
+     * been provided, or returns a function that accepts the remaining `func`
+     * arguments, and so on. The arity of `func` may be specified if `func.length`
+     * is not sufficient.
+     *
+     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+     * may be used as a placeholder for provided arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of curried functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Function
+     * @param {Function} func The function to curry.
+     * @param {number} [arity=func.length] The arity of `func`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new curried function.
+     * @example
+     *
+     * var abc = function(a, b, c) {
+     *   return [a, b, c];
+     * };
+     *
+     * var curried = _.curry(abc);
+     *
+     * curried(1)(2)(3);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2)(3);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2, 3);
+     * // => [1, 2, 3]
+     *
+     * // Curried with placeholders.
+     * curried(1)(_, 3)(2);
+     * // => [1, 2, 3]
+     */
+    function curry(func, arity, guard) {
+      arity = guard ? undefined : arity;
+      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+      result.placeholder = curry.placeholder;
+      return result;
+    }
+
+    /**
+     * This method is like `_.curry` except that arguments are applied to `func`
+     * in the manner of `_.partialRight` instead of `_.partial`.
+     *
+     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for provided arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of curried functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to curry.
+     * @param {number} [arity=func.length] The arity of `func`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new curried function.
+     * @example
+     *
+     * var abc = function(a, b, c) {
+     *   return [a, b, c];
+     * };
+     *
+     * var curried = _.curryRight(abc);
+     *
+     * curried(3)(2)(1);
+     * // => [1, 2, 3]
+     *
+     * curried(2, 3)(1);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2, 3);
+     * // => [1, 2, 3]
+     *
+     * // Curried with placeholders.
+     * curried(3)(1, _)(2);
+     * // => [1, 2, 3]
+     */
+    function curryRight(func, arity, guard) {
+      arity = guard ? undefined : arity;
+      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+      result.placeholder = curryRight.placeholder;
+      return result;
+    }
+
+    /**
+     * Creates a debounced function that delays invoking `func` until after `wait`
+     * milliseconds have elapsed since the last time the debounced function was
+     * invoked. The debounced function comes with a `cancel` method to cancel
+     * delayed `func` invocations and a `flush` method to immediately invoke them.
+     * Provide `options` to indicate whether `func` should be invoked on the
+     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+     * with the last arguments provided to the debounced function. Subsequent
+     * calls to the debounced function return the result of the last `func`
+     * invocation.
+     *
+     * **Note:** If `leading` and `trailing` options are `true`, `func` is
+     * invoked on the trailing edge of the timeout only if the debounced function
+     * is invoked more than once during the `wait` timeout.
+     *
+     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+     *
+     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+     * for details over the differences between `_.debounce` and `_.throttle`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to debounce.
+     * @param {number} [wait=0] The number of milliseconds to delay.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.leading=false]
+     *  Specify invoking on the leading edge of the timeout.
+     * @param {number} [options.maxWait]
+     *  The maximum time `func` is allowed to be delayed before it's invoked.
+     * @param {boolean} [options.trailing=true]
+     *  Specify invoking on the trailing edge of the timeout.
+     * @returns {Function} Returns the new debounced function.
+     * @example
+     *
+     * // Avoid costly calculations while the window size is in flux.
+     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+     *
+     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+     * jQuery(element).on('click', _.debounce(sendMail, 300, {
+     *   'leading': true,
+     *   'trailing': false
+     * }));
+     *
+     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+     * var source = new EventSource('/stream');
+     * jQuery(source).on('message', debounced);
+     *
+     * // Cancel the trailing debounced invocation.
+     * jQuery(window).on('popstate', debounced.cancel);
+     */
+    function debounce(func, wait, options) {
+      var lastArgs,
+        lastThis,
+        maxWait,
+        result,
+        timerId,
+        lastCallTime,
+        lastInvokeTime = 0,
+        leading = false,
+        maxing = false,
+        trailing = true;
+
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      wait = toNumber(wait) || 0;
+      if (isObject(options)) {
+        leading = !!options.leading;
+        maxing = 'maxWait' in options;
+        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+        trailing = 'trailing' in options ? !!options.trailing : trailing;
+      }
+
+      function invokeFunc(time) {
+        var args = lastArgs,
+          thisArg = lastThis;
+
+        lastArgs = lastThis = undefined;
+        lastInvokeTime = time;
+        result = func.apply(thisArg, args);
+        return result;
+      }
+
+      function leadingEdge(time) {
+        // Reset any `maxWait` timer.
+        lastInvokeTime = time;
+        // Start the timer for the trailing edge.
+        timerId = setTimeout(timerExpired, wait);
+        // Invoke the leading edge.
+        return leading ? invokeFunc(time) : result;
+      }
+
+      function remainingWait(time) {
+        var timeSinceLastCall = time - lastCallTime,
+          timeSinceLastInvoke = time - lastInvokeTime,
+          timeWaiting = wait - timeSinceLastCall;
+
+        return maxing ?
+          nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) :
+          timeWaiting;
+      }
+
+      function shouldInvoke(time) {
+        var timeSinceLastCall = time - lastCallTime,
+          timeSinceLastInvoke = time - lastInvokeTime;
+
+        // Either this is the first call, activity has stopped and we're at the
+        // trailing edge, the system time has gone backwards and we're treating
+        // it as the trailing edge, or we've hit the `maxWait` limit.
+        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+      }
+
+      function timerExpired() {
+        var time = now();
+        if (shouldInvoke(time)) {
+          return trailingEdge(time);
+        }
+        // Restart the timer.
+        timerId = setTimeout(timerExpired, remainingWait(time));
+      }
+
+      function trailingEdge(time) {
+        timerId = undefined;
+
+        // Only invoke if we have `lastArgs` which means `func` has been
+        // debounced at least once.
+        if (trailing && lastArgs) {
+          return invokeFunc(time);
+        }
+        lastArgs = lastThis = undefined;
+        return result;
+      }
+
+      function cancel() {
+        if (timerId !== undefined) {
+          clearTimeout(timerId);
+        }
+        lastInvokeTime = 0;
+        lastArgs = lastCallTime = lastThis = timerId = undefined;
+      }
+
+      function flush() {
+        return timerId === undefined ? result : trailingEdge(now());
+      }
+
+      function debounced() {
+        var time = now(),
+          isInvoking = shouldInvoke(time);
+
+        lastArgs = arguments;
+        lastThis = this;
+        lastCallTime = time;
+
+        if (isInvoking) {
+          if (timerId === undefined) {
+            return leadingEdge(lastCallTime);
+          }
+          if (maxing) {
+            // Handle invocations in a tight loop.
+            clearTimeout(timerId);
+            timerId = setTimeout(timerExpired, wait);
+            return invokeFunc(lastCallTime);
+          }
+        }
+        if (timerId === undefined) {
+          timerId = setTimeout(timerExpired, wait);
+        }
+        return result;
+      }
+      debounced.cancel = cancel;
+      debounced.flush = flush;
+      return debounced;
+    }
+
+    /**
+     * Defers invoking the `func` until the current call stack has cleared. Any
+     * additional arguments are provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to defer.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {number} Returns the timer id.
+     * @example
+     *
+     * _.defer(function(text) {
+     *   console.log(text);
+     * }, 'deferred');
+     * // => Logs 'deferred' after one millisecond.
+     */
+    var defer = baseRest(function(func, args) {
+      return baseDelay(func, 1, args);
+    });
+
+    /**
+     * Invokes `func` after `wait` milliseconds. Any additional arguments are
+     * provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {number} Returns the timer id.
+     * @example
+     *
+     * _.delay(function(text) {
+     *   console.log(text);
+     * }, 1000, 'later');
+     * // => Logs 'later' after one second.
+     */
+    var delay = baseRest(function(func, wait, args) {
+      return baseDelay(func, toNumber(wait) || 0, args);
+    });
+
+    /**
+     * Creates a function that invokes `func` with arguments reversed.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to flip arguments for.
+     * @returns {Function} Returns the new flipped function.
+     * @example
+     *
+     * var flipped = _.flip(function() {
+     *   return _.toArray(arguments);
+     * });
+     *
+     * flipped('a', 'b', 'c', 'd');
+     * // => ['d', 'c', 'b', 'a']
+     */
+    function flip(func) {
+      return createWrap(func, WRAP_FLIP_FLAG);
+    }
+
+    /**
+     * Creates a function that memoizes the result of `func`. If `resolver` is
+     * provided, it determines the cache key for storing the result based on the
+     * arguments provided to the memoized function. By default, the first argument
+     * provided to the memoized function is used as the map cache key. The `func`
+     * is invoked with the `this` binding of the memoized function.
+     *
+     * **Note:** The cache is exposed as the `cache` property on the memoized
+     * function. Its creation may be customized by replacing the `_.memoize.Cache`
+     * constructor with one whose instances implement the
+     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to have its output memoized.
+     * @param {Function} [resolver] The function to resolve the cache key.
+     * @returns {Function} Returns the new memoized function.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     * var other = { 'c': 3, 'd': 4 };
+     *
+     * var values = _.memoize(_.values);
+     * values(object);
+     * // => [1, 2]
+     *
+     * values(other);
+     * // => [3, 4]
+     *
+     * object.a = 2;
+     * values(object);
+     * // => [1, 2]
+     *
+     * // Modify the result cache.
+     * values.cache.set(object, ['a', 'b']);
+     * values(object);
+     * // => ['a', 'b']
+     *
+     * // Replace `_.memoize.Cache`.
+     * _.memoize.Cache = WeakMap;
+     */
+    function memoize(func, resolver) {
+      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      var memoized = function() {
+        var args = arguments,
+          key = resolver ? resolver.apply(this, args) : args[0],
+          cache = memoized.cache;
+
+        if (cache.has(key)) {
+          return cache.get(key);
+        }
+        var result = func.apply(this, args);
+        memoized.cache = cache.set(key, result) || cache;
+        return result;
+      };
+      memoized.cache = new(memoize.Cache || MapCache);
+      return memoized;
+    }
+
+    // Expose `MapCache`.
+    memoize.Cache = MapCache;
+
+    /**
+     * Creates a function that negates the result of the predicate `func`. The
+     * `func` predicate is invoked with the `this` binding and arguments of the
+     * created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} predicate The predicate to negate.
+     * @returns {Function} Returns the new negated function.
+     * @example
+     *
+     * function isEven(n) {
+     *   return n % 2 == 0;
+     * }
+     *
+     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+     * // => [1, 3, 5]
+     */
+    function negate(predicate) {
+      if (typeof predicate != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      return function() {
+        var args = arguments;
+        switch (args.length) {
+          case 0:
+            return !predicate.call(this);
+          case 1:
+            return !predicate.call(this, args[0]);
+          case 2:
+            return !predicate.call(this, args[0], args[1]);
+          case 3:
+            return !predicate.call(this, args[0], args[1], args[2]);
+        }
+        return !predicate.apply(this, args);
+      };
+    }
+
+    /**
+     * Creates a function that is restricted to invoking `func` once. Repeat calls
+     * to the function return the value of the first invocation. The `func` is
+     * invoked with the `this` binding and arguments of the created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * var initialize = _.once(createApplication);
+     * initialize();
+     * initialize();
+     * // => `createApplication` is invoked once
+     */
+    function once(func) {
+      return before(2, func);
+    }
+
+    /**
+     * Creates a function that invokes `func` with its arguments transformed.
+     *
+     * @static
+     * @since 4.0.0
+     * @memberOf _
+     * @category Function
+     * @param {Function} func The function to wrap.
+     * @param {...(Function|Function[])} [transforms=[_.identity]]
+     *  The argument transforms.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * function doubled(n) {
+     *   return n * 2;
+     * }
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var func = _.overArgs(function(x, y) {
+     *   return [x, y];
+     * }, [square, doubled]);
+     *
+     * func(9, 3);
+     * // => [81, 6]
+     *
+     * func(10, 5);
+     * // => [100, 10]
+     */
+    var overArgs = castRest(function(func, transforms) {
+      transforms = (transforms.length == 1 && isArray(transforms[0])) ?
+        arrayMap(transforms[0], baseUnary(getIteratee())) :
+        arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
+
+      var funcsLength = transforms.length;
+      return baseRest(function(args) {
+        var index = -1,
+          length = nativeMin(args.length, funcsLength);
+
+        while (++index < length) {
+          args[index] = transforms[index].call(this, args[index]);
+        }
+        return apply(func, this, args);
+      });
+    });
+
+    /**
+     * Creates a function that invokes `func` with `partials` prepended to the
+     * arguments it receives. This method is like `_.bind` except it does **not**
+     * alter the `this` binding.
+     *
+     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of partially
+     * applied functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.2.0
+     * @category Function
+     * @param {Function} func The function to partially apply arguments to.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new partially applied function.
+     * @example
+     *
+     * function greet(greeting, name) {
+     *   return greeting + ' ' + name;
+     * }
+     *
+     * var sayHelloTo = _.partial(greet, 'hello');
+     * sayHelloTo('fred');
+     * // => 'hello fred'
+     *
+     * // Partially applied with placeholders.
+     * var greetFred = _.partial(greet, _, 'fred');
+     * greetFred('hi');
+     * // => 'hi fred'
+     */
+    var partial = baseRest(function(func, partials) {
+      var holders = replaceHolders(partials, getHolder(partial));
+      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
+    });
+
+    /**
+     * This method is like `_.partial` except that partially applied arguments
+     * are appended to the arguments it receives.
+     *
+     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of partially
+     * applied functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Function
+     * @param {Function} func The function to partially apply arguments to.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new partially applied function.
+     * @example
+     *
+     * function greet(greeting, name) {
+     *   return greeting + ' ' + name;
+     * }
+     *
+     * var greetFred = _.partialRight(greet, 'fred');
+     * greetFred('hi');
+     * // => 'hi fred'
+     *
+     * // Partially applied with placeholders.
+     * var sayHelloTo = _.partialRight(greet, 'hello', _);
+     * sayHelloTo('fred');
+     * // => 'hello fred'
+     */
+    var partialRight = baseRest(function(func, partials) {
+      var holders = replaceHolders(partials, getHolder(partialRight));
+      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
+    });
+
+    /**
+     * Creates a function that invokes `func` with arguments arranged according
+     * to the specified `indexes` where the argument value at the first index is
+     * provided as the first argument, the argument value at the second index is
+     * provided as the second argument, and so on.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to rearrange arguments for.
+     * @param {...(number|number[])} indexes The arranged argument indexes.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var rearged = _.rearg(function(a, b, c) {
+     *   return [a, b, c];
+     * }, [2, 0, 1]);
+     *
+     * rearged('b', 'c', 'a')
+     * // => ['a', 'b', 'c']
+     */
+    var rearg = flatRest(function(func, indexes) {
+      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
+    });
+
+    /**
+     * Creates a function that invokes `func` with the `this` binding of the
+     * created function and arguments from `start` and beyond provided as
+     * an array.
+     *
+     * **Note:** This method is based on the
+     * [rest parameter](https://mdn.io/rest_parameters).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var say = _.rest(function(what, names) {
+     *   return what + ' ' + _.initial(names).join(', ') +
+     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+     * });
+     *
+     * say('hello', 'fred', 'barney', 'pebbles');
+     * // => 'hello fred, barney, & pebbles'
+     */
+    function rest(func, start) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      start = start === undefined ? start : toInteger(start);
+      return baseRest(func, start);
+    }
+
+    /**
+     * Creates a function that invokes `func` with the `this` binding of the
+     * create function and an array of arguments much like
+     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
+     *
+     * **Note:** This method is based on the
+     * [spread operator](https://mdn.io/spread_operator).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Function
+     * @param {Function} func The function to spread arguments over.
+     * @param {number} [start=0] The start position of the spread.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var say = _.spread(function(who, what) {
+     *   return who + ' says ' + what;
+     * });
+     *
+     * say(['fred', 'hello']);
+     * // => 'fred says hello'
+     *
+     * var numbers = Promise.all([
+     *   Promise.resolve(40),
+     *   Promise.resolve(36)
+     * ]);
+     *
+     * numbers.then(_.spread(function(x, y) {
+     *   return x + y;
+     * }));
+     * // => a Promise of 76
+     */
+    function spread(func, start) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      start = start == null ? 0 : nativeMax(toInteger(start), 0);
+      return baseRest(function(args) {
+        var array = args[start],
+          otherArgs = castSlice(args, 0, start);
+
+        if (array) {
+          arrayPush(otherArgs, array);
+        }
+        return apply(func, this, otherArgs);
+      });
+    }
+
+    /**
+     * Creates a throttled function that only invokes `func` at most once per
+     * every `wait` milliseconds. The throttled function comes with a `cancel`
+     * method to cancel delayed `func` invocations and a `flush` method to
+     * immediately invoke them. Provide `options` to indicate whether `func`
+     * should be invoked on the leading and/or trailing edge of the `wait`
+     * timeout. The `func` is invoked with the last arguments provided to the
+     * throttled function. Subsequent calls to the throttled function return the
+     * result of the last `func` invocation.
+     *
+     * **Note:** If `leading` and `trailing` options are `true`, `func` is
+     * invoked on the trailing edge of the timeout only if the throttled function
+     * is invoked more than once during the `wait` timeout.
+     *
+     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+     *
+     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+     * for details over the differences between `_.throttle` and `_.debounce`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to throttle.
+     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.leading=true]
+     *  Specify invoking on the leading edge of the timeout.
+     * @param {boolean} [options.trailing=true]
+     *  Specify invoking on the trailing edge of the timeout.
+     * @returns {Function} Returns the new throttled function.
+     * @example
+     *
+     * // Avoid excessively updating the position while scrolling.
+     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+     *
+     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+     * jQuery(element).on('click', throttled);
+     *
+     * // Cancel the trailing throttled invocation.
+     * jQuery(window).on('popstate', throttled.cancel);
+     */
+    function throttle(func, wait, options) {
+      var leading = true,
+        trailing = true;
+
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      if (isObject(options)) {
+        leading = 'leading' in options ? !!options.leading : leading;
+        trailing = 'trailing' in options ? !!options.trailing : trailing;
+      }
+      return debounce(func, wait, {
+        'leading': leading,
+        'maxWait': wait,
+        'trailing': trailing
+      });
+    }
+
+    /**
+     * Creates a function that accepts up to one argument, ignoring any
+     * additional arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to cap arguments for.
+     * @returns {Function} Returns the new capped function.
+     * @example
+     *
+     * _.map(['6', '8', '10'], _.unary(parseInt));
+     * // => [6, 8, 10]
+     */
+    function unary(func) {
+      return ary(func, 1);
+    }
+
+    /**
+     * Creates a function that provides `value` to `wrapper` as its first
+     * argument. Any additional arguments provided to the function are appended
+     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+     * binding of the created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {*} value The value to wrap.
+     * @param {Function} [wrapper=identity] The wrapper function.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var p = _.wrap(_.escape, function(func, text) {
+     *   return '<p>' + func(text) + '</p>';
+     * });
+     *
+     * p('fred, barney, & pebbles');
+     * // => '<p>fred, barney, &amp; pebbles</p>'
+     */
+    function wrap(value, wrapper) {
+      return partial(castFunction(wrapper), value);
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Casts `value` as an array if it's not one.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.4.0
+     * @category Lang
+     * @param {*} value The value to inspect.
+     * @returns {Array} Returns the cast array.
+     * @example
+     *
+     * _.castArray(1);
+     * // => [1]
+     *
+     * _.castArray({ 'a': 1 });
+     * // => [{ 'a': 1 }]
+     *
+     * _.castArray('abc');
+     * // => ['abc']
+     *
+     * _.castArray(null);
+     * // => [null]
+     *
+     * _.castArray(undefined);
+     * // => [undefined]
+     *
+     * _.castArray();
+     * // => []
+     *
+     * var array = [1, 2, 3];
+     * console.log(_.castArray(array) === array);
+     * // => true
+     */
+    function castArray() {
+      if (!arguments.length) {
+        return [];
+      }
+      var value = arguments[0];
+      return isArray(value) ? value : [value];
+    }
+
+    /**
+     * Creates a shallow clone of `value`.
+     *
+     * **Note:** This method is loosely based on the
+     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+     * and supports cloning arrays, array buffers, booleans, date objects, maps,
+     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+     * arrays. The own enumerable properties of `arguments` objects are cloned
+     * as plain objects. An empty object is returned for uncloneable values such
+     * as error objects, functions, DOM nodes, and WeakMaps.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to clone.
+     * @returns {*} Returns the cloned value.
+     * @see _.cloneDeep
+     * @example
+     *
+     * var objects = [{ 'a': 1 }, { 'b': 2 }];
+     *
+     * var shallow = _.clone(objects);
+     * console.log(shallow[0] === objects[0]);
+     * // => true
+     */
+    function clone(value) {
+      return baseClone(value, CLONE_SYMBOLS_FLAG);
+    }
+
+    /**
+     * This method is like `_.clone` except that it accepts `customizer` which
+     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
+     * cloning is handled by the method instead. The `customizer` is invoked with
+     * up to four arguments; (value [, index|key, object, stack]).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to clone.
+     * @param {Function} [customizer] The function to customize cloning.
+     * @returns {*} Returns the cloned value.
+     * @see _.cloneDeepWith
+     * @example
+     *
+     * function customizer(value) {
+     *   if (_.isElement(value)) {
+     *     return value.cloneNode(false);
+     *   }
+     * }
+     *
+     * var el = _.cloneWith(document.body, customizer);
+     *
+     * console.log(el === document.body);
+     * // => false
+     * console.log(el.nodeName);
+     * // => 'BODY'
+     * console.log(el.childNodes.length);
+     * // => 0
+     */
+    function cloneWith(value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
+    }
+
+    /**
+     * This method is like `_.clone` except that it recursively clones `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Lang
+     * @param {*} value The value to recursively clone.
+     * @returns {*} Returns the deep cloned value.
+     * @see _.clone
+     * @example
+     *
+     * var objects = [{ 'a': 1 }, { 'b': 2 }];
+     *
+     * var deep = _.cloneDeep(objects);
+     * console.log(deep[0] === objects[0]);
+     * // => false
+     */
+    function cloneDeep(value) {
+      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
+    }
+
+    /**
+     * This method is like `_.cloneWith` except that it recursively clones `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to recursively clone.
+     * @param {Function} [customizer] The function to customize cloning.
+     * @returns {*} Returns the deep cloned value.
+     * @see _.cloneWith
+     * @example
+     *
+     * function customizer(value) {
+     *   if (_.isElement(value)) {
+     *     return value.cloneNode(true);
+     *   }
+     * }
+     *
+     * var el = _.cloneDeepWith(document.body, customizer);
+     *
+     * console.log(el === document.body);
+     * // => false
+     * console.log(el.nodeName);
+     * // => 'BODY'
+     * console.log(el.childNodes.length);
+     * // => 20
+     */
+    function cloneDeepWith(value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
+    }
+
+    /**
+     * Checks if `object` conforms to `source` by invoking the predicate
+     * properties of `source` with the corresponding property values of `object`.
+     *
+     * **Note:** This method is equivalent to `_.conforms` when `source` is
+     * partially applied.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.14.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     *
+     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+     * // => true
+     *
+     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+     * // => false
+     */
+    function conformsTo(object, source) {
+      return source == null || baseConformsTo(object, source, keys(source));
+    }
+
+    /**
+     * Performs a
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * comparison between two values to determine if they are equivalent.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     * var other = { 'a': 1 };
+     *
+     * _.eq(object, object);
+     * // => true
+     *
+     * _.eq(object, other);
+     * // => false
+     *
+     * _.eq('a', 'a');
+     * // => true
+     *
+     * _.eq('a', Object('a'));
+     * // => false
+     *
+     * _.eq(NaN, NaN);
+     * // => true
+     */
+    function eq(value, other) {
+      return value === other || (value !== value && other !== other);
+    }
+
+    /**
+     * Checks if `value` is greater than `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than `other`,
+     *  else `false`.
+     * @see _.lt
+     * @example
+     *
+     * _.gt(3, 1);
+     * // => true
+     *
+     * _.gt(3, 3);
+     * // => false
+     *
+     * _.gt(1, 3);
+     * // => false
+     */
+    var gt = createRelationalOperation(baseGt);
+
+    /**
+     * Checks if `value` is greater than or equal to `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than or equal to
+     *  `other`, else `false`.
+     * @see _.lte
+     * @example
+     *
+     * _.gte(3, 1);
+     * // => true
+     *
+     * _.gte(3, 3);
+     * // => true
+     *
+     * _.gte(1, 3);
+     * // => false
+     */
+    var gte = createRelationalOperation(function(value, other) {
+      return value >= other;
+    });
+
+    /**
+     * Checks if `value` is likely an `arguments` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+     *  else `false`.
+     * @example
+     *
+     * _.isArguments(function() { return arguments; }());
+     * // => true
+     *
+     * _.isArguments([1, 2, 3]);
+     * // => false
+     */
+    var isArguments = baseIsArguments(function() {
+      return arguments;
+    }()) ? baseIsArguments : function(value) {
+      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
+        !propertyIsEnumerable.call(value, 'callee');
+    };
+
+    /**
+     * Checks if `value` is classified as an `Array` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+     * @example
+     *
+     * _.isArray([1, 2, 3]);
+     * // => true
+     *
+     * _.isArray(document.body.children);
+     * // => false
+     *
+     * _.isArray('abc');
+     * // => false
+     *
+     * _.isArray(_.noop);
+     * // => false
+     */
+    var isArray = Array.isArray;
+
+    /**
+     * Checks if `value` is classified as an `ArrayBuffer` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+     * @example
+     *
+     * _.isArrayBuffer(new ArrayBuffer(2));
+     * // => true
+     *
+     * _.isArrayBuffer(new Array(2));
+     * // => false
+     */
+    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
+
+    /**
+     * Checks if `value` is array-like. A value is considered array-like if it's
+     * not a function and has a `value.length` that's an integer greater than or
+     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+     * @example
+     *
+     * _.isArrayLike([1, 2, 3]);
+     * // => true
+     *
+     * _.isArrayLike(document.body.children);
+     * // => true
+     *
+     * _.isArrayLike('abc');
+     * // => true
+     *
+     * _.isArrayLike(_.noop);
+     * // => false
+     */
+    function isArrayLike(value) {
+      return value != null && isLength(value.length) && !isFunction(value);
+    }
+
+    /**
+     * This method is like `_.isArrayLike` except that it also checks if `value`
+     * is an object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array-like object,
+     *  else `false`.
+     * @example
+     *
+     * _.isArrayLikeObject([1, 2, 3]);
+     * // => true
+     *
+     * _.isArrayLikeObject(document.body.children);
+     * // => true
+     *
+     * _.isArrayLikeObject('abc');
+     * // => false
+     *
+     * _.isArrayLikeObject(_.noop);
+     * // => false
+     */
+    function isArrayLikeObject(value) {
+      return isObjectLike(value) && isArrayLike(value);
+    }
+
+    /**
+     * Checks if `value` is classified as a boolean primitive or object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
+     * @example
+     *
+     * _.isBoolean(false);
+     * // => true
+     *
+     * _.isBoolean(null);
+     * // => false
+     */
+    function isBoolean(value) {
+      return value === true || value === false ||
+        (isObjectLike(value) && baseGetTag(value) == boolTag);
+    }
+
+    /**
+     * Checks if `value` is a buffer.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+     * @example
+     *
+     * _.isBuffer(new Buffer(2));
+     * // => true
+     *
+     * _.isBuffer(new Uint8Array(2));
+     * // => false
+     */
+    var isBuffer = nativeIsBuffer || stubFalse;
+
+    /**
+     * Checks if `value` is classified as a `Date` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+     * @example
+     *
+     * _.isDate(new Date);
+     * // => true
+     *
+     * _.isDate('Mon April 23 2012');
+     * // => false
+     */
+    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
+
+    /**
+     * Checks if `value` is likely a DOM element.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+     * @example
+     *
+     * _.isElement(document.body);
+     * // => true
+     *
+     * _.isElement('<body>');
+     * // => false
+     */
+    function isElement(value) {
+      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
+    }
+
+    /**
+     * Checks if `value` is an empty object, collection, map, or set.
+     *
+     * Objects are considered empty if they have no own enumerable string keyed
+     * properties.
+     *
+     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+     * jQuery-like collections are considered empty if they have a `length` of `0`.
+     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+     * @example
+     *
+     * _.isEmpty(null);
+     * // => true
+     *
+     * _.isEmpty(true);
+     * // => true
+     *
+     * _.isEmpty(1);
+     * // => true
+     *
+     * _.isEmpty([1, 2, 3]);
+     * // => false
+     *
+     * _.isEmpty({ 'a': 1 });
+     * // => false
+     */
+    function isEmpty(value) {
+      if (value == null) {
+        return true;
+      }
+      if (isArrayLike(value) &&
+        (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
+          isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+        return !value.length;
+      }
+      var tag = getTag(value);
+      if (tag == mapTag || tag == setTag) {
+        return !value.size;
+      }
+      if (isPrototype(value)) {
+        return !baseKeys(value).length;
+      }
+      for (var key in value) {
+        if (hasOwnProperty.call(value, key)) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    /**
+     * Performs a deep comparison between two values to determine if they are
+     * equivalent.
+     *
+     * **Note:** This method supports comparing arrays, array buffers, booleans,
+     * date objects, error objects, maps, numbers, `Object` objects, regexes,
+     * sets, strings, symbols, and typed arrays. `Object` objects are compared
+     * by their own, not inherited, enumerable properties. Functions and DOM
+     * nodes are compared by strict equality, i.e. `===`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     * var other = { 'a': 1 };
+     *
+     * _.isEqual(object, other);
+     * // => true
+     *
+     * object === other;
+     * // => false
+     */
+    function isEqual(value, other) {
+      return baseIsEqual(value, other);
+    }
+
+    /**
+     * This method is like `_.isEqual` except that it accepts `customizer` which
+     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+     * are handled by the method instead. The `customizer` is invoked with up to
+     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * function isGreeting(value) {
+     *   return /^h(?:i|ello)$/.test(value);
+     * }
+     *
+     * function customizer(objValue, othValue) {
+     *   if (isGreeting(objValue) && isGreeting(othValue)) {
+     *     return true;
+     *   }
+     * }
+     *
+     * var array = ['hello', 'goodbye'];
+     * var other = ['hi', 'goodbye'];
+     *
+     * _.isEqualWith(array, other, customizer);
+     * // => true
+     */
+    function isEqualWith(value, other, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      var result = customizer ? customizer(value, other) : undefined;
+      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
+    }
+
+    /**
+     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+     * `SyntaxError`, `TypeError`, or `URIError` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+     * @example
+     *
+     * _.isError(new Error);
+     * // => true
+     *
+     * _.isError(Error);
+     * // => false
+     */
+    function isError(value) {
+      if (!isObjectLike(value)) {
+        return false;
+      }
+      var tag = baseGetTag(value);
+      return tag == errorTag || tag == domExcTag ||
+        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
+    }
+
+    /**
+     * Checks if `value` is a finite primitive number.
+     *
+     * **Note:** This method is based on
+     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+     * @example
+     *
+     * _.isFinite(3);
+     * // => true
+     *
+     * _.isFinite(Number.MIN_VALUE);
+     * // => true
+     *
+     * _.isFinite(Infinity);
+     * // => false
+     *
+     * _.isFinite('3');
+     * // => false
+     */
+    function isFinite(value) {
+      return typeof value == 'number' && nativeIsFinite(value);
+    }
+
+    /**
+     * Checks if `value` is classified as a `Function` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+     * @example
+     *
+     * _.isFunction(_);
+     * // => true
+     *
+     * _.isFunction(/abc/);
+     * // => false
+     */
+    function isFunction(value) {
+      if (!isObject(value)) {
+        return false;
+      }
+      // The use of `Object#toString` avoids issues with the `typeof` operator
+      // in Safari 9 which returns 'object' for typed arrays and other constructors.
+      var tag = baseGetTag(value);
+      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+    }
+
+    /**
+     * Checks if `value` is an integer.
+     *
+     * **Note:** This method is based on
+     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
+     * @example
+     *
+     * _.isInteger(3);
+     * // => true
+     *
+     * _.isInteger(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isInteger(Infinity);
+     * // => false
+     *
+     * _.isInteger('3');
+     * // => false
+     */
+    function isInteger(value) {
+      return typeof value == 'number' && value == toInteger(value);
+    }
+
+    /**
+     * Checks if `value` is a valid array-like length.
+     *
+     * **Note:** This method is loosely based on
+     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+     * @example
+     *
+     * _.isLength(3);
+     * // => true
+     *
+     * _.isLength(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isLength(Infinity);
+     * // => false
+     *
+     * _.isLength('3');
+     * // => false
+     */
+    function isLength(value) {
+      return typeof value == 'number' &&
+        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+    }
+
+    /**
+     * Checks if `value` is the
+     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+     * @example
+     *
+     * _.isObject({});
+     * // => true
+     *
+     * _.isObject([1, 2, 3]);
+     * // => true
+     *
+     * _.isObject(_.noop);
+     * // => true
+     *
+     * _.isObject(null);
+     * // => false
+     */
+    function isObject(value) {
+      var type = typeof value;
+      return value != null && (type == 'object' || type == 'function');
+    }
+
+    /**
+     * Checks if `value` is object-like. A value is object-like if it's not `null`
+     * and has a `typeof` result of "object".
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+     * @example
+     *
+     * _.isObjectLike({});
+     * // => true
+     *
+     * _.isObjectLike([1, 2, 3]);
+     * // => true
+     *
+     * _.isObjectLike(_.noop);
+     * // => false
+     *
+     * _.isObjectLike(null);
+     * // => false
+     */
+    function isObjectLike(value) {
+      return value != null && typeof value == 'object';
+    }
+
+    /**
+     * Checks if `value` is classified as a `Map` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+     * @example
+     *
+     * _.isMap(new Map);
+     * // => true
+     *
+     * _.isMap(new WeakMap);
+     * // => false
+     */
+    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+
+    /**
+     * Performs a partial deep comparison between `object` and `source` to
+     * determine if `object` contains equivalent property values.
+     *
+     * **Note:** This method is equivalent to `_.matches` when `source` is
+     * partially applied.
+     *
+     * Partial comparisons will match empty array and empty object `source`
+     * values against any array or object value, respectively. See `_.isEqual`
+     * for a list of supported value comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     *
+     * _.isMatch(object, { 'b': 2 });
+     * // => true
+     *
+     * _.isMatch(object, { 'b': 1 });
+     * // => false
+     */
+    function isMatch(object, source) {
+      return object === source || baseIsMatch(object, source, getMatchData(source));
+    }
+
+    /**
+     * This method is like `_.isMatch` except that it accepts `customizer` which
+     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+     * are handled by the method instead. The `customizer` is invoked with five
+     * arguments: (objValue, srcValue, index|key, object, source).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     * @example
+     *
+     * function isGreeting(value) {
+     *   return /^h(?:i|ello)$/.test(value);
+     * }
+     *
+     * function customizer(objValue, srcValue) {
+     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
+     *     return true;
+     *   }
+     * }
+     *
+     * var object = { 'greeting': 'hello' };
+     * var source = { 'greeting': 'hi' };
+     *
+     * _.isMatchWith(object, source, customizer);
+     * // => true
+     */
+    function isMatchWith(object, source, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseIsMatch(object, source, getMatchData(source), customizer);
+    }
+
+    /**
+     * Checks if `value` is `NaN`.
+     *
+     * **Note:** This method is based on
+     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
+     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
+     * `undefined` and other non-number values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+     * @example
+     *
+     * _.isNaN(NaN);
+     * // => true
+     *
+     * _.isNaN(new Number(NaN));
+     * // => true
+     *
+     * isNaN(undefined);
+     * // => true
+     *
+     * _.isNaN(undefined);
+     * // => false
+     */
+    function isNaN(value) {
+      // An `NaN` primitive is the only value that is not equal to itself.
+      // Perform the `toStringTag` check first to avoid errors with some
+      // ActiveX objects in IE.
+      return isNumber(value) && value != +value;
+    }
+
+    /**
+     * Checks if `value` is a pristine native function.
+     *
+     * **Note:** This method can't reliably detect native functions in the presence
+     * of the core-js package because core-js circumvents this kind of detection.
+     * Despite multiple requests, the core-js maintainer has made it clear: any
+     * attempt to fix the detection will be obstructed. As a result, we're left
+     * with little choice but to throw an error. Unfortunately, this also affects
+     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+     * which rely on core-js.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a native function,
+     *  else `false`.
+     * @example
+     *
+     * _.isNative(Array.prototype.push);
+     * // => true
+     *
+     * _.isNative(_);
+     * // => false
+     */
+    function isNative(value) {
+      if (isMaskable(value)) {
+        throw new Error(CORE_ERROR_TEXT);
+      }
+      return baseIsNative(value);
+    }
+
+    /**
+     * Checks if `value` is `null`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+     * @example
+     *
+     * _.isNull(null);
+     * // => true
+     *
+     * _.isNull(void 0);
+     * // => false
+     */
+    function isNull(value) {
+      return value === null;
+    }
+
+    /**
+     * Checks if `value` is `null` or `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
+     * @example
+     *
+     * _.isNil(null);
+     * // => true
+     *
+     * _.isNil(void 0);
+     * // => true
+     *
+     * _.isNil(NaN);
+     * // => false
+     */
+    function isNil(value) {
+      return value == null;
+    }
+
+    /**
+     * Checks if `value` is classified as a `Number` primitive or object.
+     *
+     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
+     * classified as numbers, use the `_.isFinite` method.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
+     * @example
+     *
+     * _.isNumber(3);
+     * // => true
+     *
+     * _.isNumber(Number.MIN_VALUE);
+     * // => true
+     *
+     * _.isNumber(Infinity);
+     * // => true
+     *
+     * _.isNumber('3');
+     * // => false
+     */
+    function isNumber(value) {
+      return typeof value == 'number' ||
+        (isObjectLike(value) && baseGetTag(value) == numberTag);
+    }
+
+    /**
+     * Checks if `value` is a plain object, that is, an object created by the
+     * `Object` constructor or one with a `[[Prototype]]` of `null`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.8.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * _.isPlainObject(new Foo);
+     * // => false
+     *
+     * _.isPlainObject([1, 2, 3]);
+     * // => false
+     *
+     * _.isPlainObject({ 'x': 0, 'y': 0 });
+     * // => true
+     *
+     * _.isPlainObject(Object.create(null));
+     * // => true
+     */
+    function isPlainObject(value) {
+      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+        return false;
+      }
+      var proto = getPrototype(value);
+      if (proto === null) {
+        return true;
+      }
+      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+        funcToString.call(Ctor) == objectCtorString;
+    }
+
+    /**
+     * Checks if `value` is classified as a `RegExp` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+     * @example
+     *
+     * _.isRegExp(/abc/);
+     * // => true
+     *
+     * _.isRegExp('/abc/');
+     * // => false
+     */
+    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
+
+    /**
+     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+     * double precision number which isn't the result of a rounded unsafe integer.
+     *
+     * **Note:** This method is based on
+     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
+     * @example
+     *
+     * _.isSafeInteger(3);
+     * // => true
+     *
+     * _.isSafeInteger(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isSafeInteger(Infinity);
+     * // => false
+     *
+     * _.isSafeInteger('3');
+     * // => false
+     */
+    function isSafeInteger(value) {
+      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
+    }
+
+    /**
+     * Checks if `value` is classified as a `Set` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+     * @example
+     *
+     * _.isSet(new Set);
+     * // => true
+     *
+     * _.isSet(new WeakSet);
+     * // => false
+     */
+    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+
+    /**
+     * Checks if `value` is classified as a `String` primitive or object.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+     * @example
+     *
+     * _.isString('abc');
+     * // => true
+     *
+     * _.isString(1);
+     * // => false
+     */
+    function isString(value) {
+      return typeof value == 'string' ||
+        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
+    }
+
+    /**
+     * Checks if `value` is classified as a `Symbol` primitive or object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+     * @example
+     *
+     * _.isSymbol(Symbol.iterator);
+     * // => true
+     *
+     * _.isSymbol('abc');
+     * // => false
+     */
+    function isSymbol(value) {
+      return typeof value == 'symbol' ||
+        (isObjectLike(value) && baseGetTag(value) == symbolTag);
+    }
+
+    /**
+     * Checks if `value` is classified as a typed array.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+     * @example
+     *
+     * _.isTypedArray(new Uint8Array);
+     * // => true
+     *
+     * _.isTypedArray([]);
+     * // => false
+     */
+    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+
+    /**
+     * Checks if `value` is `undefined`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+     * @example
+     *
+     * _.isUndefined(void 0);
+     * // => true
+     *
+     * _.isUndefined(null);
+     * // => false
+     */
+    function isUndefined(value) {
+      return value === undefined;
+    }
+
+    /**
+     * Checks if `value` is classified as a `WeakMap` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
+     * @example
+     *
+     * _.isWeakMap(new WeakMap);
+     * // => true
+     *
+     * _.isWeakMap(new Map);
+     * // => false
+     */
+    function isWeakMap(value) {
+      return isObjectLike(value) && getTag(value) == weakMapTag;
+    }
+
+    /**
+     * Checks if `value` is classified as a `WeakSet` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
+     * @example
+     *
+     * _.isWeakSet(new WeakSet);
+     * // => true
+     *
+     * _.isWeakSet(new Set);
+     * // => false
+     */
+    function isWeakSet(value) {
+      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
+    }
+
+    /**
+     * Checks if `value` is less than `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than `other`,
+     *  else `false`.
+     * @see _.gt
+     * @example
+     *
+     * _.lt(1, 3);
+     * // => true
+     *
+     * _.lt(3, 3);
+     * // => false
+     *
+     * _.lt(3, 1);
+     * // => false
+     */
+    var lt = createRelationalOperation(baseLt);
+
+    /**
+     * Checks if `value` is less than or equal to `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than or equal to
+     *  `other`, else `false`.
+     * @see _.gte
+     * @example
+     *
+     * _.lte(1, 3);
+     * // => true
+     *
+     * _.lte(3, 3);
+     * // => true
+     *
+     * _.lte(3, 1);
+     * // => false
+     */
+    var lte = createRelationalOperation(function(value, other) {
+      return value <= other;
+    });
+
+    /**
+     * Converts `value` to an array.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {Array} Returns the converted array.
+     * @example
+     *
+     * _.toArray({ 'a': 1, 'b': 2 });
+     * // => [1, 2]
+     *
+     * _.toArray('abc');
+     * // => ['a', 'b', 'c']
+     *
+     * _.toArray(1);
+     * // => []
+     *
+     * _.toArray(null);
+     * // => []
+     */
+    function toArray(value) {
+      if (!value) {
+        return [];
+      }
+      if (isArrayLike(value)) {
+        return isString(value) ? stringToArray(value) : copyArray(value);
+      }
+      if (symIterator && value[symIterator]) {
+        return iteratorToArray(value[symIterator]());
+      }
+      var tag = getTag(value),
+        func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
+
+      return func(value);
+    }
+
+    /**
+     * Converts `value` to a finite number.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.12.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted number.
+     * @example
+     *
+     * _.toFinite(3.2);
+     * // => 3.2
+     *
+     * _.toFinite(Number.MIN_VALUE);
+     * // => 5e-324
+     *
+     * _.toFinite(Infinity);
+     * // => 1.7976931348623157e+308
+     *
+     * _.toFinite('3.2');
+     * // => 3.2
+     */
+    function toFinite(value) {
+      if (!value) {
+        return value === 0 ? value : 0;
+      }
+      value = toNumber(value);
+      if (value === INFINITY || value === -INFINITY) {
+        var sign = (value < 0 ? -1 : 1);
+        return sign * MAX_INTEGER;
+      }
+      return value === value ? value : 0;
+    }
+
+    /**
+     * Converts `value` to an integer.
+     *
+     * **Note:** This method is loosely based on
+     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toInteger(3.2);
+     * // => 3
+     *
+     * _.toInteger(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toInteger(Infinity);
+     * // => 1.7976931348623157e+308
+     *
+     * _.toInteger('3.2');
+     * // => 3
+     */
+    function toInteger(value) {
+      var result = toFinite(value),
+        remainder = result % 1;
+
+      return result === result ? (remainder ? result - remainder : result) : 0;
+    }
+
+    /**
+     * Converts `value` to an integer suitable for use as the length of an
+     * array-like object.
+     *
+     * **Note:** This method is based on
+     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toLength(3.2);
+     * // => 3
+     *
+     * _.toLength(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toLength(Infinity);
+     * // => 4294967295
+     *
+     * _.toLength('3.2');
+     * // => 3
+     */
+    function toLength(value) {
+      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
+    }
+
+    /**
+     * Converts `value` to a number.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to process.
+     * @returns {number} Returns the number.
+     * @example
+     *
+     * _.toNumber(3.2);
+     * // => 3.2
+     *
+     * _.toNumber(Number.MIN_VALUE);
+     * // => 5e-324
+     *
+     * _.toNumber(Infinity);
+     * // => Infinity
+     *
+     * _.toNumber('3.2');
+     * // => 3.2
+     */
+    function toNumber(value) {
+      if (typeof value == 'number') {
+        return value;
+      }
+      if (isSymbol(value)) {
+        return NAN;
+      }
+      if (isObject(value)) {
+        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+        value = isObject(other) ? (other + '') : other;
+      }
+      if (typeof value != 'string') {
+        return value === 0 ? value : +value;
+      }
+      value = value.replace(reTrim, '');
+      var isBinary = reIsBinary.test(value);
+      return (isBinary || reIsOctal.test(value)) ?
+        freeParseInt(value.slice(2), isBinary ? 2 : 8) :
+        (reIsBadHex.test(value) ? NAN : +value);
+    }
+
+    /**
+     * Converts `value` to a plain object flattening inherited enumerable string
+     * keyed properties of `value` to own properties of the plain object.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {Object} Returns the converted plain object.
+     * @example
+     *
+     * function Foo() {
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.assign({ 'a': 1 }, new Foo);
+     * // => { 'a': 1, 'b': 2 }
+     *
+     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+     * // => { 'a': 1, 'b': 2, 'c': 3 }
+     */
+    function toPlainObject(value) {
+      return copyObject(value, keysIn(value));
+    }
+
+    /**
+     * Converts `value` to a safe integer. A safe integer can be compared and
+     * represented correctly.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toSafeInteger(3.2);
+     * // => 3
+     *
+     * _.toSafeInteger(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toSafeInteger(Infinity);
+     * // => 9007199254740991
+     *
+     * _.toSafeInteger('3.2');
+     * // => 3
+     */
+    function toSafeInteger(value) {
+      return value ?
+        baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) :
+        (value === 0 ? value : 0);
+    }
+
+    /**
+     * Converts `value` to a string. An empty string is returned for `null`
+     * and `undefined` values. The sign of `-0` is preserved.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.toString(null);
+     * // => ''
+     *
+     * _.toString(-0);
+     * // => '-0'
+     *
+     * _.toString([1, 2, 3]);
+     * // => '1,2,3'
+     */
+    function toString(value) {
+      return value == null ? '' : baseToString(value);
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Assigns own enumerable string keyed properties of source objects to the
+     * destination object. Source objects are applied from left to right.
+     * Subsequent sources overwrite property assignments of previous sources.
+     *
+     * **Note:** This method mutates `object` and is loosely based on
+     * [`Object.assign`](https://mdn.io/Object/assign).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.10.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.assignIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * function Bar() {
+     *   this.c = 3;
+     * }
+     *
+     * Foo.prototype.b = 2;
+     * Bar.prototype.d = 4;
+     *
+     * _.assign({ 'a': 0 }, new Foo, new Bar);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    var assign = createAssigner(function(object, source) {
+      if (isPrototype(source) || isArrayLike(source)) {
+        copyObject(source, keys(source), object);
+        return;
+      }
+      for (var key in source) {
+        if (hasOwnProperty.call(source, key)) {
+          assignValue(object, key, source[key]);
+        }
+      }
+    });
+
+    /**
+     * This method is like `_.assign` except that it iterates over own and
+     * inherited source properties.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias extend
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.assign
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * function Bar() {
+     *   this.c = 3;
+     * }
+     *
+     * Foo.prototype.b = 2;
+     * Bar.prototype.d = 4;
+     *
+     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
+     */
+    var assignIn = createAssigner(function(object, source) {
+      copyObject(source, keysIn(source), object);
+    });
+
+    /**
+     * This method is like `_.assignIn` except that it accepts `customizer`
+     * which is invoked to produce the assigned values. If `customizer` returns
+     * `undefined`, assignment is handled by the method instead. The `customizer`
+     * is invoked with five arguments: (objValue, srcValue, key, object, source).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias extendWith
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @see _.assignWith
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   return _.isUndefined(objValue) ? srcValue : objValue;
+     * }
+     *
+     * var defaults = _.partialRight(_.assignInWith, customizer);
+     *
+     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
+      copyObject(source, keysIn(source), object, customizer);
+    });
+
+    /**
+     * This method is like `_.assign` except that it accepts `customizer`
+     * which is invoked to produce the assigned values. If `customizer` returns
+     * `undefined`, assignment is handled by the method instead. The `customizer`
+     * is invoked with five arguments: (objValue, srcValue, key, object, source).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @see _.assignInWith
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   return _.isUndefined(objValue) ? srcValue : objValue;
+     * }
+     *
+     * var defaults = _.partialRight(_.assignWith, customizer);
+     *
+     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
+      copyObject(source, keys(source), object, customizer);
+    });
+
+    /**
+     * Creates an array of values corresponding to `paths` of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Array} Returns the picked values.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+     *
+     * _.at(object, ['a[0].b.c', 'a[1]']);
+     * // => [3, 4]
+     */
+    var at = flatRest(baseAt);
+
+    /**
+     * Creates an object that inherits from the `prototype` object. If a
+     * `properties` object is given, its own enumerable string keyed properties
+     * are assigned to the created object.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.3.0
+     * @category Object
+     * @param {Object} prototype The object to inherit from.
+     * @param {Object} [properties] The properties to assign to the object.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * function Shape() {
+     *   this.x = 0;
+     *   this.y = 0;
+     * }
+     *
+     * function Circle() {
+     *   Shape.call(this);
+     * }
+     *
+     * Circle.prototype = _.create(Shape.prototype, {
+     *   'constructor': Circle
+     * });
+     *
+     * var circle = new Circle;
+     * circle instanceof Circle;
+     * // => true
+     *
+     * circle instanceof Shape;
+     * // => true
+     */
+    function create(prototype, properties) {
+      var result = baseCreate(prototype);
+      return properties == null ? result : baseAssign(result, properties);
+    }
+
+    /**
+     * Assigns own and inherited enumerable string keyed properties of source
+     * objects to the destination object for all destination properties that
+     * resolve to `undefined`. Source objects are applied from left to right.
+     * Once a property is set, additional values of the same property are ignored.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.defaultsDeep
+     * @example
+     *
+     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var defaults = baseRest(function(object, sources) {
+      object = Object(object);
+
+      var index = -1;
+      var length = sources.length;
+      var guard = length > 2 ? sources[2] : undefined;
+
+      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+        length = 1;
+      }
+
+      while (++index < length) {
+        var source = sources[index];
+        var props = keysIn(source);
+        var propsIndex = -1;
+        var propsLength = props.length;
+
+        while (++propsIndex < propsLength) {
+          var key = props[propsIndex];
+          var value = object[key];
+
+          if (value === undefined ||
+            (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
+            object[key] = source[key];
+          }
+        }
+      }
+
+      return object;
+    });
+
+    /**
+     * This method is like `_.defaults` except that it recursively assigns
+     * default properties.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.defaults
+     * @example
+     *
+     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+     * // => { 'a': { 'b': 2, 'c': 3 } }
+     */
+    var defaultsDeep = baseRest(function(args) {
+      args.push(undefined, customDefaultsMerge);
+      return apply(mergeWith, undefined, args);
+    });
+
+    /**
+     * This method is like `_.find` except that it returns the key of the first
+     * element `predicate` returns truthy for instead of the element itself.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {string|undefined} Returns the key of the matched element,
+     *  else `undefined`.
+     * @example
+     *
+     * var users = {
+     *   'barney':  { 'age': 36, 'active': true },
+     *   'fred':    { 'age': 40, 'active': false },
+     *   'pebbles': { 'age': 1,  'active': true }
+     * };
+     *
+     * _.findKey(users, function(o) { return o.age < 40; });
+     * // => 'barney' (iteration order is not guaranteed)
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findKey(users, { 'age': 1, 'active': true });
+     * // => 'pebbles'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findKey(users, ['active', false]);
+     * // => 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findKey(users, 'active');
+     * // => 'barney'
+     */
+    function findKey(object, predicate) {
+      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
+    }
+
+    /**
+     * This method is like `_.findKey` except that it iterates over elements of
+     * a collection in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {string|undefined} Returns the key of the matched element,
+     *  else `undefined`.
+     * @example
+     *
+     * var users = {
+     *   'barney':  { 'age': 36, 'active': true },
+     *   'fred':    { 'age': 40, 'active': false },
+     *   'pebbles': { 'age': 1,  'active': true }
+     * };
+     *
+     * _.findLastKey(users, function(o) { return o.age < 40; });
+     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findLastKey(users, { 'age': 36, 'active': true });
+     * // => 'barney'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findLastKey(users, ['active', false]);
+     * // => 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findLastKey(users, 'active');
+     * // => 'pebbles'
+     */
+    function findLastKey(object, predicate) {
+      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
+    }
+
+    /**
+     * Iterates over own and inherited enumerable string keyed properties of an
+     * object and invokes `iteratee` for each property. The iteratee is invoked
+     * with three arguments: (value, key, object). Iteratee functions may exit
+     * iteration early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forInRight
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forIn(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+     */
+    function forIn(object, iteratee) {
+      return object == null ?
+        object :
+        baseFor(object, getIteratee(iteratee, 3), keysIn);
+    }
+
+    /**
+     * This method is like `_.forIn` except that it iterates over properties of
+     * `object` in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forInRight(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
+     */
+    function forInRight(object, iteratee) {
+      return object == null ?
+        object :
+        baseForRight(object, getIteratee(iteratee, 3), keysIn);
+    }
+
+    /**
+     * Iterates over own enumerable string keyed properties of an object and
+     * invokes `iteratee` for each property. The iteratee is invoked with three
+     * arguments: (value, key, object). Iteratee functions may exit iteration
+     * early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forOwnRight
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forOwn(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+     */
+    function forOwn(object, iteratee) {
+      return object && baseForOwn(object, getIteratee(iteratee, 3));
+    }
+
+    /**
+     * This method is like `_.forOwn` except that it iterates over properties of
+     * `object` in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forOwn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forOwnRight(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
+     */
+    function forOwnRight(object, iteratee) {
+      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
+    }
+
+    /**
+     * Creates an array of function property names from own enumerable properties
+     * of `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @returns {Array} Returns the function names.
+     * @see _.functionsIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = _.constant('a');
+     *   this.b = _.constant('b');
+     * }
+     *
+     * Foo.prototype.c = _.constant('c');
+     *
+     * _.functions(new Foo);
+     * // => ['a', 'b']
+     */
+    function functions(object) {
+      return object == null ? [] : baseFunctions(object, keys(object));
+    }
+
+    /**
+     * Creates an array of function property names from own and inherited
+     * enumerable properties of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @returns {Array} Returns the function names.
+     * @see _.functions
+     * @example
+     *
+     * function Foo() {
+     *   this.a = _.constant('a');
+     *   this.b = _.constant('b');
+     * }
+     *
+     * Foo.prototype.c = _.constant('c');
+     *
+     * _.functionsIn(new Foo);
+     * // => ['a', 'b', 'c']
+     */
+    function functionsIn(object) {
+      return object == null ? [] : baseFunctions(object, keysIn(object));
+    }
+
+    /**
+     * Gets the value at `path` of `object`. If the resolved value is
+     * `undefined`, the `defaultValue` is returned in its place.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to get.
+     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.get(object, 'a[0].b.c');
+     * // => 3
+     *
+     * _.get(object, ['a', '0', 'b', 'c']);
+     * // => 3
+     *
+     * _.get(object, 'a.b.c', 'default');
+     * // => 'default'
+     */
+    function get(object, path, defaultValue) {
+      var result = object == null ? undefined : baseGet(object, path);
+      return result === undefined ? defaultValue : result;
+    }
+
+    /**
+     * Checks if `path` is a direct property of `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     * @example
+     *
+     * var object = { 'a': { 'b': 2 } };
+     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+     *
+     * _.has(object, 'a');
+     * // => true
+     *
+     * _.has(object, 'a.b');
+     * // => true
+     *
+     * _.has(object, ['a', 'b']);
+     * // => true
+     *
+     * _.has(other, 'a');
+     * // => false
+     */
+    function has(object, path) {
+      return object != null && hasPath(object, path, baseHas);
+    }
+
+    /**
+     * Checks if `path` is a direct or inherited property of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     * @example
+     *
+     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+     *
+     * _.hasIn(object, 'a');
+     * // => true
+     *
+     * _.hasIn(object, 'a.b');
+     * // => true
+     *
+     * _.hasIn(object, ['a', 'b']);
+     * // => true
+     *
+     * _.hasIn(object, 'b');
+     * // => false
+     */
+    function hasIn(object, path) {
+      return object != null && hasPath(object, path, baseHasIn);
+    }
+
+    /**
+     * Creates an object composed of the inverted keys and values of `object`.
+     * If `object` contains duplicate values, subsequent values overwrite
+     * property assignments of previous values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.7.0
+     * @category Object
+     * @param {Object} object The object to invert.
+     * @returns {Object} Returns the new inverted object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2, 'c': 1 };
+     *
+     * _.invert(object);
+     * // => { '1': 'c', '2': 'b' }
+     */
+    var invert = createInverter(function(result, value, key) {
+      if (value != null &&
+        typeof value.toString != 'function') {
+        value = nativeObjectToString.call(value);
+      }
+
+      result[value] = key;
+    }, constant(identity));
+
+    /**
+     * This method is like `_.invert` except that the inverted object is generated
+     * from the results of running each element of `object` thru `iteratee`. The
+     * corresponding inverted value of each inverted key is an array of keys
+     * responsible for generating the inverted value. The iteratee is invoked
+     * with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.1.0
+     * @category Object
+     * @param {Object} object The object to invert.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Object} Returns the new inverted object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2, 'c': 1 };
+     *
+     * _.invertBy(object);
+     * // => { '1': ['a', 'c'], '2': ['b'] }
+     *
+     * _.invertBy(object, function(value) {
+     *   return 'group' + value;
+     * });
+     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
+     */
+    var invertBy = createInverter(function(result, value, key) {
+      if (value != null &&
+        typeof value.toString != 'function') {
+        value = nativeObjectToString.call(value);
+      }
+
+      if (hasOwnProperty.call(result, value)) {
+        result[value].push(key);
+      } else {
+        result[value] = [key];
+      }
+    }, getIteratee);
+
+    /**
+     * Invokes the method at `path` of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {*} Returns the result of the invoked method.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
+     *
+     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
+     * // => [2, 3]
+     */
+    var invoke = baseRest(baseInvoke);
+
+    /**
+     * Creates an array of the own enumerable property names of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects. See the
+     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+     * for more details.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.keys(new Foo);
+     * // => ['a', 'b'] (iteration order is not guaranteed)
+     *
+     * _.keys('hi');
+     * // => ['0', '1']
+     */
+    function keys(object) {
+      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+    }
+
+    /**
+     * Creates an array of the own and inherited enumerable property names of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.keysIn(new Foo);
+     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+     */
+    function keysIn(object) {
+      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+    }
+
+    /**
+     * The opposite of `_.mapValues`; this method creates an object with the
+     * same values as `object` and keys generated by running each own enumerable
+     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
+     * with three arguments: (value, key, object).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns the new mapped object.
+     * @see _.mapValues
+     * @example
+     *
+     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+     *   return key + value;
+     * });
+     * // => { 'a1': 1, 'b2': 2 }
+     */
+    function mapKeys(object, iteratee) {
+      var result = {};
+      iteratee = getIteratee(iteratee, 3);
+
+      baseForOwn(object, function(value, key, object) {
+        baseAssignValue(result, iteratee(value, key, object), value);
+      });
+      return result;
+    }
+
+    /**
+     * Creates an object with the same keys as `object` and values generated
+     * by running each own enumerable string keyed property of `object` thru
+     * `iteratee`. The iteratee is invoked with three arguments:
+     * (value, key, object).
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns the new mapped object.
+     * @see _.mapKeys
+     * @example
+     *
+     * var users = {
+     *   'fred':    { 'user': 'fred',    'age': 40 },
+     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
+     * };
+     *
+     * _.mapValues(users, function(o) { return o.age; });
+     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.mapValues(users, 'age');
+     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+     */
+    function mapValues(object, iteratee) {
+      var result = {};
+      iteratee = getIteratee(iteratee, 3);
+
+      baseForOwn(object, function(value, key, object) {
+        baseAssignValue(result, key, iteratee(value, key, object));
+      });
+      return result;
+    }
+
+    /**
+     * This method is like `_.assign` except that it recursively merges own and
+     * inherited enumerable string keyed properties of source objects into the
+     * destination object. Source properties that resolve to `undefined` are
+     * skipped if a destination value exists. Array and plain object properties
+     * are merged recursively. Other objects and value types are overridden by
+     * assignment. Source objects are applied from left to right. Subsequent
+     * sources overwrite property assignments of previous sources.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {
+     *   'a': [{ 'b': 2 }, { 'd': 4 }]
+     * };
+     *
+     * var other = {
+     *   'a': [{ 'c': 3 }, { 'e': 5 }]
+     * };
+     *
+     * _.merge(object, other);
+     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+     */
+    var merge = createAssigner(function(object, source, srcIndex) {
+      baseMerge(object, source, srcIndex);
+    });
+
+    /**
+     * This method is like `_.merge` except that it accepts `customizer` which
+     * is invoked to produce the merged values of the destination and source
+     * properties. If `customizer` returns `undefined`, merging is handled by the
+     * method instead. The `customizer` is invoked with six arguments:
+     * (objValue, srcValue, key, object, source, stack).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} customizer The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   if (_.isArray(objValue)) {
+     *     return objValue.concat(srcValue);
+     *   }
+     * }
+     *
+     * var object = { 'a': [1], 'b': [2] };
+     * var other = { 'a': [3], 'b': [4] };
+     *
+     * _.mergeWith(object, other, customizer);
+     * // => { 'a': [1, 3], 'b': [2, 4] }
+     */
+    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
+      baseMerge(object, source, srcIndex, customizer);
+    });
+
+    /**
+     * The opposite of `_.pick`; this method creates an object composed of the
+     * own and inherited enumerable property paths of `object` that are not omitted.
+     *
+     * **Note:** This method is considerably slower than `_.pick`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {...(string|string[])} [paths] The property paths to omit.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.omit(object, ['a', 'c']);
+     * // => { 'b': '2' }
+     */
+    var omit = flatRest(function(object, paths) {
+      var result = {};
+      if (object == null) {
+        return result;
+      }
+      var isDeep = false;
+      paths = arrayMap(paths, function(path) {
+        path = castPath(path, object);
+        isDeep || (isDeep = path.length > 1);
+        return path;
+      });
+      copyObject(object, getAllKeysIn(object), result);
+      if (isDeep) {
+        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
+      }
+      var length = paths.length;
+      while (length--) {
+        baseUnset(result, paths[length]);
+      }
+      return result;
+    });
+
+    /**
+     * The opposite of `_.pickBy`; this method creates an object composed of
+     * the own and inherited enumerable string keyed properties of `object` that
+     * `predicate` doesn't return truthy for. The predicate is invoked with two
+     * arguments: (value, key).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {Function} [predicate=_.identity] The function invoked per property.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.omitBy(object, _.isNumber);
+     * // => { 'b': '2' }
+     */
+    function omitBy(object, predicate) {
+      return pickBy(object, negate(getIteratee(predicate)));
+    }
+
+    /**
+     * Creates an object composed of the picked `object` properties.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.pick(object, ['a', 'c']);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    var pick = flatRest(function(object, paths) {
+      return object == null ? {} : basePick(object, paths);
+    });
+
+    /**
+     * Creates an object composed of the `object` properties `predicate` returns
+     * truthy for. The predicate is invoked with two arguments: (value, key).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {Function} [predicate=_.identity] The function invoked per property.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.pickBy(object, _.isNumber);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    function pickBy(object, predicate) {
+      if (object == null) {
+        return {};
+      }
+      var props = arrayMap(getAllKeysIn(object), function(prop) {
+        return [prop];
+      });
+      predicate = getIteratee(predicate);
+      return basePickBy(object, props, function(value, path) {
+        return predicate(value, path[0]);
+      });
+    }
+
+    /**
+     * This method is like `_.get` except that if the resolved value is a
+     * function it's invoked with the `this` binding of its parent object and
+     * its result is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to resolve.
+     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+     *
+     * _.result(object, 'a[0].b.c1');
+     * // => 3
+     *
+     * _.result(object, 'a[0].b.c2');
+     * // => 4
+     *
+     * _.result(object, 'a[0].b.c3', 'default');
+     * // => 'default'
+     *
+     * _.result(object, 'a[0].b.c3', _.constant('default'));
+     * // => 'default'
+     */
+    function result(object, path, defaultValue) {
+      path = castPath(path, object);
+
+      var index = -1,
+        length = path.length;
+
+      // Ensure the loop is entered when path is empty.
+      if (!length) {
+        length = 1;
+        object = undefined;
+      }
+      while (++index < length) {
+        var value = object == null ? undefined : object[toKey(path[index])];
+        if (value === undefined) {
+          index = length;
+          value = defaultValue;
+        }
+        object = isFunction(value) ? value.call(object) : value;
+      }
+      return object;
+    }
+
+    /**
+     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
+     * it's created. Arrays are created for missing index properties while objects
+     * are created for all other missing properties. Use `_.setWith` to customize
+     * `path` creation.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.set(object, 'a[0].b.c', 4);
+     * console.log(object.a[0].b.c);
+     * // => 4
+     *
+     * _.set(object, ['x', '0', 'y', 'z'], 5);
+     * console.log(object.x[0].y.z);
+     * // => 5
+     */
+    function set(object, path, value) {
+      return object == null ? object : baseSet(object, path, value);
+    }
+
+    /**
+     * This method is like `_.set` except that it accepts `customizer` which is
+     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+     * path creation is handled by the method instead. The `customizer` is invoked
+     * with three arguments: (nsValue, key, nsObject).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {};
+     *
+     * _.setWith(object, '[0][1]', 'a', Object);
+     * // => { '0': { '1': 'a' } }
+     */
+    function setWith(object, path, value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return object == null ? object : baseSet(object, path, value, customizer);
+    }
+
+    /**
+     * Creates an array of own enumerable string keyed-value pairs for `object`
+     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+     * entries are returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias entries
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the key-value pairs.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.toPairs(new Foo);
+     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+     */
+    var toPairs = createToPairs(keys);
+
+    /**
+     * Creates an array of own and inherited enumerable string keyed-value pairs
+     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
+     * or set, its entries are returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias entriesIn
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the key-value pairs.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.toPairsIn(new Foo);
+     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
+     */
+    var toPairsIn = createToPairs(keysIn);
+
+    /**
+     * An alternative to `_.reduce`; this method transforms `object` to a new
+     * `accumulator` object which is the result of running each of its own
+     * enumerable string keyed properties thru `iteratee`, with each invocation
+     * potentially mutating the `accumulator` object. If `accumulator` is not
+     * provided, a new object with the same `[[Prototype]]` will be used. The
+     * iteratee is invoked with four arguments: (accumulator, value, key, object).
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The custom accumulator value.
+     * @returns {*} Returns the accumulated value.
+     * @example
+     *
+     * _.transform([2, 3, 4], function(result, n) {
+     *   result.push(n *= n);
+     *   return n % 2 == 0;
+     * }, []);
+     * // => [4, 9]
+     *
+     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+     *   (result[value] || (result[value] = [])).push(key);
+     * }, {});
+     * // => { '1': ['a', 'c'], '2': ['b'] }
+     */
+    function transform(object, iteratee, accumulator) {
+      var isArr = isArray(object),
+        isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+
+      iteratee = getIteratee(iteratee, 4);
+      if (accumulator == null) {
+        var Ctor = object && object.constructor;
+        if (isArrLike) {
+          accumulator = isArr ? new Ctor : [];
+        } else if (isObject(object)) {
+          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+        } else {
+          accumulator = {};
+        }
+      }
+      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
+        return iteratee(accumulator, value, index, object);
+      });
+      return accumulator;
+    }
+
+    /**
+     * Removes the property at `path` of `object`.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to unset.
+     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
+     * _.unset(object, 'a[0].b.c');
+     * // => true
+     *
+     * console.log(object);
+     * // => { 'a': [{ 'b': {} }] };
+     *
+     * _.unset(object, ['a', '0', 'b', 'c']);
+     * // => true
+     *
+     * console.log(object);
+     * // => { 'a': [{ 'b': {} }] };
+     */
+    function unset(object, path) {
+      return object == null ? true : baseUnset(object, path);
+    }
+
+    /**
+     * This method is like `_.set` except that accepts `updater` to produce the
+     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
+     * is invoked with one argument: (value).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {Function} updater The function to produce the updated value.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
+     * console.log(object.a[0].b.c);
+     * // => 9
+     *
+     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
+     * console.log(object.x[0].y.z);
+     * // => 0
+     */
+    function update(object, path, updater) {
+      return object == null ? object : baseUpdate(object, path, castFunction(updater));
+    }
+
+    /**
+     * This method is like `_.update` except that it accepts `customizer` which is
+     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+     * path creation is handled by the method instead. The `customizer` is invoked
+     * with three arguments: (nsValue, key, nsObject).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {Function} updater The function to produce the updated value.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {};
+     *
+     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+     * // => { '0': { '1': 'a' } }
+     */
+    function updateWith(object, path, updater, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
+    }
+
+    /**
+     * Creates an array of the own enumerable string keyed property values of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property values.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.values(new Foo);
+     * // => [1, 2] (iteration order is not guaranteed)
+     *
+     * _.values('hi');
+     * // => ['h', 'i']
+     */
+    function values(object) {
+      return object == null ? [] : baseValues(object, keys(object));
+    }
+
+    /**
+     * Creates an array of the own and inherited enumerable string keyed property
+     * values of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property values.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.valuesIn(new Foo);
+     * // => [1, 2, 3] (iteration order is not guaranteed)
+     */
+    function valuesIn(object) {
+      return object == null ? [] : baseValues(object, keysIn(object));
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Clamps `number` within the inclusive `lower` and `upper` bounds.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Number
+     * @param {number} number The number to clamp.
+     * @param {number} [lower] The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the clamped number.
+     * @example
+     *
+     * _.clamp(-10, -5, 5);
+     * // => -5
+     *
+     * _.clamp(10, -5, 5);
+     * // => 5
+     */
+    function clamp(number, lower, upper) {
+      if (upper === undefined) {
+        upper = lower;
+        lower = undefined;
+      }
+      if (upper !== undefined) {
+        upper = toNumber(upper);
+        upper = upper === upper ? upper : 0;
+      }
+      if (lower !== undefined) {
+        lower = toNumber(lower);
+        lower = lower === lower ? lower : 0;
+      }
+      return baseClamp(toNumber(number), lower, upper);
+    }
+
+    /**
+     * Checks if `n` is between `start` and up to, but not including, `end`. If
+     * `end` is not specified, it's set to `start` with `start` then set to `0`.
+     * If `start` is greater than `end` the params are swapped to support
+     * negative ranges.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.3.0
+     * @category Number
+     * @param {number} number The number to check.
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+     * @see _.range, _.rangeRight
+     * @example
+     *
+     * _.inRange(3, 2, 4);
+     * // => true
+     *
+     * _.inRange(4, 8);
+     * // => true
+     *
+     * _.inRange(4, 2);
+     * // => false
+     *
+     * _.inRange(2, 2);
+     * // => false
+     *
+     * _.inRange(1.2, 2);
+     * // => true
+     *
+     * _.inRange(5.2, 4);
+     * // => false
+     *
+     * _.inRange(-3, -2, -6);
+     * // => true
+     */
+    function inRange(number, start, end) {
+      start = toFinite(start);
+      if (end === undefined) {
+        end = start;
+        start = 0;
+      } else {
+        end = toFinite(end);
+      }
+      number = toNumber(number);
+      return baseInRange(number, start, end);
+    }
+
+    /**
+     * Produces a random number between the inclusive `lower` and `upper` bounds.
+     * If only one argument is provided a number between `0` and the given number
+     * is returned. If `floating` is `true`, or either `lower` or `upper` are
+     * floats, a floating-point number is returned instead of an integer.
+     *
+     * **Note:** JavaScript follows the IEEE-754 standard for resolving
+     * floating-point values which can produce unexpected results.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.7.0
+     * @category Number
+     * @param {number} [lower=0] The lower bound.
+     * @param {number} [upper=1] The upper bound.
+     * @param {boolean} [floating] Specify returning a floating-point number.
+     * @returns {number} Returns the random number.
+     * @example
+     *
+     * _.random(0, 5);
+     * // => an integer between 0 and 5
+     *
+     * _.random(5);
+     * // => also an integer between 0 and 5
+     *
+     * _.random(5, true);
+     * // => a floating-point number between 0 and 5
+     *
+     * _.random(1.2, 5.2);
+     * // => a floating-point number between 1.2 and 5.2
+     */
+    function random(lower, upper, floating) {
+      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
+        upper = floating = undefined;
+      }
+      if (floating === undefined) {
+        if (typeof upper == 'boolean') {
+          floating = upper;
+          upper = undefined;
+        } else if (typeof lower == 'boolean') {
+          floating = lower;
+          lower = undefined;
+        }
+      }
+      if (lower === undefined && upper === undefined) {
+        lower = 0;
+        upper = 1;
+      } else {
+        lower = toFinite(lower);
+        if (upper === undefined) {
+          upper = lower;
+          lower = 0;
+        } else {
+          upper = toFinite(upper);
+        }
+      }
+      if (lower > upper) {
+        var temp = lower;
+        lower = upper;
+        upper = temp;
+      }
+      if (floating || lower % 1 || upper % 1) {
+        var rand = nativeRandom();
+        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
+      }
+      return baseRandom(lower, upper);
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the camel cased string.
+     * @example
+     *
+     * _.camelCase('Foo Bar');
+     * // => 'fooBar'
+     *
+     * _.camelCase('--foo-bar--');
+     * // => 'fooBar'
+     *
+     * _.camelCase('__FOO_BAR__');
+     * // => 'fooBar'
+     */
+    var camelCase = createCompounder(function(result, word, index) {
+      word = word.toLowerCase();
+      return result + (index ? capitalize(word) : word);
+    });
+
+    /**
+     * Converts the first character of `string` to upper case and the remaining
+     * to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to capitalize.
+     * @returns {string} Returns the capitalized string.
+     * @example
+     *
+     * _.capitalize('FRED');
+     * // => 'Fred'
+     */
+    function capitalize(string) {
+      return upperFirst(toString(string).toLowerCase());
+    }
+
+    /**
+     * Deburrs `string` by converting
+     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+     * letters to basic Latin letters and removing
+     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to deburr.
+     * @returns {string} Returns the deburred string.
+     * @example
+     *
+     * _.deburr('déjà vu');
+     * // => 'deja vu'
+     */
+    function deburr(string) {
+      string = toString(string);
+      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+    }
+
+    /**
+     * Checks if `string` ends with the given target string.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {string} [target] The string to search for.
+     * @param {number} [position=string.length] The position to search up to.
+     * @returns {boolean} Returns `true` if `string` ends with `target`,
+     *  else `false`.
+     * @example
+     *
+     * _.endsWith('abc', 'c');
+     * // => true
+     *
+     * _.endsWith('abc', 'b');
+     * // => false
+     *
+     * _.endsWith('abc', 'b', 2);
+     * // => true
+     */
+    function endsWith(string, target, position) {
+      string = toString(string);
+      target = baseToString(target);
+
+      var length = string.length;
+      position = position === undefined ?
+        length :
+        baseClamp(toInteger(position), 0, length);
+
+      var end = position;
+      position -= target.length;
+      return position >= 0 && string.slice(position, end) == target;
+    }
+
+    /**
+     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+     * corresponding HTML entities.
+     *
+     * **Note:** No other characters are escaped. To escape additional
+     * characters use a third-party library like [_he_](https://mths.be/he).
+     *
+     * Though the ">" character is escaped for symmetry, characters like
+     * ">" and "/" don't need escaping in HTML and have no special meaning
+     * unless they're part of a tag or unquoted attribute value. See
+     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+     * (under "semi-related fun fact") for more details.
+     *
+     * When working with HTML you should always
+     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+     * XSS vectors.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category String
+     * @param {string} [string=''] The string to escape.
+     * @returns {string} Returns the escaped string.
+     * @example
+     *
+     * _.escape('fred, barney, & pebbles');
+     * // => 'fred, barney, &amp; pebbles'
+     */
+    function escape(string) {
+      string = toString(string);
+      return (string && reHasUnescapedHtml.test(string)) ?
+        string.replace(reUnescapedHtml, escapeHtmlChar) :
+        string;
+    }
+
+    /**
+     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
+     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to escape.
+     * @returns {string} Returns the escaped string.
+     * @example
+     *
+     * _.escapeRegExp('[lodash](https://lodash.com/)');
+     * // => '\[lodash\]\(https://lodash\.com/\)'
+     */
+    function escapeRegExp(string) {
+      string = toString(string);
+      return (string && reHasRegExpChar.test(string)) ?
+        string.replace(reRegExpChar, '\\$&') :
+        string;
+    }
+
+    /**
+     * Converts `string` to
+     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the kebab cased string.
+     * @example
+     *
+     * _.kebabCase('Foo Bar');
+     * // => 'foo-bar'
+     *
+     * _.kebabCase('fooBar');
+     * // => 'foo-bar'
+     *
+     * _.kebabCase('__FOO_BAR__');
+     * // => 'foo-bar'
+     */
+    var kebabCase = createCompounder(function(result, word, index) {
+      return result + (index ? '-' : '') + word.toLowerCase();
+    });
+
+    /**
+     * Converts `string`, as space separated words, to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the lower cased string.
+     * @example
+     *
+     * _.lowerCase('--Foo-Bar--');
+     * // => 'foo bar'
+     *
+     * _.lowerCase('fooBar');
+     * // => 'foo bar'
+     *
+     * _.lowerCase('__FOO_BAR__');
+     * // => 'foo bar'
+     */
+    var lowerCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + word.toLowerCase();
+    });
+
+    /**
+     * Converts the first character of `string` to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.lowerFirst('Fred');
+     * // => 'fred'
+     *
+     * _.lowerFirst('FRED');
+     * // => 'fRED'
+     */
+    var lowerFirst = createCaseFirst('toLowerCase');
+
+    /**
+     * Pads `string` on the left and right sides if it's shorter than `length`.
+     * Padding characters are truncated if they can't be evenly divided by `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.pad('abc', 8);
+     * // => '  abc   '
+     *
+     * _.pad('abc', 8, '_-');
+     * // => '_-abc_-_'
+     *
+     * _.pad('abc', 3);
+     * // => 'abc'
+     */
+    function pad(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+
+      var strLength = length ? stringSize(string) : 0;
+      if (!length || strLength >= length) {
+        return string;
+      }
+      var mid = (length - strLength) / 2;
+      return (
+        createPadding(nativeFloor(mid), chars) +
+        string +
+        createPadding(nativeCeil(mid), chars)
+      );
+    }
+
+    /**
+     * Pads `string` on the right side if it's shorter than `length`. Padding
+     * characters are truncated if they exceed `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.padEnd('abc', 6);
+     * // => 'abc   '
+     *
+     * _.padEnd('abc', 6, '_-');
+     * // => 'abc_-_'
+     *
+     * _.padEnd('abc', 3);
+     * // => 'abc'
+     */
+    function padEnd(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+
+      var strLength = length ? stringSize(string) : 0;
+      return (length && strLength < length) ?
+        (string + createPadding(length - strLength, chars)) :
+        string;
+    }
+
+    /**
+     * Pads `string` on the left side if it's shorter than `length`. Padding
+     * characters are truncated if they exceed `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.padStart('abc', 6);
+     * // => '   abc'
+     *
+     * _.padStart('abc', 6, '_-');
+     * // => '_-_abc'
+     *
+     * _.padStart('abc', 3);
+     * // => 'abc'
+     */
+    function padStart(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+
+      var strLength = length ? stringSize(string) : 0;
+      return (length && strLength < length) ?
+        (createPadding(length - strLength, chars) + string) :
+        string;
+    }
+
+    /**
+     * Converts `string` to an integer of the specified radix. If `radix` is
+     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
+     * hexadecimal, in which case a `radix` of `16` is used.
+     *
+     * **Note:** This method aligns with the
+     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category String
+     * @param {string} string The string to convert.
+     * @param {number} [radix=10] The radix to interpret `value` by.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.parseInt('08');
+     * // => 8
+     *
+     * _.map(['6', '08', '10'], _.parseInt);
+     * // => [6, 8, 10]
+     */
+    function parseInt(string, radix, guard) {
+      if (guard || radix == null) {
+        radix = 0;
+      } else if (radix) {
+        radix = +radix;
+      }
+      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
+    }
+
+    /**
+     * Repeats the given string `n` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to repeat.
+     * @param {number} [n=1] The number of times to repeat the string.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the repeated string.
+     * @example
+     *
+     * _.repeat('*', 3);
+     * // => '***'
+     *
+     * _.repeat('abc', 2);
+     * // => 'abcabc'
+     *
+     * _.repeat('abc', 0);
+     * // => ''
+     */
+    function repeat(string, n, guard) {
+      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
+        n = 1;
+      } else {
+        n = toInteger(n);
+      }
+      return baseRepeat(toString(string), n);
+    }
+
+    /**
+     * Replaces matches for `pattern` in `string` with `replacement`.
+     *
+     * **Note:** This method is based on
+     * [`String#replace`](https://mdn.io/String/replace).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to modify.
+     * @param {RegExp|string} pattern The pattern to replace.
+     * @param {Function|string} replacement The match replacement.
+     * @returns {string} Returns the modified string.
+     * @example
+     *
+     * _.replace('Hi Fred', 'Fred', 'Barney');
+     * // => 'Hi Barney'
+     */
+    function replace() {
+      var args = arguments,
+        string = toString(args[0]);
+
+      return args.length < 3 ? string : string.replace(args[1], args[2]);
+    }
+
+    /**
+     * Converts `string` to
+     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the snake cased string.
+     * @example
+     *
+     * _.snakeCase('Foo Bar');
+     * // => 'foo_bar'
+     *
+     * _.snakeCase('fooBar');
+     * // => 'foo_bar'
+     *
+     * _.snakeCase('--FOO-BAR--');
+     * // => 'foo_bar'
+     */
+    var snakeCase = createCompounder(function(result, word, index) {
+      return result + (index ? '_' : '') + word.toLowerCase();
+    });
+
+    /**
+     * Splits `string` by `separator`.
+     *
+     * **Note:** This method is based on
+     * [`String#split`](https://mdn.io/String/split).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to split.
+     * @param {RegExp|string} separator The separator pattern to split by.
+     * @param {number} [limit] The length to truncate results to.
+     * @returns {Array} Returns the string segments.
+     * @example
+     *
+     * _.split('a-b-c', '-', 2);
+     * // => ['a', 'b']
+     */
+    function split(string, separator, limit) {
+      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
+        separator = limit = undefined;
+      }
+      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
+      if (!limit) {
+        return [];
+      }
+      string = toString(string);
+      if (string && (
+          typeof separator == 'string' ||
+          (separator != null && !isRegExp(separator))
+        )) {
+        separator = baseToString(separator);
+        if (!separator && hasUnicode(string)) {
+          return castSlice(stringToArray(string), 0, limit);
+        }
+      }
+      return string.split(separator, limit);
+    }
+
+    /**
+     * Converts `string` to
+     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.1.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the start cased string.
+     * @example
+     *
+     * _.startCase('--foo-bar--');
+     * // => 'Foo Bar'
+     *
+     * _.startCase('fooBar');
+     * // => 'Foo Bar'
+     *
+     * _.startCase('__FOO_BAR__');
+     * // => 'FOO BAR'
+     */
+    var startCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + upperFirst(word);
+    });
+
+    /**
+     * Checks if `string` starts with the given target string.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {string} [target] The string to search for.
+     * @param {number} [position=0] The position to search from.
+     * @returns {boolean} Returns `true` if `string` starts with `target`,
+     *  else `false`.
+     * @example
+     *
+     * _.startsWith('abc', 'a');
+     * // => true
+     *
+     * _.startsWith('abc', 'b');
+     * // => false
+     *
+     * _.startsWith('abc', 'b', 1);
+     * // => true
+     */
+    function startsWith(string, target, position) {
+      string = toString(string);
+      position = position == null ?
+        0 :
+        baseClamp(toInteger(position), 0, string.length);
+
+      target = baseToString(target);
+      return string.slice(position, position + target.length) == target;
+    }
+
+    /**
+     * Creates a compiled template function that can interpolate data properties
+     * in "interpolate" delimiters, HTML-escape interpolated data properties in
+     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+     * properties may be accessed as free variables in the template. If a setting
+     * object is given, it takes precedence over `_.templateSettings` values.
+     *
+     * **Note:** In the development build `_.template` utilizes
+     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+     * for easier debugging.
+     *
+     * For more information on precompiling templates see
+     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+     *
+     * For more information on Chrome extension sandboxes see
+     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category String
+     * @param {string} [string=''] The template string.
+     * @param {Object} [options={}] The options object.
+     * @param {RegExp} [options.escape=_.templateSettings.escape]
+     *  The HTML "escape" delimiter.
+     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
+     *  The "evaluate" delimiter.
+     * @param {Object} [options.imports=_.templateSettings.imports]
+     *  An object to import into the template as free variables.
+     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
+     *  The "interpolate" delimiter.
+     * @param {string} [options.sourceURL='lodash.templateSources[n]']
+     *  The sourceURL of the compiled template.
+     * @param {string} [options.variable='obj']
+     *  The data object variable name.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the compiled template function.
+     * @example
+     *
+     * // Use the "interpolate" delimiter to create a compiled template.
+     * var compiled = _.template('hello <%= user %>!');
+     * compiled({ 'user': 'fred' });
+     * // => 'hello fred!'
+     *
+     * // Use the HTML "escape" delimiter to escape data property values.
+     * var compiled = _.template('<b><%- value %></b>');
+     * compiled({ 'value': '<script>' });
+     * // => '<b>&lt;script&gt;</b>'
+     *
+     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
+     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
+     * compiled({ 'users': ['fred', 'barney'] });
+     * // => '<li>fred</li><li>barney</li>'
+     *
+     * // Use the internal `print` function in "evaluate" delimiters.
+     * var compiled = _.template('<% print("hello " + user); %>!');
+     * compiled({ 'user': 'barney' });
+     * // => 'hello barney!'
+     *
+     * // Use the ES template literal delimiter as an "interpolate" delimiter.
+     * // Disable support by replacing the "interpolate" delimiter.
+     * var compiled = _.template('hello ${ user }!');
+     * compiled({ 'user': 'pebbles' });
+     * // => 'hello pebbles!'
+     *
+     * // Use backslashes to treat delimiters as plain text.
+     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
+     * compiled({ 'value': 'ignored' });
+     * // => '<%- value %>'
+     *
+     * // Use the `imports` option to import `jQuery` as `jq`.
+     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
+     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
+     * compiled({ 'users': ['fred', 'barney'] });
+     * // => '<li>fred</li><li>barney</li>'
+     *
+     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
+     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
+     * compiled(data);
+     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
+     *
+     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
+     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
+     * compiled.source;
+     * // => function(data) {
+     * //   var __t, __p = '';
+     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
+     * //   return __p;
+     * // }
+     *
+     * // Use custom template delimiters.
+     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
+     * var compiled = _.template('hello {{ user }}!');
+     * compiled({ 'user': 'mustache' });
+     * // => 'hello mustache!'
+     *
+     * // Use the `source` property to inline compiled templates for meaningful
+     * // line numbers in error messages and stack traces.
+     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
+     *   var JST = {\
+     *     "main": ' + _.template(mainText).source + '\
+     *   };\
+     * ');
+     */
+    function template(string, options, guard) {
+      // Based on John Resig's `tmpl` implementation
+      // (http://ejohn.org/blog/javascript-micro-templating/)
+      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
+      var settings = lodash.templateSettings;
+
+      if (guard && isIterateeCall(string, options, guard)) {
+        options = undefined;
+      }
+      string = toString(string);
+      options = assignInWith({}, options, settings, customDefaultsAssignIn);
+
+      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
+        importsKeys = keys(imports),
+        importsValues = baseValues(imports, importsKeys);
+
+      var isEscaping,
+        isEvaluating,
+        index = 0,
+        interpolate = options.interpolate || reNoMatch,
+        source = "__p += '";
+
+      // Compile the regexp to match each delimiter.
+      var reDelimiters = RegExp(
+        (options.escape || reNoMatch).source + '|' +
+        interpolate.source + '|' +
+        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
+        (options.evaluate || reNoMatch).source + '|$', 'g');
+
+      // Use a sourceURL for easier debugging.
+      // The sourceURL gets injected into the source that's eval-ed, so be careful
+      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
+      // and escape the comment, thus injecting code that gets evaled.
+      var sourceURL = '//# sourceURL=' +
+        (hasOwnProperty.call(options, 'sourceURL') ?
+          (options.sourceURL + '').replace(/\s/g, ' ') :
+          ('lodash.templateSources[' + (++templateCounter) + ']')
+        ) + '\n';
+
+      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
+        interpolateValue || (interpolateValue = esTemplateValue);
+
+        // Escape characters that can't be included in string literals.
+        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
+
+        // Replace delimiters with snippets.
+        if (escapeValue) {
+          isEscaping = true;
+          source += "' +\n__e(" + escapeValue + ") +\n'";
+        }
+        if (evaluateValue) {
+          isEvaluating = true;
+          source += "';\n" + evaluateValue + ";\n__p += '";
+        }
+        if (interpolateValue) {
+          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
+        }
+        index = offset + match.length;
+
+        // The JS engine embedded in Adobe products needs `match` returned in
+        // order to produce the correct `offset` value.
+        return match;
+      });
+
+      source += "';\n";
+
+      // If `variable` is not specified wrap a with-statement around the generated
+      // code to add the data object to the top of the scope chain.
+      var variable = hasOwnProperty.call(options, 'variable') && options.variable;
+      if (!variable) {
+        source = 'with (obj) {\n' + source + '\n}\n';
+      }
+      // Cleanup code by stripping empty strings.
+      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
+        .replace(reEmptyStringMiddle, '$1')
+        .replace(reEmptyStringTrailing, '$1;');
+
+      // Frame code as the function body.
+      source = 'function(' + (variable || 'obj') + ') {\n' +
+        (variable ?
+          '' :
+          'obj || (obj = {});\n'
+        ) +
+        "var __t, __p = ''" +
+        (isEscaping ?
+          ', __e = _.escape' :
+          ''
+        ) +
+        (isEvaluating ?
+          ', __j = Array.prototype.join;\n' +
+          "function print() { __p += __j.call(arguments, '') }\n" :
+          ';\n'
+        ) +
+        source +
+        'return __p\n}';
+
+      var result = attempt(function() {
+        return Function(importsKeys, sourceURL + 'return ' + source)
+          .apply(undefined, importsValues);
+      });
+
+      // Provide the compiled function's source by its `toString` method or
+      // the `source` property as a convenience for inlining compiled templates.
+      result.source = source;
+      if (isError(result)) {
+        throw result;
+      }
+      return result;
+    }
+
+    /**
+     * Converts `string`, as a whole, to lower case just like
+     * [String#toLowerCase](https://mdn.io/toLowerCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the lower cased string.
+     * @example
+     *
+     * _.toLower('--Foo-Bar--');
+     * // => '--foo-bar--'
+     *
+     * _.toLower('fooBar');
+     * // => 'foobar'
+     *
+     * _.toLower('__FOO_BAR__');
+     * // => '__foo_bar__'
+     */
+    function toLower(value) {
+      return toString(value).toLowerCase();
+    }
+
+    /**
+     * Converts `string`, as a whole, to upper case just like
+     * [String#toUpperCase](https://mdn.io/toUpperCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the upper cased string.
+     * @example
+     *
+     * _.toUpper('--foo-bar--');
+     * // => '--FOO-BAR--'
+     *
+     * _.toUpper('fooBar');
+     * // => 'FOOBAR'
+     *
+     * _.toUpper('__foo_bar__');
+     * // => '__FOO_BAR__'
+     */
+    function toUpper(value) {
+      return toString(value).toUpperCase();
+    }
+
+    /**
+     * Removes leading and trailing whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trim('  abc  ');
+     * // => 'abc'
+     *
+     * _.trim('-_-abc-_-', '_-');
+     * // => 'abc'
+     *
+     * _.map(['  foo  ', '  bar  '], _.trim);
+     * // => ['foo', 'bar']
+     */
+    function trim(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrim, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+        chrSymbols = stringToArray(chars),
+        start = charsStartIndex(strSymbols, chrSymbols),
+        end = charsEndIndex(strSymbols, chrSymbols) + 1;
+
+      return castSlice(strSymbols, start, end).join('');
+    }
+
+    /**
+     * Removes trailing whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trimEnd('  abc  ');
+     * // => '  abc'
+     *
+     * _.trimEnd('-_-abc-_-', '_-');
+     * // => '-_-abc'
+     */
+    function trimEnd(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrimEnd, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+        end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
+
+      return castSlice(strSymbols, 0, end).join('');
+    }
+
+    /**
+     * Removes leading whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trimStart('  abc  ');
+     * // => 'abc  '
+     *
+     * _.trimStart('-_-abc-_-', '_-');
+     * // => 'abc-_-'
+     */
+    function trimStart(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrimStart, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+        start = charsStartIndex(strSymbols, stringToArray(chars));
+
+      return castSlice(strSymbols, start).join('');
+    }
+
+    /**
+     * Truncates `string` if it's longer than the given maximum string length.
+     * The last characters of the truncated string are replaced with the omission
+     * string which defaults to "...".
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to truncate.
+     * @param {Object} [options={}] The options object.
+     * @param {number} [options.length=30] The maximum string length.
+     * @param {string} [options.omission='...'] The string to indicate text is omitted.
+     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
+     * @returns {string} Returns the truncated string.
+     * @example
+     *
+     * _.truncate('hi-diddly-ho there, neighborino');
+     * // => 'hi-diddly-ho there, neighbo...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'length': 24,
+     *   'separator': ' '
+     * });
+     * // => 'hi-diddly-ho there,...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'length': 24,
+     *   'separator': /,? +/
+     * });
+     * // => 'hi-diddly-ho there...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'omission': ' [...]'
+     * });
+     * // => 'hi-diddly-ho there, neig [...]'
+     */
+    function truncate(string, options) {
+      var length = DEFAULT_TRUNC_LENGTH,
+        omission = DEFAULT_TRUNC_OMISSION;
+
+      if (isObject(options)) {
+        var separator = 'separator' in options ? options.separator : separator;
+        length = 'length' in options ? toInteger(options.length) : length;
+        omission = 'omission' in options ? baseToString(options.omission) : omission;
+      }
+      string = toString(string);
+
+      var strLength = string.length;
+      if (hasUnicode(string)) {
+        var strSymbols = stringToArray(string);
+        strLength = strSymbols.length;
+      }
+      if (length >= strLength) {
+        return string;
+      }
+      var end = length - stringSize(omission);
+      if (end < 1) {
+        return omission;
+      }
+      var result = strSymbols ?
+        castSlice(strSymbols, 0, end).join('') :
+        string.slice(0, end);
+
+      if (separator === undefined) {
+        return result + omission;
+      }
+      if (strSymbols) {
+        end += (result.length - end);
+      }
+      if (isRegExp(separator)) {
+        if (string.slice(end).search(separator)) {
+          var match,
+            substring = result;
+
+          if (!separator.global) {
+            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
+          }
+          separator.lastIndex = 0;
+          while ((match = separator.exec(substring))) {
+            var newEnd = match.index;
+          }
+          result = result.slice(0, newEnd === undefined ? end : newEnd);
+        }
+      } else if (string.indexOf(baseToString(separator), end) != end) {
+        var index = result.lastIndexOf(separator);
+        if (index > -1) {
+          result = result.slice(0, index);
+        }
+      }
+      return result + omission;
+    }
+
+    /**
+     * The inverse of `_.escape`; this method converts the HTML entities
+     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
+     * their corresponding characters.
+     *
+     * **Note:** No other HTML entities are unescaped. To unescape additional
+     * HTML entities use a third-party library like [_he_](https://mths.be/he).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.6.0
+     * @category String
+     * @param {string} [string=''] The string to unescape.
+     * @returns {string} Returns the unescaped string.
+     * @example
+     *
+     * _.unescape('fred, barney, &amp; pebbles');
+     * // => 'fred, barney, & pebbles'
+     */
+    function unescape(string) {
+      string = toString(string);
+      return (string && reHasEscapedHtml.test(string)) ?
+        string.replace(reEscapedHtml, unescapeHtmlChar) :
+        string;
+    }
+
+    /**
+     * Converts `string`, as space separated words, to upper case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the upper cased string.
+     * @example
+     *
+     * _.upperCase('--foo-bar');
+     * // => 'FOO BAR'
+     *
+     * _.upperCase('fooBar');
+     * // => 'FOO BAR'
+     *
+     * _.upperCase('__foo_bar__');
+     * // => 'FOO BAR'
+     */
+    var upperCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + word.toUpperCase();
+    });
+
+    /**
+     * Converts the first character of `string` to upper case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.upperFirst('fred');
+     * // => 'Fred'
+     *
+     * _.upperFirst('FRED');
+     * // => 'FRED'
+     */
+    var upperFirst = createCaseFirst('toUpperCase');
+
+    /**
+     * Splits `string` into an array of its words.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {RegExp|string} [pattern] The pattern to match words.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the words of `string`.
+     * @example
+     *
+     * _.words('fred, barney, & pebbles');
+     * // => ['fred', 'barney', 'pebbles']
+     *
+     * _.words('fred, barney, & pebbles', /[^, ]+/g);
+     * // => ['fred', 'barney', '&', 'pebbles']
+     */
+    function words(string, pattern, guard) {
+      string = toString(string);
+      pattern = guard ? undefined : pattern;
+
+      if (pattern === undefined) {
+        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
+      }
+      return string.match(pattern) || [];
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Attempts to invoke `func`, returning either the result or the caught error
+     * object. Any additional arguments are provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Function} func The function to attempt.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {*} Returns the `func` result or error object.
+     * @example
+     *
+     * // Avoid throwing errors for invalid selectors.
+     * var elements = _.attempt(function(selector) {
+     *   return document.querySelectorAll(selector);
+     * }, '>_>');
+     *
+     * if (_.isError(elements)) {
+     *   elements = [];
+     * }
+     */
+    var attempt = baseRest(function(func, args) {
+      try {
+        return apply(func, undefined, args);
+      } catch (e) {
+        return isError(e) ? e : new Error(e);
+      }
+    });
+
+    /**
+     * Binds methods of an object to the object itself, overwriting the existing
+     * method.
+     *
+     * **Note:** This method doesn't set the "length" property of bound functions.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {Object} object The object to bind and assign the bound methods to.
+     * @param {...(string|string[])} methodNames The object method names to bind.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var view = {
+     *   'label': 'docs',
+     *   'click': function() {
+     *     console.log('clicked ' + this.label);
+     *   }
+     * };
+     *
+     * _.bindAll(view, ['click']);
+     * jQuery(element).on('click', view.click);
+     * // => Logs 'clicked docs' when clicked.
+     */
+    var bindAll = flatRest(function(object, methodNames) {
+      arrayEach(methodNames, function(key) {
+        key = toKey(key);
+        baseAssignValue(object, key, bind(object[key], object));
+      });
+      return object;
+    });
+
+    /**
+     * Creates a function that iterates over `pairs` and invokes the corresponding
+     * function of the first predicate to return truthy. The predicate-function
+     * pairs are invoked with the `this` binding and arguments of the created
+     * function.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {Array} pairs The predicate-function pairs.
+     * @returns {Function} Returns the new composite function.
+     * @example
+     *
+     * var func = _.cond([
+     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
+     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
+     *   [_.stubTrue,                      _.constant('no match')]
+     * ]);
+     *
+     * func({ 'a': 1, 'b': 2 });
+     * // => 'matches A'
+     *
+     * func({ 'a': 0, 'b': 1 });
+     * // => 'matches B'
+     *
+     * func({ 'a': '1', 'b': '2' });
+     * // => 'no match'
+     */
+    function cond(pairs) {
+      var length = pairs == null ? 0 : pairs.length,
+        toIteratee = getIteratee();
+
+      pairs = !length ? [] : arrayMap(pairs, function(pair) {
+        if (typeof pair[1] != 'function') {
+          throw new TypeError(FUNC_ERROR_TEXT);
+        }
+        return [toIteratee(pair[0]), pair[1]];
+      });
+
+      return baseRest(function(args) {
+        var index = -1;
+        while (++index < length) {
+          var pair = pairs[index];
+          if (apply(pair[0], this, args)) {
+            return apply(pair[1], this, args);
+          }
+        }
+      });
+    }
+
+    /**
+     * Creates a function that invokes the predicate properties of `source` with
+     * the corresponding property values of a given object, returning `true` if
+     * all predicates return truthy, else `false`.
+     *
+     * **Note:** The created function is equivalent to `_.conformsTo` with
+     * `source` partially applied.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 2, 'b': 1 },
+     *   { 'a': 1, 'b': 2 }
+     * ];
+     *
+     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
+     * // => [{ 'a': 1, 'b': 2 }]
+     */
+    function conforms(source) {
+      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
+    }
+
+    /**
+     * Creates a function that returns `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Util
+     * @param {*} value The value to return from the new function.
+     * @returns {Function} Returns the new constant function.
+     * @example
+     *
+     * var objects = _.times(2, _.constant({ 'a': 1 }));
+     *
+     * console.log(objects);
+     * // => [{ 'a': 1 }, { 'a': 1 }]
+     *
+     * console.log(objects[0] === objects[1]);
+     * // => true
+     */
+    function constant(value) {
+      return function() {
+        return value;
+      };
+    }
+
+    /**
+     * Checks `value` to determine whether a default value should be returned in
+     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
+     * or `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.14.0
+     * @category Util
+     * @param {*} value The value to check.
+     * @param {*} defaultValue The default value.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * _.defaultTo(1, 10);
+     * // => 1
+     *
+     * _.defaultTo(undefined, 10);
+     * // => 10
+     */
+    function defaultTo(value, defaultValue) {
+      return (value == null || value !== value) ? defaultValue : value;
+    }
+
+    /**
+     * Creates a function that returns the result of invoking the given functions
+     * with the `this` binding of the created function, where each successive
+     * invocation is supplied the return value of the previous.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [funcs] The functions to invoke.
+     * @returns {Function} Returns the new composite function.
+     * @see _.flowRight
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var addSquare = _.flow([_.add, square]);
+     * addSquare(1, 2);
+     * // => 9
+     */
+    var flow = createFlow();
+
+    /**
+     * This method is like `_.flow` except that it creates a function that
+     * invokes the given functions from right to left.
+     *
+     * @static
+     * @since 3.0.0
+     * @memberOf _
+     * @category Util
+     * @param {...(Function|Function[])} [funcs] The functions to invoke.
+     * @returns {Function} Returns the new composite function.
+     * @see _.flow
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var addSquare = _.flowRight([square, _.add]);
+     * addSquare(1, 2);
+     * // => 9
+     */
+    var flowRight = createFlow(true);
+
+    /**
+     * This method returns the first argument it receives.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {*} value Any value.
+     * @returns {*} Returns `value`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     *
+     * console.log(_.identity(object) === object);
+     * // => true
+     */
+    function identity(value) {
+      return value;
+    }
+
+    /**
+     * Creates a function that invokes `func` with the arguments of the created
+     * function. If `func` is a property name, the created function returns the
+     * property value for a given element. If `func` is an array or object, the
+     * created function returns `true` for elements that contain the equivalent
+     * source properties, otherwise it returns `false`.
+     *
+     * @static
+     * @since 4.0.0
+     * @memberOf _
+     * @category Util
+     * @param {*} [func=_.identity] The value to convert to a callback.
+     * @returns {Function} Returns the callback.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': true },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
+     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.filter(users, _.iteratee(['user', 'fred']));
+     * // => [{ 'user': 'fred', 'age': 40 }]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.map(users, _.iteratee('user'));
+     * // => ['barney', 'fred']
+     *
+     * // Create custom iteratee shorthands.
+     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
+     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
+     *     return func.test(string);
+     *   };
+     * });
+     *
+     * _.filter(['abc', 'def'], /ef/);
+     * // => ['def']
+     */
+    function iteratee(func) {
+      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
+    }
+
+    /**
+     * Creates a function that performs a partial deep comparison between a given
+     * object and `source`, returning `true` if the given object has equivalent
+     * property values, else `false`.
+     *
+     * **Note:** The created function is equivalent to `_.isMatch` with `source`
+     * partially applied.
+     *
+     * Partial comparisons will match empty array and empty object `source`
+     * values against any array or object value, respectively. See `_.isEqual`
+     * for a list of supported value comparisons.
+     *
+     * **Note:** Multiple values can be checked by combining several matchers
+     * using `_.overSome`
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Object} source The object of property values to match.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 1, 'b': 2, 'c': 3 },
+     *   { 'a': 4, 'b': 5, 'c': 6 }
+     * ];
+     *
+     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
+     *
+     * // Checking for several possible values
+     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
+     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
+     */
+    function matches(source) {
+      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
+    }
+
+    /**
+     * Creates a function that performs a partial deep comparison between the
+     * value at `path` of a given object to `srcValue`, returning `true` if the
+     * object value is equivalent, else `false`.
+     *
+     * **Note:** Partial comparisons will match empty array and empty object
+     * `srcValue` values against any array or object value, respectively. See
+     * `_.isEqual` for a list of supported value comparisons.
+     *
+     * **Note:** Multiple values can be checked by combining several matchers
+     * using `_.overSome`
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Util
+     * @param {Array|string} path The path of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 1, 'b': 2, 'c': 3 },
+     *   { 'a': 4, 'b': 5, 'c': 6 }
+     * ];
+     *
+     * _.find(objects, _.matchesProperty('a', 4));
+     * // => { 'a': 4, 'b': 5, 'c': 6 }
+     *
+     * // Checking for several possible values
+     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
+     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
+     */
+    function matchesProperty(path, srcValue) {
+      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
+    }
+
+    /**
+     * Creates a function that invokes the method at `path` of a given object.
+     * Any additional arguments are provided to the invoked method.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Util
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {Function} Returns the new invoker function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': { 'b': _.constant(2) } },
+     *   { 'a': { 'b': _.constant(1) } }
+     * ];
+     *
+     * _.map(objects, _.method('a.b'));
+     * // => [2, 1]
+     *
+     * _.map(objects, _.method(['a', 'b']));
+     * // => [2, 1]
+     */
+    var method = baseRest(function(path, args) {
+      return function(object) {
+        return baseInvoke(object, path, args);
+      };
+    });
+
+    /**
+     * The opposite of `_.method`; this method creates a function that invokes
+     * the method at a given path of `object`. Any additional arguments are
+     * provided to the invoked method.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Util
+     * @param {Object} object The object to query.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {Function} Returns the new invoker function.
+     * @example
+     *
+     * var array = _.times(3, _.constant),
+     *     object = { 'a': array, 'b': array, 'c': array };
+     *
+     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
+     * // => [2, 0]
+     *
+     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
+     * // => [2, 0]
+     */
+    var methodOf = baseRest(function(object, args) {
+      return function(path) {
+        return baseInvoke(object, path, args);
+      };
+    });
+
+    /**
+     * Adds all own enumerable string keyed function properties of a source
+     * object to the destination object. If `object` is a function, then methods
+     * are added to its prototype as well.
+     *
+     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
+     * avoid conflicts caused by modifying the original.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {Function|Object} [object=lodash] The destination object.
+     * @param {Object} source The object of functions to add.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
+     * @returns {Function|Object} Returns `object`.
+     * @example
+     *
+     * function vowels(string) {
+     *   return _.filter(string, function(v) {
+     *     return /[aeiou]/i.test(v);
+     *   });
+     * }
+     *
+     * _.mixin({ 'vowels': vowels });
+     * _.vowels('fred');
+     * // => ['e']
+     *
+     * _('fred').vowels().value();
+     * // => ['e']
+     *
+     * _.mixin({ 'vowels': vowels }, { 'chain': false });
+     * _('fred').vowels();
+     * // => ['e']
+     */
+    function mixin(object, source, options) {
+      var props = keys(source),
+        methodNames = baseFunctions(source, props);
+
+      if (options == null &&
+        !(isObject(source) && (methodNames.length || !props.length))) {
+        options = source;
+        source = object;
+        object = this;
+        methodNames = baseFunctions(source, keys(source));
+      }
+      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
+        isFunc = isFunction(object);
+
+      arrayEach(methodNames, function(methodName) {
+        var func = source[methodName];
+        object[methodName] = func;
+        if (isFunc) {
+          object.prototype[methodName] = function() {
+            var chainAll = this.__chain__;
+            if (chain || chainAll) {
+              var result = object(this.__wrapped__),
+                actions = result.__actions__ = copyArray(this.__actions__);
+
+              actions.push({
+                'func': func,
+                'args': arguments,
+                'thisArg': object
+              });
+              result.__chain__ = chainAll;
+              return result;
+            }
+            return func.apply(object, arrayPush([this.value()], arguments));
+          };
+        }
+      });
+
+      return object;
+    }
+
+    /**
+     * Reverts the `_` variable to its previous value and returns a reference to
+     * the `lodash` function.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @returns {Function} Returns the `lodash` function.
+     * @example
+     *
+     * var lodash = _.noConflict();
+     */
+    function noConflict() {
+      if (root._ === this) {
+        root._ = oldDash;
+      }
+      return this;
+    }
+
+    /**
+     * This method returns `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.3.0
+     * @category Util
+     * @example
+     *
+     * _.times(2, _.noop);
+     * // => [undefined, undefined]
+     */
+    function noop() {
+      // No operation performed.
+    }
+
+    /**
+     * Creates a function that gets the argument at index `n`. If `n` is negative,
+     * the nth argument from the end is returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {number} [n=0] The index of the argument to return.
+     * @returns {Function} Returns the new pass-thru function.
+     * @example
+     *
+     * var func = _.nthArg(1);
+     * func('a', 'b', 'c', 'd');
+     * // => 'b'
+     *
+     * var func = _.nthArg(-2);
+     * func('a', 'b', 'c', 'd');
+     * // => 'c'
+     */
+    function nthArg(n) {
+      n = toInteger(n);
+      return baseRest(function(args) {
+        return baseNth(args, n);
+      });
+    }
+
+    /**
+     * Creates a function that invokes `iteratees` with the arguments it receives
+     * and returns their results.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [iteratees=[_.identity]]
+     *  The iteratees to invoke.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.over([Math.max, Math.min]);
+     *
+     * func(1, 2, 3, 4);
+     * // => [4, 1]
+     */
+    var over = createOver(arrayMap);
+
+    /**
+     * Creates a function that checks if **all** of the `predicates` return
+     * truthy when invoked with the arguments it receives.
+     *
+     * Following shorthands are possible for providing predicates.
+     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
+     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [predicates=[_.identity]]
+     *  The predicates to check.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.overEvery([Boolean, isFinite]);
+     *
+     * func('1');
+     * // => true
+     *
+     * func(null);
+     * // => false
+     *
+     * func(NaN);
+     * // => false
+     */
+    var overEvery = createOver(arrayEvery);
+
+    /**
+     * Creates a function that checks if **any** of the `predicates` return
+     * truthy when invoked with the arguments it receives.
+     *
+     * Following shorthands are possible for providing predicates.
+     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
+     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [predicates=[_.identity]]
+     *  The predicates to check.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.overSome([Boolean, isFinite]);
+     *
+     * func('1');
+     * // => true
+     *
+     * func(null);
+     * // => true
+     *
+     * func(NaN);
+     * // => false
+     *
+     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
+     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
+     */
+    var overSome = createOver(arraySome);
+
+    /**
+     * Creates a function that returns the value at `path` of a given object.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Util
+     * @param {Array|string} path The path of the property to get.
+     * @returns {Function} Returns the new accessor function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': { 'b': 2 } },
+     *   { 'a': { 'b': 1 } }
+     * ];
+     *
+     * _.map(objects, _.property('a.b'));
+     * // => [2, 1]
+     *
+     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
+     * // => [1, 2]
+     */
+    function property(path) {
+      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+    }
+
+    /**
+     * The opposite of `_.property`; this method creates a function that returns
+     * the value at a given path of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Object} object The object to query.
+     * @returns {Function} Returns the new accessor function.
+     * @example
+     *
+     * var array = [0, 1, 2],
+     *     object = { 'a': array, 'b': array, 'c': array };
+     *
+     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
+     * // => [2, 0]
+     *
+     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
+     * // => [2, 0]
+     */
+    function propertyOf(object) {
+      return function(path) {
+        return object == null ? undefined : baseGet(object, path);
+      };
+    }
+
+    /**
+     * Creates an array of numbers (positive and/or negative) progressing from
+     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
+     * `start` is specified without an `end` or `step`. If `end` is not specified,
+     * it's set to `start` with `start` then set to `0`.
+     *
+     * **Note:** JavaScript follows the IEEE-754 standard for resolving
+     * floating-point values which can produce unexpected results.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} [step=1] The value to increment or decrement by.
+     * @returns {Array} Returns the range of numbers.
+     * @see _.inRange, _.rangeRight
+     * @example
+     *
+     * _.range(4);
+     * // => [0, 1, 2, 3]
+     *
+     * _.range(-4);
+     * // => [0, -1, -2, -3]
+     *
+     * _.range(1, 5);
+     * // => [1, 2, 3, 4]
+     *
+     * _.range(0, 20, 5);
+     * // => [0, 5, 10, 15]
+     *
+     * _.range(0, -4, -1);
+     * // => [0, -1, -2, -3]
+     *
+     * _.range(1, 4, 0);
+     * // => [1, 1, 1]
+     *
+     * _.range(0);
+     * // => []
+     */
+    var range = createRange();
+
+    /**
+     * This method is like `_.range` except that it populates values in
+     * descending order.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} [step=1] The value to increment or decrement by.
+     * @returns {Array} Returns the range of numbers.
+     * @see _.inRange, _.range
+     * @example
+     *
+     * _.rangeRight(4);
+     * // => [3, 2, 1, 0]
+     *
+     * _.rangeRight(-4);
+     * // => [-3, -2, -1, 0]
+     *
+     * _.rangeRight(1, 5);
+     * // => [4, 3, 2, 1]
+     *
+     * _.rangeRight(0, 20, 5);
+     * // => [15, 10, 5, 0]
+     *
+     * _.rangeRight(0, -4, -1);
+     * // => [-3, -2, -1, 0]
+     *
+     * _.rangeRight(1, 4, 0);
+     * // => [1, 1, 1]
+     *
+     * _.rangeRight(0);
+     * // => []
+     */
+    var rangeRight = createRange(true);
+
+    /**
+     * This method returns a new empty array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {Array} Returns the new empty array.
+     * @example
+     *
+     * var arrays = _.times(2, _.stubArray);
+     *
+     * console.log(arrays);
+     * // => [[], []]
+     *
+     * console.log(arrays[0] === arrays[1]);
+     * // => false
+     */
+    function stubArray() {
+      return [];
+    }
+
+    /**
+     * This method returns `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {boolean} Returns `false`.
+     * @example
+     *
+     * _.times(2, _.stubFalse);
+     * // => [false, false]
+     */
+    function stubFalse() {
+      return false;
+    }
+
+    /**
+     * This method returns a new empty object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {Object} Returns the new empty object.
+     * @example
+     *
+     * var objects = _.times(2, _.stubObject);
+     *
+     * console.log(objects);
+     * // => [{}, {}]
+     *
+     * console.log(objects[0] === objects[1]);
+     * // => false
+     */
+    function stubObject() {
+      return {};
+    }
+
+    /**
+     * This method returns an empty string.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {string} Returns the empty string.
+     * @example
+     *
+     * _.times(2, _.stubString);
+     * // => ['', '']
+     */
+    function stubString() {
+      return '';
+    }
+
+    /**
+     * This method returns `true`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {boolean} Returns `true`.
+     * @example
+     *
+     * _.times(2, _.stubTrue);
+     * // => [true, true]
+     */
+    function stubTrue() {
+      return true;
+    }
+
+    /**
+     * Invokes the iteratee `n` times, returning an array of the results of
+     * each invocation. The iteratee is invoked with one argument; (index).
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {number} n The number of times to invoke `iteratee`.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the array of results.
+     * @example
+     *
+     * _.times(3, String);
+     * // => ['0', '1', '2']
+     *
+     *  _.times(4, _.constant(0));
+     * // => [0, 0, 0, 0]
+     */
+    function times(n, iteratee) {
+      n = toInteger(n);
+      if (n < 1 || n > MAX_SAFE_INTEGER) {
+        return [];
+      }
+      var index = MAX_ARRAY_LENGTH,
+        length = nativeMin(n, MAX_ARRAY_LENGTH);
+
+      iteratee = getIteratee(iteratee);
+      n -= MAX_ARRAY_LENGTH;
+
+      var result = baseTimes(length, iteratee);
+      while (++index < n) {
+        iteratee(index);
+      }
+      return result;
+    }
+
+    /**
+     * Converts `value` to a property path array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {*} value The value to convert.
+     * @returns {Array} Returns the new property path array.
+     * @example
+     *
+     * _.toPath('a.b.c');
+     * // => ['a', 'b', 'c']
+     *
+     * _.toPath('a[0].b.c');
+     * // => ['a', '0', 'b', 'c']
+     */
+    function toPath(value) {
+      if (isArray(value)) {
+        return arrayMap(value, toKey);
+      }
+      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
+    }
+
+    /**
+     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {string} [prefix=''] The value to prefix the ID with.
+     * @returns {string} Returns the unique ID.
+     * @example
+     *
+     * _.uniqueId('contact_');
+     * // => 'contact_104'
+     *
+     * _.uniqueId();
+     * // => '105'
+     */
+    function uniqueId(prefix) {
+      var id = ++idCounter;
+      return toString(prefix) + id;
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Adds two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.4.0
+     * @category Math
+     * @param {number} augend The first number in an addition.
+     * @param {number} addend The second number in an addition.
+     * @returns {number} Returns the total.
+     * @example
+     *
+     * _.add(6, 4);
+     * // => 10
+     */
+    var add = createMathOperation(function(augend, addend) {
+      return augend + addend;
+    }, 0);
+
+    /**
+     * Computes `number` rounded up to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round up.
+     * @param {number} [precision=0] The precision to round up to.
+     * @returns {number} Returns the rounded up number.
+     * @example
+     *
+     * _.ceil(4.006);
+     * // => 5
+     *
+     * _.ceil(6.004, 2);
+     * // => 6.01
+     *
+     * _.ceil(6040, -2);
+     * // => 6100
+     */
+    var ceil = createRound('ceil');
+
+    /**
+     * Divide two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {number} dividend The first number in a division.
+     * @param {number} divisor The second number in a division.
+     * @returns {number} Returns the quotient.
+     * @example
+     *
+     * _.divide(6, 4);
+     * // => 1.5
+     */
+    var divide = createMathOperation(function(dividend, divisor) {
+      return dividend / divisor;
+    }, 1);
+
+    /**
+     * Computes `number` rounded down to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round down.
+     * @param {number} [precision=0] The precision to round down to.
+     * @returns {number} Returns the rounded down number.
+     * @example
+     *
+     * _.floor(4.006);
+     * // => 4
+     *
+     * _.floor(0.046, 2);
+     * // => 0.04
+     *
+     * _.floor(4060, -2);
+     * // => 4000
+     */
+    var floor = createRound('floor');
+
+    /**
+     * Computes the maximum value of `array`. If `array` is empty or falsey,
+     * `undefined` is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {*} Returns the maximum value.
+     * @example
+     *
+     * _.max([4, 2, 8, 6]);
+     * // => 8
+     *
+     * _.max([]);
+     * // => undefined
+     */
+    function max(array) {
+      return (array && array.length) ?
+        baseExtremum(array, identity, baseGt) :
+        undefined;
+    }
+
+    /**
+     * This method is like `_.max` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * the value is ranked. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {*} Returns the maximum value.
+     * @example
+     *
+     * var objects = [{ 'n': 1 }, { 'n': 2 }];
+     *
+     * _.maxBy(objects, function(o) { return o.n; });
+     * // => { 'n': 2 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.maxBy(objects, 'n');
+     * // => { 'n': 2 }
+     */
+    function maxBy(array, iteratee) {
+      return (array && array.length) ?
+        baseExtremum(array, getIteratee(iteratee, 2), baseGt) :
+        undefined;
+    }
+
+    /**
+     * Computes the mean of the values in `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {number} Returns the mean.
+     * @example
+     *
+     * _.mean([4, 2, 8, 6]);
+     * // => 5
+     */
+    function mean(array) {
+      return baseMean(array, identity);
+    }
+
+    /**
+     * This method is like `_.mean` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the value to be averaged.
+     * The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the mean.
+     * @example
+     *
+     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+     *
+     * _.meanBy(objects, function(o) { return o.n; });
+     * // => 5
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.meanBy(objects, 'n');
+     * // => 5
+     */
+    function meanBy(array, iteratee) {
+      return baseMean(array, getIteratee(iteratee, 2));
+    }
+
+    /**
+     * Computes the minimum value of `array`. If `array` is empty or falsey,
+     * `undefined` is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {*} Returns the minimum value.
+     * @example
+     *
+     * _.min([4, 2, 8, 6]);
+     * // => 2
+     *
+     * _.min([]);
+     * // => undefined
+     */
+    function min(array) {
+      return (array && array.length) ?
+        baseExtremum(array, identity, baseLt) :
+        undefined;
+    }
+
+    /**
+     * This method is like `_.min` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * the value is ranked. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {*} Returns the minimum value.
+     * @example
+     *
+     * var objects = [{ 'n': 1 }, { 'n': 2 }];
+     *
+     * _.minBy(objects, function(o) { return o.n; });
+     * // => { 'n': 1 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.minBy(objects, 'n');
+     * // => { 'n': 1 }
+     */
+    function minBy(array, iteratee) {
+      return (array && array.length) ?
+        baseExtremum(array, getIteratee(iteratee, 2), baseLt) :
+        undefined;
+    }
+
+    /**
+     * Multiply two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {number} multiplier The first number in a multiplication.
+     * @param {number} multiplicand The second number in a multiplication.
+     * @returns {number} Returns the product.
+     * @example
+     *
+     * _.multiply(6, 4);
+     * // => 24
+     */
+    var multiply = createMathOperation(function(multiplier, multiplicand) {
+      return multiplier * multiplicand;
+    }, 1);
+
+    /**
+     * Computes `number` rounded to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round.
+     * @param {number} [precision=0] The precision to round to.
+     * @returns {number} Returns the rounded number.
+     * @example
+     *
+     * _.round(4.006);
+     * // => 4
+     *
+     * _.round(4.006, 2);
+     * // => 4.01
+     *
+     * _.round(4060, -2);
+     * // => 4100
+     */
+    var round = createRound('round');
+
+    /**
+     * Subtract two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {number} minuend The first number in a subtraction.
+     * @param {number} subtrahend The second number in a subtraction.
+     * @returns {number} Returns the difference.
+     * @example
+     *
+     * _.subtract(6, 4);
+     * // => 2
+     */
+    var subtract = createMathOperation(function(minuend, subtrahend) {
+      return minuend - subtrahend;
+    }, 0);
+
+    /**
+     * Computes the sum of the values in `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.4.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {number} Returns the sum.
+     * @example
+     *
+     * _.sum([4, 2, 8, 6]);
+     * // => 20
+     */
+    function sum(array) {
+      return (array && array.length) ?
+        baseSum(array, identity) :
+        0;
+    }
+
+    /**
+     * This method is like `_.sum` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the value to be summed.
+     * The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the sum.
+     * @example
+     *
+     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+     *
+     * _.sumBy(objects, function(o) { return o.n; });
+     * // => 20
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sumBy(objects, 'n');
+     * // => 20
+     */
+    function sumBy(array, iteratee) {
+      return (array && array.length) ?
+        baseSum(array, getIteratee(iteratee, 2)) :
+        0;
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    // Add methods that return wrapped values in chain sequences.
+    lodash.after = after;
+    lodash.ary = ary;
+    lodash.assign = assign;
+    lodash.assignIn = assignIn;
+    lodash.assignInWith = assignInWith;
+    lodash.assignWith = assignWith;
+    lodash.at = at;
+    lodash.before = before;
+    lodash.bind = bind;
+    lodash.bindAll = bindAll;
+    lodash.bindKey = bindKey;
+    lodash.castArray = castArray;
+    lodash.chain = chain;
+    lodash.chunk = chunk;
+    lodash.compact = compact;
+    lodash.concat = concat;
+    lodash.cond = cond;
+    lodash.conforms = conforms;
+    lodash.constant = constant;
+    lodash.countBy = countBy;
+    lodash.create = create;
+    lodash.curry = curry;
+    lodash.curryRight = curryRight;
+    lodash.debounce = debounce;
+    lodash.defaults = defaults;
+    lodash.defaultsDeep = defaultsDeep;
+    lodash.defer = defer;
+    lodash.delay = delay;
+    lodash.difference = difference;
+    lodash.differenceBy = differenceBy;
+    lodash.differenceWith = differenceWith;
+    lodash.drop = drop;
+    lodash.dropRight = dropRight;
+    lodash.dropRightWhile = dropRightWhile;
+    lodash.dropWhile = dropWhile;
+    lodash.fill = fill;
+    lodash.filter = filter;
+    lodash.flatMap = flatMap;
+    lodash.flatMapDeep = flatMapDeep;
+    lodash.flatMapDepth = flatMapDepth;
+    lodash.flatten = flatten;
+    lodash.flattenDeep = flattenDeep;
+    lodash.flattenDepth = flattenDepth;
+    lodash.flip = flip;
+    lodash.flow = flow;
+    lodash.flowRight = flowRight;
+    lodash.fromPairs = fromPairs;
+    lodash.functions = functions;
+    lodash.functionsIn = functionsIn;
+    lodash.groupBy = groupBy;
+    lodash.initial = initial;
+    lodash.intersection = intersection;
+    lodash.intersectionBy = intersectionBy;
+    lodash.intersectionWith = intersectionWith;
+    lodash.invert = invert;
+    lodash.invertBy = invertBy;
+    lodash.invokeMap = invokeMap;
+    lodash.iteratee = iteratee;
+    lodash.keyBy = keyBy;
+    lodash.keys = keys;
+    lodash.keysIn = keysIn;
+    lodash.map = map;
+    lodash.mapKeys = mapKeys;
+    lodash.mapValues = mapValues;
+    lodash.matches = matches;
+    lodash.matchesProperty = matchesProperty;
+    lodash.memoize = memoize;
+    lodash.merge = merge;
+    lodash.mergeWith = mergeWith;
+    lodash.method = method;
+    lodash.methodOf = methodOf;
+    lodash.mixin = mixin;
+    lodash.negate = negate;
+    lodash.nthArg = nthArg;
+    lodash.omit = omit;
+    lodash.omitBy = omitBy;
+    lodash.once = once;
+    lodash.orderBy = orderBy;
+    lodash.over = over;
+    lodash.overArgs = overArgs;
+    lodash.overEvery = overEvery;
+    lodash.overSome = overSome;
+    lodash.partial = partial;
+    lodash.partialRight = partialRight;
+    lodash.partition = partition;
+    lodash.pick = pick;
+    lodash.pickBy = pickBy;
+    lodash.property = property;
+    lodash.propertyOf = propertyOf;
+    lodash.pull = pull;
+    lodash.pullAll = pullAll;
+    lodash.pullAllBy = pullAllBy;
+    lodash.pullAllWith = pullAllWith;
+    lodash.pullAt = pullAt;
+    lodash.range = range;
+    lodash.rangeRight = rangeRight;
+    lodash.rearg = rearg;
+    lodash.reject = reject;
+    lodash.remove = remove;
+    lodash.rest = rest;
+    lodash.reverse = reverse;
+    lodash.sampleSize = sampleSize;
+    lodash.set = set;
+    lodash.setWith = setWith;
+    lodash.shuffle = shuffle;
+    lodash.slice = slice;
+    lodash.sortBy = sortBy;
+    lodash.sortedUniq = sortedUniq;
+    lodash.sortedUniqBy = sortedUniqBy;
+    lodash.split = split;
+    lodash.spread = spread;
+    lodash.tail = tail;
+    lodash.take = take;
+    lodash.takeRight = takeRight;
+    lodash.takeRightWhile = takeRightWhile;
+    lodash.takeWhile = takeWhile;
+    lodash.tap = tap;
+    lodash.throttle = throttle;
+    lodash.thru = thru;
+    lodash.toArray = toArray;
+    lodash.toPairs = toPairs;
+    lodash.toPairsIn = toPairsIn;
+    lodash.toPath = toPath;
+    lodash.toPlainObject = toPlainObject;
+    lodash.transform = transform;
+    lodash.unary = unary;
+    lodash.union = union;
+    lodash.unionBy = unionBy;
+    lodash.unionWith = unionWith;
+    lodash.uniq = uniq;
+    lodash.uniqBy = uniqBy;
+    lodash.uniqWith = uniqWith;
+    lodash.unset = unset;
+    lodash.unzip = unzip;
+    lodash.unzipWith = unzipWith;
+    lodash.update = update;
+    lodash.updateWith = updateWith;
+    lodash.values = values;
+    lodash.valuesIn = valuesIn;
+    lodash.without = without;
+    lodash.words = words;
+    lodash.wrap = wrap;
+    lodash.xor = xor;
+    lodash.xorBy = xorBy;
+    lodash.xorWith = xorWith;
+    lodash.zip = zip;
+    lodash.zipObject = zipObject;
+    lodash.zipObjectDeep = zipObjectDeep;
+    lodash.zipWith = zipWith;
+
+    // Add aliases.
+    lodash.entries = toPairs;
+    lodash.entriesIn = toPairsIn;
+    lodash.extend = assignIn;
+    lodash.extendWith = assignInWith;
+
+    // Add methods to `lodash.prototype`.
+    mixin(lodash, lodash);
+
+    /*------------------------------------------------------------------------*/
+
+    // Add methods that return unwrapped values in chain sequences.
+    lodash.add = add;
+    lodash.attempt = attempt;
+    lodash.camelCase = camelCase;
+    lodash.capitalize = capitalize;
+    lodash.ceil = ceil;
+    lodash.clamp = clamp;
+    lodash.clone = clone;
+    lodash.cloneDeep = cloneDeep;
+    lodash.cloneDeepWith = cloneDeepWith;
+    lodash.cloneWith = cloneWith;
+    lodash.conformsTo = conformsTo;
+    lodash.deburr = deburr;
+    lodash.defaultTo = defaultTo;
+    lodash.divide = divide;
+    lodash.endsWith = endsWith;
+    lodash.eq = eq;
+    lodash.escape = escape;
+    lodash.escapeRegExp = escapeRegExp;
+    lodash.every = every;
+    lodash.find = find;
+    lodash.findIndex = findIndex;
+    lodash.findKey = findKey;
+    lodash.findLast = findLast;
+    lodash.findLastIndex = findLastIndex;
+    lodash.findLastKey = findLastKey;
+    lodash.floor = floor;
+    lodash.forEach = forEach;
+    lodash.forEachRight = forEachRight;
+    lodash.forIn = forIn;
+    lodash.forInRight = forInRight;
+    lodash.forOwn = forOwn;
+    lodash.forOwnRight = forOwnRight;
+    lodash.get = get;
+    lodash.gt = gt;
+    lodash.gte = gte;
+    lodash.has = has;
+    lodash.hasIn = hasIn;
+    lodash.head = head;
+    lodash.identity = identity;
+    lodash.includes = includes;
+    lodash.indexOf = indexOf;
+    lodash.inRange = inRange;
+    lodash.invoke = invoke;
+    lodash.isArguments = isArguments;
+    lodash.isArray = isArray;
+    lodash.isArrayBuffer = isArrayBuffer;
+    lodash.isArrayLike = isArrayLike;
+    lodash.isArrayLikeObject = isArrayLikeObject;
+    lodash.isBoolean = isBoolean;
+    lodash.isBuffer = isBuffer;
+    lodash.isDate = isDate;
+    lodash.isElement = isElement;
+    lodash.isEmpty = isEmpty;
+    lodash.isEqual = isEqual;
+    lodash.isEqualWith = isEqualWith;
+    lodash.isError = isError;
+    lodash.isFinite = isFinite;
+    lodash.isFunction = isFunction;
+    lodash.isInteger = isInteger;
+    lodash.isLength = isLength;
+    lodash.isMap = isMap;
+    lodash.isMatch = isMatch;
+    lodash.isMatchWith = isMatchWith;
+    lodash.isNaN = isNaN;
+    lodash.isNative = isNative;
+    lodash.isNil = isNil;
+    lodash.isNull = isNull;
+    lodash.isNumber = isNumber;
+    lodash.isObject = isObject;
+    lodash.isObjectLike = isObjectLike;
+    lodash.isPlainObject = isPlainObject;
+    lodash.isRegExp = isRegExp;
+    lodash.isSafeInteger = isSafeInteger;
+    lodash.isSet = isSet;
+    lodash.isString = isString;
+    lodash.isSymbol = isSymbol;
+    lodash.isTypedArray = isTypedArray;
+    lodash.isUndefined = isUndefined;
+    lodash.isWeakMap = isWeakMap;
+    lodash.isWeakSet = isWeakSet;
+    lodash.join = join;
+    lodash.kebabCase = kebabCase;
+    lodash.last = last;
+    lodash.lastIndexOf = lastIndexOf;
+    lodash.lowerCase = lowerCase;
+    lodash.lowerFirst = lowerFirst;
+    lodash.lt = lt;
+    lodash.lte = lte;
+    lodash.max = max;
+    lodash.maxBy = maxBy;
+    lodash.mean = mean;
+    lodash.meanBy = meanBy;
+    lodash.min = min;
+    lodash.minBy = minBy;
+    lodash.stubArray = stubArray;
+    lodash.stubFalse = stubFalse;
+    lodash.stubObject = stubObject;
+    lodash.stubString = stubString;
+    lodash.stubTrue = stubTrue;
+    lodash.multiply = multiply;
+    lodash.nth = nth;
+    lodash.noConflict = noConflict;
+    lodash.noop = noop;
+    lodash.now = now;
+    lodash.pad = pad;
+    lodash.padEnd = padEnd;
+    lodash.padStart = padStart;
+    lodash.parseInt = parseInt;
+    lodash.random = random;
+    lodash.reduce = reduce;
+    lodash.reduceRight = reduceRight;
+    lodash.repeat = repeat;
+    lodash.replace = replace;
+    lodash.result = result;
+    lodash.round = round;
+    lodash.runInContext = runInContext;
+    lodash.sample = sample;
+    lodash.size = size;
+    lodash.snakeCase = snakeCase;
+    lodash.some = some;
+    lodash.sortedIndex = sortedIndex;
+    lodash.sortedIndexBy = sortedIndexBy;
+    lodash.sortedIndexOf = sortedIndexOf;
+    lodash.sortedLastIndex = sortedLastIndex;
+    lodash.sortedLastIndexBy = sortedLastIndexBy;
+    lodash.sortedLastIndexOf = sortedLastIndexOf;
+    lodash.startCase = startCase;
+    lodash.startsWith = startsWith;
+    lodash.subtract = subtract;
+    lodash.sum = sum;
+    lodash.sumBy = sumBy;
+    lodash.template = template;
+    lodash.times = times;
+    lodash.toFinite = toFinite;
+    lodash.toInteger = toInteger;
+    lodash.toLength = toLength;
+    lodash.toLower = toLower;
+    lodash.toNumber = toNumber;
+    lodash.toSafeInteger = toSafeInteger;
+    lodash.toString = toString;
+    lodash.toUpper = toUpper;
+    lodash.trim = trim;
+    lodash.trimEnd = trimEnd;
+    lodash.trimStart = trimStart;
+    lodash.truncate = truncate;
+    lodash.unescape = unescape;
+    lodash.uniqueId = uniqueId;
+    lodash.upperCase = upperCase;
+    lodash.upperFirst = upperFirst;
+
+    // Add aliases.
+    lodash.each = forEach;
+    lodash.eachRight = forEachRight;
+    lodash.first = head;
+
+    mixin(lodash, (function() {
+      var source = {};
+      baseForOwn(lodash, function(func, methodName) {
+        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
+          source[methodName] = func;
+        }
+      });
+      return source;
+    }()), {
+      'chain': false
+    });
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * The semantic version number.
+     *
+     * @static
+     * @memberOf _
+     * @type {string}
+     */
+    lodash.VERSION = VERSION;
+
+    // Assign default placeholders.
+    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
+      lodash[methodName].placeholder = lodash;
+    });
+
+    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
+    arrayEach(['drop', 'take'], function(methodName, index) {
+      LazyWrapper.prototype[methodName] = function(n) {
+        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
+
+        var result = (this.__filtered__ && !index) ?
+          new LazyWrapper(this) :
+          this.clone();
+
+        if (result.__filtered__) {
+          result.__takeCount__ = nativeMin(n, result.__takeCount__);
+        } else {
+          result.__views__.push({
+            'size': nativeMin(n, MAX_ARRAY_LENGTH),
+            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
+          });
+        }
+        return result;
+      };
+
+      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
+        return this.reverse()[methodName](n).reverse();
+      };
+    });
+
+    // Add `LazyWrapper` methods that accept an `iteratee` value.
+    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
+      var type = index + 1,
+        isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
+
+      LazyWrapper.prototype[methodName] = function(iteratee) {
+        var result = this.clone();
+        result.__iteratees__.push({
+          'iteratee': getIteratee(iteratee, 3),
+          'type': type
+        });
+        result.__filtered__ = result.__filtered__ || isFilter;
+        return result;
+      };
+    });
+
+    // Add `LazyWrapper` methods for `_.head` and `_.last`.
+    arrayEach(['head', 'last'], function(methodName, index) {
+      var takeName = 'take' + (index ? 'Right' : '');
+
+      LazyWrapper.prototype[methodName] = function() {
+        return this[takeName](1).value()[0];
+      };
+    });
+
+    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
+    arrayEach(['initial', 'tail'], function(methodName, index) {
+      var dropName = 'drop' + (index ? '' : 'Right');
+
+      LazyWrapper.prototype[methodName] = function() {
+        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
+      };
+    });
+
+    LazyWrapper.prototype.compact = function() {
+      return this.filter(identity);
+    };
+
+    LazyWrapper.prototype.find = function(predicate) {
+      return this.filter(predicate).head();
+    };
+
+    LazyWrapper.prototype.findLast = function(predicate) {
+      return this.reverse().find(predicate);
+    };
+
+    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
+      if (typeof path == 'function') {
+        return new LazyWrapper(this);
+      }
+      return this.map(function(value) {
+        return baseInvoke(value, path, args);
+      });
+    });
+
+    LazyWrapper.prototype.reject = function(predicate) {
+      return this.filter(negate(getIteratee(predicate)));
+    };
+
+    LazyWrapper.prototype.slice = function(start, end) {
+      start = toInteger(start);
+
+      var result = this;
+      if (result.__filtered__ && (start > 0 || end < 0)) {
+        return new LazyWrapper(result);
+      }
+      if (start < 0) {
+        result = result.takeRight(-start);
+      } else if (start) {
+        result = result.drop(start);
+      }
+      if (end !== undefined) {
+        end = toInteger(end);
+        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
+      }
+      return result;
+    };
+
+    LazyWrapper.prototype.takeRightWhile = function(predicate) {
+      return this.reverse().takeWhile(predicate).reverse();
+    };
+
+    LazyWrapper.prototype.toArray = function() {
+      return this.take(MAX_ARRAY_LENGTH);
+    };
+
+    // Add `LazyWrapper` methods to `lodash.prototype`.
+    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
+        isTaker = /^(?:head|last)$/.test(methodName),
+        lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
+        retUnwrapped = isTaker || /^find/.test(methodName);
+
+      if (!lodashFunc) {
+        return;
+      }
+      lodash.prototype[methodName] = function() {
+        var value = this.__wrapped__,
+          args = isTaker ? [1] : arguments,
+          isLazy = value instanceof LazyWrapper,
+          iteratee = args[0],
+          useLazy = isLazy || isArray(value);
+
+        var interceptor = function(value) {
+          var result = lodashFunc.apply(lodash, arrayPush([value], args));
+          return (isTaker && chainAll) ? result[0] : result;
+        };
+
+        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
+          // Avoid lazy use if the iteratee has a "length" value other than `1`.
+          isLazy = useLazy = false;
+        }
+        var chainAll = this.__chain__,
+          isHybrid = !!this.__actions__.length,
+          isUnwrapped = retUnwrapped && !chainAll,
+          onlyLazy = isLazy && !isHybrid;
+
+        if (!retUnwrapped && useLazy) {
+          value = onlyLazy ? value : new LazyWrapper(this);
+          var result = func.apply(value, args);
+          result.__actions__.push({
+            'func': thru,
+            'args': [interceptor],
+            'thisArg': undefined
+          });
+          return new LodashWrapper(result, chainAll);
+        }
+        if (isUnwrapped && onlyLazy) {
+          return func.apply(this, args);
+        }
+        result = this.thru(interceptor);
+        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
+      };
+    });
+
+    // Add `Array` methods to `lodash.prototype`.
+    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
+      var func = arrayProto[methodName],
+        chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
+        retUnwrapped = /^(?:pop|shift)$/.test(methodName);
+
+      lodash.prototype[methodName] = function() {
+        var args = arguments;
+        if (retUnwrapped && !this.__chain__) {
+          var value = this.value();
+          return func.apply(isArray(value) ? value : [], args);
+        }
+        return this[chainName](function(value) {
+          return func.apply(isArray(value) ? value : [], args);
+        });
+      };
+    });
+
+    // Map minified method names to their real names.
+    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+      var lodashFunc = lodash[methodName];
+      if (lodashFunc) {
+        var key = lodashFunc.name + '';
+        if (!hasOwnProperty.call(realNames, key)) {
+          realNames[key] = [];
+        }
+        realNames[key].push({
+          'name': methodName,
+          'func': lodashFunc
+        });
+      }
+    });
+
+    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
+      'name': 'wrapper',
+      'func': undefined
+    }];
+
+    // Add methods to `LazyWrapper`.
+    LazyWrapper.prototype.clone = lazyClone;
+    LazyWrapper.prototype.reverse = lazyReverse;
+    LazyWrapper.prototype.value = lazyValue;
+
+    // Add chain sequence methods to the `lodash` wrapper.
+    lodash.prototype.at = wrapperAt;
+    lodash.prototype.chain = wrapperChain;
+    lodash.prototype.commit = wrapperCommit;
+    lodash.prototype.next = wrapperNext;
+    lodash.prototype.plant = wrapperPlant;
+    lodash.prototype.reverse = wrapperReverse;
+    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
+
+    // Add lazy aliases.
+    lodash.prototype.first = lodash.prototype.head;
+
+    if (symIterator) {
+      lodash.prototype[symIterator] = wrapperToIterator;
+    }
+    return lodash;
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  // Export lodash.
+  var _ = runInContext();
+
+  // Some AMD build optimizers, like r.js, check for condition patterns like:
+  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+    // Expose Lodash on the global object to prevent errors when Lodash is
+    // loaded by a script tag in the presence of an AMD loader.
+    // See http://requirejs.org/docs/errors.html#mismatch for more details.
+    // Use `_.noConflict` to remove Lodash from the global object.
+    root._ = _;
+
+    // Define as an anonymous module so, through path mapping, it can be
+    // referenced as the "underscore" module.
+    define(function() {
+      return _;
+    });
+  }
+  // Check for `exports` after `define` in case a build optimizer adds it.
+  else if (freeModule) {
+    // Export for Node.js.
+    (freeModule.exports = _)._ = _;
+    // Export for CommonJS support.
+    freeExports._ = _;
+  } else {
+    // Export to the global object.
+    root._ = _;
+  }
+}.call(this));
\ No newline at end of file
diff --git a/public/tvox/js/ng-flow-standalone.min.js b/public/tvox/js/ng-flow-standalone.min.js
new file mode 100644
index 0000000..e38ec91
--- /dev/null
+++ b/public/tvox/js/ng-flow-standalone.min.js
@@ -0,0 +1,650 @@
+/*! @flowjs/ng-flow 2.7.8 */ ! function(a, b, c) {
+  "use strict";
+
+  function d(b) {
+    if (this.support = !("undefined" == typeof File || "undefined" == typeof Blob || "undefined" == typeof FileList || !Blob.prototype.slice && !Blob.prototype.webkitSlice && !Blob.prototype.mozSlice), this.support) {
+      this.supportDirectory = /Chrome/.test(a.navigator.userAgent) || /Firefox/.test(a.navigator.userAgent) || /Edge/.test(a.navigator.userAgent), this.files = [], this.defaults = {
+        chunkSize: 1048576,
+        forceChunkSize: !1,
+        simultaneousUploads: 3,
+        singleFile: !1,
+        fileParameterName: "file",
+        progressCallbacksInterval: 500,
+        speedSmoothingFactor: .1,
+        query: {},
+        headers: {},
+        withCredentials: !1,
+        preprocess: null,
+        method: "multipart",
+        testMethod: "GET",
+        uploadMethod: "POST",
+        prioritizeFirstAndLastChunk: !1,
+        allowDuplicateUploads: !1,
+        target: "/",
+        testChunks: !0,
+        generateUniqueIdentifier: null,
+        maxChunkRetries: 0,
+        chunkRetryInterval: null,
+        permanentErrors: [404, 413, 415, 500, 501],
+        successStatuses: [200, 201, 202],
+        onDropStopPropagation: !1,
+        initFileFn: null,
+        readFileFn: f
+      }, this.opts = {}, this.events = {};
+      var c = this;
+      this.onDrop = function(a) {
+        c.opts.onDropStopPropagation && a.stopPropagation(), a.preventDefault();
+        var b = a.dataTransfer;
+        b.items && b.items[0] && b.items[0].webkitGetAsEntry ? c.webkitReadDataTransfer(a) : c.addFiles(b.files, a)
+      }, this.preventEvent = function(a) {
+        a.preventDefault()
+      }, this.opts = d.extend({}, this.defaults, b || {})
+    }
+  }
+
+  function e(a, b, d) {
+    this.flowObj = a, this.bytes = null, this.file = b, this.name = b.fileName || b.name, this.size = b.size, this.relativePath = b.relativePath || b.webkitRelativePath || this.name, this.uniqueIdentifier = d === c ? a.generateUniqueIdentifier(b) : d, this.chunks = [], this.paused = !1, this.error = !1, this.averageSpeed = 0, this.currentSpeed = 0, this._lastProgressCallback = Date.now(), this._prevUploadedSize = 0, this._prevProgress = 0, this.bootstrap()
+  }
+
+  function f(a, b, c, d, e) {
+    var f = "slice";
+    a.file.slice ? f = "slice" : a.file.mozSlice ? f = "mozSlice" : a.file.webkitSlice && (f = "webkitSlice"), e.readFinished(a.file[f](b, c, d))
+  }
+
+  function g(a, b, c) {
+    this.flowObj = a, this.fileObj = b, this.offset = c, this.tested = !1, this.retries = 0, this.pendingRetry = !1, this.preprocessState = 0, this.readState = 0, this.loaded = 0, this.total = 0, this.chunkSize = this.flowObj.opts.chunkSize, this.startByte = this.offset * this.chunkSize, this.computeEndByte = function() {
+      var a = Math.min(this.fileObj.size, (this.offset + 1) * this.chunkSize);
+      return this.fileObj.size - a < this.chunkSize && !this.flowObj.opts.forceChunkSize && (a = this.fileObj.size), a
+    }, this.endByte = this.computeEndByte(), this.xhr = null;
+    var d = this;
+    this.event = function(a, b) {
+      b = Array.prototype.slice.call(arguments), b.unshift(d), d.fileObj.chunkEvent.apply(d.fileObj, b)
+    }, this.progressHandler = function(a) {
+      a.lengthComputable && (d.loaded = a.loaded, d.total = a.total), d.event("progress", a)
+    }, this.testHandler = function(a) {
+      var b = d.status(!0);
+      "error" === b ? (d.event(b, d.message()), d.flowObj.uploadNextChunk()) : "success" === b ? (d.tested = !0, d.event(b, d.message()), d.flowObj.uploadNextChunk()) : d.fileObj.paused || (d.tested = !0, d.send())
+    }, this.doneHandler = function(a) {
+      var b = d.status();
+      if ("success" === b || "error" === b) delete this.data, d.event(b, d.message()), d.flowObj.uploadNextChunk();
+      else {
+        d.event("retry", d.message()), d.pendingRetry = !0, d.abort(), d.retries++;
+        var c = d.flowObj.opts.chunkRetryInterval;
+        null !== c ? setTimeout(function() {
+          d.send()
+        }, c) : d.send()
+      }
+    }
+  }
+
+  function h(a, b) {
+    var c = a.indexOf(b);
+    c > -1 && a.splice(c, 1)
+  }
+
+  function i(a, b) {
+    return "function" == typeof a && (b = Array.prototype.slice.call(arguments), a = a.apply(null, b.slice(1))), a
+  }
+
+  function j(a, b) {
+    setTimeout(a.bind(b), 0)
+  }
+
+  function k(a, b) {
+    return l(arguments, function(b) {
+      b !== a && l(b, function(b, c) {
+        a[c] = b
+      })
+    }), a
+  }
+
+  function l(a, b, c) {
+    if (a) {
+      var d;
+      if ("undefined" != typeof a.length) {
+        for (d = 0; d < a.length; d++)
+          if (b.call(c, a[d], d) === !1) return
+      } else
+        for (d in a)
+          if (a.hasOwnProperty(d) && b.call(c, a[d], d) === !1) return
+    }
+  }
+  var m = a.navigator.msPointerEnabled;
+  d.prototype = {
+    on: function(a, b) {
+      a = a.toLowerCase(), this.events.hasOwnProperty(a) || (this.events[a] = []), this.events[a].push(b)
+    },
+    off: function(a, b) {
+      a !== c ? (a = a.toLowerCase(), b !== c ? this.events.hasOwnProperty(a) && h(this.events[a], b) : delete this.events[a]) : this.events = {}
+    },
+    fire: function(a, b) {
+      b = Array.prototype.slice.call(arguments), a = a.toLowerCase();
+      var c = !1;
+      return this.events.hasOwnProperty(a) && l(this.events[a], function(a) {
+        c = a.apply(this, b.slice(1)) === !1 || c
+      }, this), "catchall" != a && (b.unshift("catchAll"), c = this.fire.apply(this, b) === !1 || c), !c
+    },
+    webkitReadDataTransfer: function(a) {
+      function b(a) {
+        a.readEntries(function(f) {
+          f.length ? (g += f.length, l(f, function(a) {
+            if (a.isFile) {
+              var e = a.fullPath;
+              a.file(function(a) {
+                c(a, e)
+              }, d)
+            } else a.isDirectory && b(a.createReader())
+          }), b(a)) : e()
+        }, d)
+      }
+
+      function c(a, b) {
+        a.relativePath = b.substring(1), h.push(a), e()
+      }
+
+      function d(a) {
+        throw a
+      }
+
+      function e() {
+        0 == --g && f.addFiles(h, a)
+      }
+      var f = this,
+        g = a.dataTransfer.items.length,
+        h = [];
+      l(a.dataTransfer.items, function(a) {
+        var d = a.webkitGetAsEntry();
+        return d ? void(d.isFile ? c(a.getAsFile(), d.fullPath) : b(d.createReader())) : void e()
+      })
+    },
+    generateUniqueIdentifier: function(a) {
+      var b = this.opts.generateUniqueIdentifier;
+      if ("function" == typeof b) return b(a);
+      var c = a.relativePath || a.webkitRelativePath || a.fileName || a.name;
+      return a.size + "-" + c.replace(/[^0-9a-zA-Z_-]/gim, "")
+    },
+    uploadNextChunk: function(a) {
+      var b = !1;
+      if (this.opts.prioritizeFirstAndLastChunk && (l(this.files, function(a) {
+          return !a.paused && a.chunks.length && "pending" === a.chunks[0].status() ? (a.chunks[0].send(), b = !0, !1) : !a.paused && a.chunks.length > 1 && "pending" === a.chunks[a.chunks.length - 1].status() ? (a.chunks[a.chunks.length - 1].send(), b = !0, !1) : void 0
+        }), b)) return b;
+      if (l(this.files, function(a) {
+          return a.paused || l(a.chunks, function(a) {
+            return "pending" === a.status() ? (a.send(), b = !0, !1) : void 0
+          }), b ? !1 : void 0
+        }), b) return !0;
+      var c = !1;
+      return l(this.files, function(a) {
+        return a.isComplete() ? void 0 : (c = !0, !1)
+      }), c || a || j(function() {
+        this.fire("complete")
+      }, this), !1
+    },
+    assignBrowse: function(a, c, d, e) {
+      a instanceof Element && (a = [a]), l(a, function(a) {
+        var f;
+        "INPUT" === a.tagName && "file" === a.type ? f = a : (f = b.createElement("input"), f.setAttribute("type", "file"), k(f.style, {
+          visibility: "hidden",
+          position: "absolute",
+          width: "1px",
+          height: "1px"
+        }), a.appendChild(f), a.addEventListener("click", function() {
+          f.click()
+        }, !1)), this.opts.singleFile || d || f.setAttribute("multiple", "multiple"), c && f.setAttribute("webkitdirectory", "webkitdirectory"), l(e, function(a, b) {
+          f.setAttribute(b, a)
+        });
+        var g = this;
+        f.addEventListener("change", function(a) {
+          a.target.value && (g.addFiles(a.target.files, a), a.target.value = "")
+        }, !1)
+      }, this)
+    },
+    assignDrop: function(a) {
+      "undefined" == typeof a.length && (a = [a]), l(a, function(a) {
+        a.addEventListener("dragover", this.preventEvent, !1), a.addEventListener("dragenter", this.preventEvent, !1), a.addEventListener("drop", this.onDrop, !1)
+      }, this)
+    },
+    unAssignDrop: function(a) {
+      "undefined" == typeof a.length && (a = [a]), l(a, function(a) {
+        a.removeEventListener("dragover", this.preventEvent), a.removeEventListener("dragenter", this.preventEvent), a.removeEventListener("drop", this.onDrop)
+      }, this)
+    },
+    isUploading: function() {
+      var a = !1;
+      return l(this.files, function(b) {
+        return b.isUploading() ? (a = !0, !1) : void 0
+      }), a
+    },
+    _shouldUploadNext: function() {
+      var a = 0,
+        b = !0,
+        c = this.opts.simultaneousUploads;
+      return l(this.files, function(d) {
+        l(d.chunks, function(d) {
+          return "uploading" === d.status() && (a++, a >= c) ? (b = !1, !1) : void 0
+        })
+      }), b && a
+    },
+    upload: function() {
+      var a = this._shouldUploadNext();
+      if (a !== !1) {
+        this.fire("uploadStart");
+        for (var b = !1, c = 1; c <= this.opts.simultaneousUploads - a; c++) b = this.uploadNextChunk(!0) || b;
+        b || j(function() {
+          this.fire("complete")
+        }, this)
+      }
+    },
+    resume: function() {
+      l(this.files, function(a) {
+        a.isComplete() || a.resume()
+      })
+    },
+    pause: function() {
+      l(this.files, function(a) {
+        a.pause()
+      })
+    },
+    cancel: function() {
+      for (var a = this.files.length - 1; a >= 0; a--) this.files[a].cancel()
+    },
+    progress: function() {
+      var a = 0,
+        b = 0;
+      return l(this.files, function(c) {
+        a += c.progress() * c.size, b += c.size
+      }), b > 0 ? a / b : 0
+    },
+    addFile: function(a, b) {
+      this.addFiles([a], b)
+    },
+    addFiles: function(a, b) {
+      var c = [];
+      l(a, function(a) {
+        if ((!m || m && a.size > 0) && (a.size % 4096 !== 0 || "." !== a.name && "." !== a.fileName)) {
+          var d = this.generateUniqueIdentifier(a);
+          if (this.opts.allowDuplicateUploads || !this.getFromUniqueIdentifier(d)) {
+            var f = new e(this, a, d);
+            this.fire("fileAdded", f, b) && c.push(f)
+          }
+        }
+      }, this), this.fire("filesAdded", c, b) && (l(c, function(a) {
+        this.opts.singleFile && this.files.length > 0 && this.removeFile(this.files[0]), this.files.push(a)
+      }, this), this.fire("filesSubmitted", c, b))
+    },
+    removeFile: function(a) {
+      for (var b = this.files.length - 1; b >= 0; b--) this.files[b] === a && (this.files.splice(b, 1), a.abort(), this.fire("fileRemoved", a))
+    },
+    getFromUniqueIdentifier: function(a) {
+      var b = !1;
+      return l(this.files, function(c) {
+        c.uniqueIdentifier === a && (b = c)
+      }), b
+    },
+    getSize: function() {
+      var a = 0;
+      return l(this.files, function(b) {
+        a += b.size
+      }), a
+    },
+    sizeUploaded: function() {
+      var a = 0;
+      return l(this.files, function(b) {
+        a += b.sizeUploaded()
+      }), a
+    },
+    timeRemaining: function() {
+      var a = 0,
+        b = 0;
+      return l(this.files, function(c) {
+        c.paused || c.error || (a += c.size - c.sizeUploaded(), b += c.averageSpeed)
+      }), a && !b ? Number.POSITIVE_INFINITY : a || b ? Math.floor(a / b) : 0
+    }
+  }, e.prototype = {
+    measureSpeed: function() {
+      var a = Date.now() - this._lastProgressCallback;
+      if (a) {
+        var b = this.flowObj.opts.speedSmoothingFactor,
+          c = this.sizeUploaded();
+        this.currentSpeed = Math.max((c - this._prevUploadedSize) / a * 1e3, 0), this.averageSpeed = b * this.currentSpeed + (1 - b) * this.averageSpeed, this._prevUploadedSize = c
+      }
+    },
+    chunkEvent: function(a, b, c) {
+      switch (b) {
+        case "progress":
+          if (Date.now() - this._lastProgressCallback < this.flowObj.opts.progressCallbacksInterval) break;
+          this.measureSpeed(), this.flowObj.fire("fileProgress", this, a), this.flowObj.fire("progress"), this._lastProgressCallback = Date.now();
+          break;
+        case "error":
+          this.error = !0, this.abort(!0), this.flowObj.fire("fileError", this, c, a), this.flowObj.fire("error", c, this, a);
+          break;
+        case "success":
+          if (this.error) return;
+          this.measureSpeed(), this.flowObj.fire("fileProgress", this, a), this.flowObj.fire("progress"), this._lastProgressCallback = Date.now(), this.isComplete() && (this.currentSpeed = 0, this.averageSpeed = 0, this.flowObj.fire("fileSuccess", this, c, a));
+          break;
+        case "retry":
+          this.flowObj.fire("fileRetry", this, a)
+      }
+    },
+    pause: function() {
+      this.paused = !0, this.abort()
+    },
+    resume: function() {
+      this.paused = !1, this.flowObj.upload()
+    },
+    abort: function(a) {
+      this.currentSpeed = 0, this.averageSpeed = 0;
+      var b = this.chunks;
+      a && (this.chunks = []), l(b, function(a) {
+        "uploading" === a.status() && (a.abort(), this.flowObj.uploadNextChunk())
+      }, this)
+    },
+    cancel: function() {
+      this.flowObj.removeFile(this)
+    },
+    retry: function() {
+      this.bootstrap(), this.flowObj.upload()
+    },
+    bootstrap: function() {
+      "function" == typeof this.flowObj.opts.initFileFn && this.flowObj.opts.initFileFn(this), this.abort(!0), this.error = !1, this._prevProgress = 0;
+      for (var a = this.flowObj.opts.forceChunkSize ? Math.ceil : Math.floor, b = Math.max(a(this.size / this.flowObj.opts.chunkSize), 1), c = 0; b > c; c++) this.chunks.push(new g(this.flowObj, this, c))
+    },
+    progress: function() {
+      if (this.error) return 1;
+      if (1 === this.chunks.length) return this._prevProgress = Math.max(this._prevProgress, this.chunks[0].progress()), this._prevProgress;
+      var a = 0;
+      l(this.chunks, function(b) {
+        a += b.progress() * (b.endByte - b.startByte)
+      });
+      var b = a / this.size;
+      return this._prevProgress = Math.max(this._prevProgress, b > .9999 ? 1 : b), this._prevProgress
+    },
+    isUploading: function() {
+      var a = !1;
+      return l(this.chunks, function(b) {
+        return "uploading" === b.status() ? (a = !0, !1) : void 0
+      }), a
+    },
+    isComplete: function() {
+      var a = !1;
+      return l(this.chunks, function(b) {
+        var c = b.status();
+        return "pending" === c || "uploading" === c || "reading" === c || 1 === b.preprocessState || 1 === b.readState ? (a = !0, !1) : void 0
+      }), !a
+    },
+    sizeUploaded: function() {
+      var a = 0;
+      return l(this.chunks, function(b) {
+        a += b.sizeUploaded()
+      }), a
+    },
+    timeRemaining: function() {
+      if (this.paused || this.error) return 0;
+      var a = this.size - this.sizeUploaded();
+      return a && !this.averageSpeed ? Number.POSITIVE_INFINITY : a || this.averageSpeed ? Math.floor(a / this.averageSpeed) : 0
+    },
+    getType: function() {
+      return this.file.type && this.file.type.split("/")[1]
+    },
+    getExtension: function() {
+      return this.name.substr((~-this.name.lastIndexOf(".") >>> 0) + 2).toLowerCase()
+    }
+  }, g.prototype = {
+    getParams: function() {
+      return {
+        flowChunkNumber: this.offset + 1,
+        flowChunkSize: this.flowObj.opts.chunkSize,
+        flowCurrentChunkSize: this.endByte - this.startByte,
+        flowTotalSize: this.fileObj.size,
+        flowIdentifier: this.fileObj.uniqueIdentifier,
+        flowFilename: this.fileObj.name,
+        flowRelativePath: this.fileObj.relativePath,
+        flowTotalChunks: this.fileObj.chunks.length
+      }
+    },
+    getTarget: function(a, b) {
+      return a += a.indexOf("?") < 0 ? "?" : "&", a + b.join("&")
+    },
+    test: function() {
+      this.xhr = new XMLHttpRequest, this.xhr.addEventListener("load", this.testHandler, !1), this.xhr.addEventListener("error", this.testHandler, !1);
+      var a = i(this.flowObj.opts.testMethod, this.fileObj, this),
+        b = this.prepareXhrRequest(a, !0);
+      this.xhr.send(b)
+    },
+    preprocessFinished: function() {
+      this.endByte = this.computeEndByte(), this.preprocessState = 2, this.send()
+    },
+    readFinished: function(a) {
+      this.readState = 2, this.bytes = a, this.send()
+    },
+    send: function() {
+      var a = this.flowObj.opts.preprocess,
+        b = this.flowObj.opts.readFileFn;
+      if ("function" == typeof a) switch (this.preprocessState) {
+        case 0:
+          return this.preprocessState = 1, void a(this);
+        case 1:
+          return
+      }
+      switch (this.readState) {
+        case 0:
+          return this.readState = 1, void b(this.fileObj, this.startByte, this.endByte, this.fileObj.file.type, this);
+        case 1:
+          return
+      }
+      if (this.flowObj.opts.testChunks && !this.tested) return void this.test();
+      this.loaded = 0, this.total = 0, this.pendingRetry = !1, this.xhr = new XMLHttpRequest, this.xhr.upload.addEventListener("progress", this.progressHandler, !1), this.xhr.addEventListener("load", this.doneHandler, !1), this.xhr.addEventListener("error", this.doneHandler, !1);
+      var c = i(this.flowObj.opts.uploadMethod, this.fileObj, this),
+        d = this.prepareXhrRequest(c, !1, this.flowObj.opts.method, this.bytes);
+      this.xhr.send(d)
+    },
+    abort: function() {
+      var a = this.xhr;
+      this.xhr = null, a && a.abort()
+    },
+    status: function(a) {
+      return 1 === this.readState ? "reading" : this.pendingRetry || 1 === this.preprocessState ? "uploading" : this.xhr ? this.xhr.readyState < 4 ? "uploading" : this.flowObj.opts.successStatuses.indexOf(this.xhr.status) > -1 ? "success" : this.flowObj.opts.permanentErrors.indexOf(this.xhr.status) > -1 || !a && this.retries >= this.flowObj.opts.maxChunkRetries ? "error" : (this.abort(), "pending") : "pending"
+    },
+    message: function() {
+      return this.xhr ? this.xhr.responseText : ""
+    },
+    progress: function() {
+      if (this.pendingRetry) return 0;
+      var a = this.status();
+      return "success" === a || "error" === a ? 1 : "pending" === a ? 0 : this.total > 0 ? this.loaded / this.total : 0
+    },
+    sizeUploaded: function() {
+      var a = this.endByte - this.startByte;
+      return "success" !== this.status() && (a = this.progress() * a), a
+    },
+    prepareXhrRequest: function(a, b, c, d) {
+      var e = i(this.flowObj.opts.query, this.fileObj, this, b);
+      e = k(e, this.getParams());
+      var f = i(this.flowObj.opts.target, this.fileObj, this, b),
+        g = null;
+      if ("GET" === a || "octet" === c) {
+        var h = [];
+        l(e, function(a, b) {
+          h.push([encodeURIComponent(b), encodeURIComponent(a)].join("="))
+        }), f = this.getTarget(f, h), g = d || null
+      } else g = new FormData, l(e, function(a, b) {
+        g.append(b, a)
+      }), "undefined" != typeof d && g.append(this.flowObj.opts.fileParameterName, d, this.fileObj.file.name);
+      return this.xhr.open(a, f, !0), this.xhr.withCredentials = this.flowObj.opts.withCredentials, l(i(this.flowObj.opts.headers, this.fileObj, this, b), function(a, b) {
+        this.xhr.setRequestHeader(b, a)
+      }, this), g
+    }
+  }, d.evalOpts = i, d.extend = k, d.each = l, d.FlowFile = e, d.FlowChunk = g, d.version = "2.13.0", "object" == typeof module && module && "object" == typeof module.exports ? module.exports = d : (a.Flow = d, "function" == typeof define && define.amd && define("flow", [], function() {
+    return d
+  }))
+}(window, document), angular.module("flow.provider", []).provider("flowFactory", function() {
+  "use strict";
+  this.defaults = {}, this.factory = function(a) {
+    return new Flow(a)
+  }, this.events = [], this.on = function(a, b) {
+    this.events.push([a, b])
+  }, this.$get = function() {
+    var a = this.factory,
+      b = this.defaults,
+      c = this.events;
+    return {
+      create: function(d) {
+        var e = a(angular.extend({}, b, d));
+        return angular.forEach(c, function(a) {
+          e.on(a[0], a[1])
+        }), e
+      }
+    }
+  }
+}), angular.module("flow.init", ["flow.provider"]).controller("flowCtrl", ["$scope", "$attrs", "$parse", "flowFactory", function(a, b, c, d) {
+  var e = angular.extend({}, a.$eval(b.flowInit)),
+    f = a.$eval(b.flowObject) || d.create(e),
+    g = function(b) {
+      var c = Array.prototype.slice.call(arguments);
+      c.shift();
+      var d = a.$broadcast.apply(a, ["flow::" + b, f].concat(c));
+      return {
+        progress: 1,
+        filesSubmitted: 1,
+        fileSuccess: 1,
+        fileError: 1,
+        complete: 1
+      } [b] && a.$applyAsync(), d.defaultPrevented ? !1 : void 0
+    };
+  f.on("catchAll", g), a.$on("$destroy", function() {
+    f.off("catchAll", g)
+  }), a.$flow = f, b.hasOwnProperty("flowName") && (c(b.flowName).assign(a, f), a.$on("$destroy", function() {
+    c(b.flowName).assign(a)
+  }))
+}]).directive("flowInit", [function() {
+  return {
+    scope: !0,
+    controller: "flowCtrl"
+  }
+}]), angular.module("flow.btn", ["flow.init"]).directive("flowBtn", [function() {
+  return {
+    restrict: "EA",
+    scope: !1,
+    require: "^flowInit",
+    link: function(a, b, c) {
+      var d = c.hasOwnProperty("flowDirectory"),
+        e = c.hasOwnProperty("flowSingleFile"),
+        f = c.hasOwnProperty("flowAttrs") && a.$eval(c.flowAttrs);
+      a.$flow.assignBrowse(b, d, e, f)
+    }
+  }
+}]), angular.module("flow.dragEvents", ["flow.init"]).directive("flowPreventDrop", function() {
+  return {
+    scope: !1,
+    link: function(a, b, c) {
+      b.bind("drop dragover", function(a) {
+        a.preventDefault()
+      })
+    }
+  }
+}).directive("flowDragEnter", ["$timeout", function(a) {
+  return {
+    scope: !1,
+    link: function(b, c, d) {
+      function e(a) {
+        var b = !1,
+          c = a.dataTransfer || a.originalEvent.dataTransfer;
+        return angular.forEach(c && c.types, function(a) {
+          "Files" === a && (b = !0)
+        }), b
+      }
+      var f, g = !1;
+      c.bind("dragover", function(c) {
+        e(c) && (g || (b.$apply(d.flowDragEnter), g = !0), a.cancel(f), c.preventDefault())
+      }), c.bind("dragleave drop", function(c) {
+        a.cancel(f), f = a(function() {
+          b.$eval(d.flowDragLeave), f = null, g = !1
+        }, 100)
+      })
+    }
+  }
+}]), angular.module("flow.drop", ["flow.init"]).directive("flowDrop", function() {
+  return {
+    scope: !1,
+    require: "^flowInit",
+    link: function(a, b, c) {
+      function d() {
+        a.$flow.assignDrop(b)
+      }
+
+      function e() {
+        a.$flow.unAssignDrop(b)
+      }
+      c.flowDropEnabled ? a.$watch(c.flowDropEnabled, function(a) {
+        a ? d() : e()
+      }) : d()
+    }
+  }
+}), ! function(a) {
+  "use strict";
+
+  function b(a) {
+    return a.charAt(0).toUpperCase() + a.slice(1)
+  }
+  var c = a.module("flow.events", ["flow.init"]),
+    d = {
+      fileSuccess: ["$file", "$message"],
+      fileProgress: ["$file"],
+      fileAdded: ["$file", "$event"],
+      filesAdded: ["$files", "$event"],
+      filesSubmitted: ["$files", "$event"],
+      fileRetry: ["$file"],
+      fileRemoved: ["$file"],
+      fileError: ["$file", "$message"],
+      uploadStart: [],
+      complete: [],
+      progress: [],
+      error: ["$message", "$file"]
+    };
+  a.forEach(d, function(d, e) {
+    var f = "flow" + b(e);
+    "flowUploadStart" == f && (f = "flowUploadStarted"), c.directive(f, [function() {
+      return {
+        require: "^flowInit",
+        controller: ["$scope", "$attrs", function(b, c) {
+          b.$on("flow::" + e, function() {
+            var e = Array.prototype.slice.call(arguments),
+              g = e.shift();
+            if (b.$flow === e.shift()) {
+              var h = {};
+              a.forEach(d, function(a, b) {
+                h[a] = e[b]
+              }), b.$eval(c[f], h) === !1 && g.preventDefault()
+            }
+          })
+        }]
+      }
+    }])
+  })
+}(angular), angular.module("flow.img", ["flow.init"]).directive("flowImg", [function() {
+  return {
+    scope: !1,
+    require: "^flowInit",
+    link: function(a, b, c) {
+      var d = c.flowImg;
+      a.$watch(d, function(b) {
+        if (b) {
+          var d = new FileReader;
+          d.readAsDataURL(b.file), d.onload = function(b) {
+            a.$apply(function() {
+              c.$set("src", b.target.result)
+            })
+          }
+        }
+      })
+    }
+  }
+}]), angular.module("flow.transfers", ["flow.init"]).directive("flowTransfers", [function() {
+  return {
+    scope: !0,
+    require: "^flowInit",
+    link: function(a) {
+      a.transfers = a.$flow.files
+    }
+  }
+}]), angular.module("flow", ["flow.provider", "flow.init", "flow.events", "flow.btn", "flow.drop", "flow.transfers", "flow.img", "flow.dragEvents"]);
\ No newline at end of file
diff --git a/public/tvox/js/tvox_integration.min.js b/public/tvox/js/tvox_integration.min.js
new file mode 100644
index 0000000..c5c626f
--- /dev/null
+++ b/public/tvox/js/tvox_integration.min.js
@@ -0,0 +1,95 @@
+var userData = null,
+  callsMap = new Map,
+  infoCb = null,
+  callMessageData = null;
+
+function tvoxReceiveMessage(e) {
+  let a = e.data;
+  null != a && null != a.namespace && "webclient.teleniasoftware.com" == a.namespace ? "callEvent" == a.event ? callMessageData || (callMessageData = a.data, null !== infoCb && infoCb(callMessageData)) : "allCallsStateEvent" == a.event ? (callsMap = new Map, a.data.forEach(function(e) {
+    callsMap.set(e.callId, e)
+  })) : "userStateEvent" == a.event && (console.info("userStateEvent received", a.data), userData = a.data) : console.info("Received Unknown message", a)
+}
+
+function tvoxSendReadyEvent() {
+  tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "iframeReadyEvent",
+    data: null
+  })
+}
+
+function tvoxSendMessage(e) {
+  window.parent.postMessage(e, "*")
+}
+
+function tvoxCloseInteraction(e) {
+  return tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "interactionClose",
+    data: {
+      callId: e
+    }
+  }), !0
+}
+
+function tvoxCloseTab(e) {
+  return tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "callCloseTab",
+    data: {
+      callId: e,
+      tabId: "0"
+    }
+  }), !0
+}
+
+function tvoxNotifyUser() {
+  tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "notifyGenericEventCommand",
+    data: {}
+  })
+}
+
+function tvoxGetCallHandle() {
+  return callMessageData ? callMessageData.callId : ""
+}
+
+function tvoxAnswerCall(e) {
+  return tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "callAnswerCommand",
+    data: {
+      callId: e
+    }
+  }), !0
+}
+
+function tvoxDropCall(e) {
+  return tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "callDropCommand",
+    data: {
+      callId: e
+    }
+  }), !0
+}
+
+function tvoxSetNewCallInfoCallback(e) {
+  infoCb = e, null !== callMessageData && infoCb(callMessageData)
+}
+
+function tvoxFocusInteraction(e) {
+  return tvoxFocusTab(e, null), !0
+}
+
+function tvoxFocusTab(e, a) {
+  return tvoxSendMessage({
+    namespace: "iframe.webclient.teleniasoftware.com",
+    event: "callFocusTab",
+    data: {
+      callId: e,
+      tabId: a
+    }
+  }), !0
+}
\ No newline at end of file
diff --git a/public/tvox/ring.controller.js b/public/tvox/ring.controller.js
new file mode 100644
index 0000000..6fc1a81
--- /dev/null
+++ b/public/tvox/ring.controller.js
@@ -0,0 +1,97 @@
+angular.module('RingApp', ['ngMaterial', 'ngCookies', 'ngSanitize'])
+  .controller("RingController", function($scope, $http, $cookies) {
+
+    $scope.motion_url = "";
+    $scope.logo = "";
+    $scope.error_message = "";
+    $scope.welcome_message = "";
+    $scope.notification_message = "";
+
+    this.$onInit = function() {
+      $scope.token = $cookies.get('motion.token');
+
+      if (_.isNil($scope.token))
+        $scope.error_message = "XCally motion token not valid, please connect to XCally Motion, then retry";
+      else {
+        var urlParams = new URLSearchParams(window.location.search);
+        var params = urlParams.get("params");
+        var arr = params.split("|");
+        if (arr) {
+          $scope.messageId = arr[0];
+          $scope.motionUrl = arr[1];
+          $scope.chatWebsiteId = arr[2];
+          $scope.interactionId = arr[3];
+          $scope.contactId = arr[4];
+          $scope.welcome_message = arr[5];
+          $scope.notification_message = arr[6];
+        }
+
+        window.addEventListener("message", function(e) {
+          if (e.data) {
+            if (e.data.data) {
+              if (e.data.data.state) {
+                if (e.data.data.state == "IDLE") {
+                  var callId = e.data.data.callId;
+                  refuseInteraction(callId);
+                }
+              }
+            }
+          }
+
+          let a = e.data;
+          null != a && null != a.namespace && "webclient.teleniasoftware.com" == a.namespace ? "callEvent" == a.event ? callMessageData || (callMessageData = a.data, null !== infoCb && infoCb(callMessageData)) : "allCallsStateEvent" == a.event ? (callsMap = new Map, a.data.forEach(function(e) {
+            callsMap.set(e.callId, e)
+          })) : "userStateEvent" == a.event && (console.info("userStateEvent received", a.data), userData = a.data) : console.info("Received Unknown message", a)
+
+
+        }, false);
+
+        tvoxSendReadyEvent();
+
+        $http.get($scope.motion_url + "/api/chat/websites/" + $scope.chatWebsiteId, {
+          headers: {
+            'Authorization': 'Bearer ' + $scope.token
+          }
+        }).
+        then(
+          function successCallback(response) {
+            $scope.logo = $scope.motion_url + "/api/chat/websites/" + $scope.chatWebsiteId + "/logo?token=";
+            //$scope.notification_message=response.data.notificationTemplate;
+          },
+          function errorCallback(response) {
+            console.log("Unable to perform get request", response);
+          }
+        );
+      }
+    }
+
+    function refuseInteraction(callId) {
+      var msg = {
+        id: $scope.interactionId,
+        closed: true,
+        closeReason: 'unmanaged',
+        disposition: 'unmanaged',
+        closedAt: new Date() // moment().format('YYYY-MM-DD HH:mm:ss'),
+      };
+
+      $http.put($scope.motion_url + "/api/chat/interactions/" + $scope.interactionId + "/custom_update", msg, {
+        headers: {
+          'Authorization': 'Bearer ' + $scope.token
+        }
+      }).
+      then(
+        function ret(response) {
+          tvoxCloseInteraction(callId);
+        }
+      );
+
+    }
+
+
+    $scope.accept = function(event) {
+      tvoxAnswerCall(tvoxGetCallHandle());
+    }
+    $scope.refuse = function(event) {
+      tvoxDropCall(tvoxGetCallHandle());
+    }
+  });
\ No newline at end of file
diff --git a/public/tvox/ring.html b/public/tvox/ring.html
new file mode 100644
index 0000000..ff3d2dc
--- /dev/null
+++ b/public/tvox/ring.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+
+<head>
+  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
+  <link rel="stylesheet" href="css/angular-material.min.css">
+  <link rel="stylesheet" href="css/style.css">
+</head>
+
+<body ng-app="RingApp">
+  <div ng-controller="RingController" layout="column" layout-align="center center">
+    <div ng-if="error_message!=''">{{error_message}}</div>
+    <div ng-if="error_message==''" layout-align="center center" style="text-align: center;">
+      <md-progress-linear md-mode="indeterminate"></md-progress-linear>
+      <div class="info">{{welcome_message}}</div>
+      <img class="logo" src="{{logo}}">
+      <br>
+      <p ng-bind-html="notification_message"></p>
+      <div layout="row" style="text-align: center" layout-align="center center">
+        <md-button class="md-raised btn-accept" ng-click="accept()">Accept</md-button>
+        &nbsp;
+        <!--
+                <md-button class="md-raised btn-refuse" ng-click="refuse()">Refuse</md-button>
+                -->
+      </div>
+    </div>
+  </div>
+</body>
+
+</html>
+<script src="js/angular.min.js"></script>
+<script src="js/angular-aria.min.js"></script>
+<script src="js/angular-animate.min.js"></script>
+<script src="js/angular-messages.min.js"></script>
+<script src="js/angular-material.min.js"></script>
+<script src="js/angular-cookies.min.js"></script>
+<script src="js/angular-sanitize.min.js"></script>
+<script src="js/tvox_integration.min.js"></script>
+<script src="js/lodash.min.js"></script>
+<script src="js/tvox_integration.min.js"></script>
+<script type="text/javascript" src="ring.controller.js"></script>
\ No newline at end of file
diff --git a/public/tvox/script.js b/public/tvox/script.js
new file mode 100644
index 0000000..dd435c7
--- /dev/null
+++ b/public/tvox/script.js
@@ -0,0 +1,12 @@
+angular.module('webapp', ['ngMaterial'])
+  .controller('AppCtrl', function($scope) {
+    $scope.todos = [];
+    for (var i = 0; i < 45; i++) {
+      $scope.todos.push({
+        face: 'https://avatars0.githubusercontent.com/u/598463?v=3&s=60',
+        what: "Brunch this weekend?",
+        who: "Markus Thiel",
+        notes: "I'll be in your neighborhood doing errands."
+      });
+    }
+  });
\ No newline at end of file
diff --git a/public/tvox/test.html b/public/tvox/test.html
new file mode 100644
index 0000000..289c6d7
--- /dev/null
+++ b/public/tvox/test.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
+  <link rel="stylesheet" href="css/angular-material.min.css">
+</head>
+
+<body ng-app="YourApp">
+  <div ng-controller="YourController">
+    test
+    {{test}}
+    <md-button class="md-raised md-cornered">Button</md-button>
+    <section layout="row" layout-sm="column" layout-align="center center" layout-wrap>
+      <md-button class="md-raised">Button</md-button>
+      <md-button class="md-raised md-primary">Primary</md-button>
+      <md-button ng-disabled="true" class="md-raised md-primary">Disabled</md-button>
+      <md-button class="md-raised md-accent">Accent</md-button>
+      <div class="label">Raised</div>
+    </section>
+    <md-divider></md-divider>
+  </div>
+
+  <script src="js/angular.min.js"></script>
+  <script src="js/angular-aria.min.js"></script>
+  <script src="js/angular-animate.min.js"></script>
+  <script src="js/angular-messages.min.js"></script>
+  <script src="js/angular-material.min.js"></script>
+  <script>
+    // Include app dependency on ngMaterial
+    angular.module('YourApp', ['ngMaterial', 'ngMessages'])
+      .controller("YourController", function($scope) {
+        $scope.test = "Esempio 1";
+      });
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/server/api/action/action.attributes.js b/server/api/action/action.attributes.js
index 7e810d3..bcc3635 100644
--- a/server/api/action/action.attributes.js
+++ b/server/api/action/action.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/action/action.controller.js b/server/api/action/action.controller.js
index 8b046bc..1183cdc 100644
--- a/server/api/action/action.controller.js
+++ b/server/api/action/action.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/action/action.model.js b/server/api/action/action.model.js
index 3a4b05b..58eebe0 100644
--- a/server/api/action/action.model.js
+++ b/server/api/action/action.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/action/action.rpc.js b/server/api/action/action.rpc.js
index bd30e35..c882d10 100644
--- a/server/api/action/action.rpc.js
+++ b/server/api/action/action.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/action/index.js b/server/api/action/index.js
index 8e0f4d7..a792dd0 100644
--- a/server/api/action/index.js
+++ b/server/api/action/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticCustomReport/analyticCustomReport.attributes.js b/server/api/analyticCustomReport/analyticCustomReport.attributes.js
index a8dc1a0..6de3673 100644
--- a/server/api/analyticCustomReport/analyticCustomReport.attributes.js
+++ b/server/api/analyticCustomReport/analyticCustomReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticCustomReport/analyticCustomReport.controller.js b/server/api/analyticCustomReport/analyticCustomReport.controller.js
index 5ba058c..76cda05 100644
--- a/server/api/analyticCustomReport/analyticCustomReport.controller.js
+++ b/server/api/analyticCustomReport/analyticCustomReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticCustomReport/analyticCustomReport.model.js b/server/api/analyticCustomReport/analyticCustomReport.model.js
index 7451f96..c9ac586 100644
--- a/server/api/analyticCustomReport/analyticCustomReport.model.js
+++ b/server/api/analyticCustomReport/analyticCustomReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticCustomReport/analyticCustomReport.rpc.js b/server/api/analyticCustomReport/analyticCustomReport.rpc.js
index 0b5157c..a32e901 100644
--- a/server/api/analyticCustomReport/analyticCustomReport.rpc.js
+++ b/server/api/analyticCustomReport/analyticCustomReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticCustomReport/index.js b/server/api/analyticCustomReport/index.js
index 024e153..b2f3a58 100644
--- a/server/api/analyticCustomReport/index.js
+++ b/server/api/analyticCustomReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticDefaultReport/analyticDefaultReport.attributes.js b/server/api/analyticDefaultReport/analyticDefaultReport.attributes.js
index b87e060..0aa3b3c 100644
--- a/server/api/analyticDefaultReport/analyticDefaultReport.attributes.js
+++ b/server/api/analyticDefaultReport/analyticDefaultReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticDefaultReport/analyticDefaultReport.controller.js b/server/api/analyticDefaultReport/analyticDefaultReport.controller.js
index 381689f..2858fad 100644
--- a/server/api/analyticDefaultReport/analyticDefaultReport.controller.js
+++ b/server/api/analyticDefaultReport/analyticDefaultReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticDefaultReport/analyticDefaultReport.model.js b/server/api/analyticDefaultReport/analyticDefaultReport.model.js
index b9d7a21..ed2f5bf 100644
--- a/server/api/analyticDefaultReport/analyticDefaultReport.model.js
+++ b/server/api/analyticDefaultReport/analyticDefaultReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticDefaultReport/analyticDefaultReport.rpc.js b/server/api/analyticDefaultReport/analyticDefaultReport.rpc.js
index c4ec8c8..c7d2d26 100644
--- a/server/api/analyticDefaultReport/analyticDefaultReport.rpc.js
+++ b/server/api/analyticDefaultReport/analyticDefaultReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticDefaultReport/index.js b/server/api/analyticDefaultReport/index.js
index 5f7af4f..cd0a751 100644
--- a/server/api/analyticDefaultReport/index.js
+++ b/server/api/analyticDefaultReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticExtractedReport/analyticExtractedReport.attributes.js b/server/api/analyticExtractedReport/analyticExtractedReport.attributes.js
index 7e986fe..bae82b1 100644
--- a/server/api/analyticExtractedReport/analyticExtractedReport.attributes.js
+++ b/server/api/analyticExtractedReport/analyticExtractedReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticExtractedReport/analyticExtractedReport.controller.js b/server/api/analyticExtractedReport/analyticExtractedReport.controller.js
index b41ac7d..bd1e436 100644
--- a/server/api/analyticExtractedReport/analyticExtractedReport.controller.js
+++ b/server/api/analyticExtractedReport/analyticExtractedReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticExtractedReport/analyticExtractedReport.model.js b/server/api/analyticExtractedReport/analyticExtractedReport.model.js
index a13e1ca..350fa34 100644
--- a/server/api/analyticExtractedReport/analyticExtractedReport.model.js
+++ b/server/api/analyticExtractedReport/analyticExtractedReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticExtractedReport/analyticExtractedReport.rpc.js b/server/api/analyticExtractedReport/analyticExtractedReport.rpc.js
index 3970bd5..845b310 100644
--- a/server/api/analyticExtractedReport/analyticExtractedReport.rpc.js
+++ b/server/api/analyticExtractedReport/analyticExtractedReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticExtractedReport/index.js b/server/api/analyticExtractedReport/index.js
index 54d1a6f..a7eba24 100644
--- a/server/api/analyticExtractedReport/index.js
+++ b/server/api/analyticExtractedReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticFieldReport/analyticFieldReport.attributes.js b/server/api/analyticFieldReport/analyticFieldReport.attributes.js
index 2e12ede..f652734 100644
--- a/server/api/analyticFieldReport/analyticFieldReport.attributes.js
+++ b/server/api/analyticFieldReport/analyticFieldReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticFieldReport/analyticFieldReport.controller.js b/server/api/analyticFieldReport/analyticFieldReport.controller.js
index 9a85b21..2e35214 100644
--- a/server/api/analyticFieldReport/analyticFieldReport.controller.js
+++ b/server/api/analyticFieldReport/analyticFieldReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticFieldReport/analyticFieldReport.model.js b/server/api/analyticFieldReport/analyticFieldReport.model.js
index 0f2978f..a16703c 100644
--- a/server/api/analyticFieldReport/analyticFieldReport.model.js
+++ b/server/api/analyticFieldReport/analyticFieldReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticFieldReport/analyticFieldReport.rpc.js b/server/api/analyticFieldReport/analyticFieldReport.rpc.js
index 78c295f..e41ef4a 100644
--- a/server/api/analyticFieldReport/analyticFieldReport.rpc.js
+++ b/server/api/analyticFieldReport/analyticFieldReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticFieldReport/index.js b/server/api/analyticFieldReport/index.js
index 06c17e4..47ae35b 100644
--- a/server/api/analyticFieldReport/index.js
+++ b/server/api/analyticFieldReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticMetric/analyticMetric.attributes.js b/server/api/analyticMetric/analyticMetric.attributes.js
index d066b8a..5ce7b3e 100644
--- a/server/api/analyticMetric/analyticMetric.attributes.js
+++ b/server/api/analyticMetric/analyticMetric.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticMetric/analyticMetric.controller.js b/server/api/analyticMetric/analyticMetric.controller.js
index 3badfd5..2dcea3e 100644
--- a/server/api/analyticMetric/analyticMetric.controller.js
+++ b/server/api/analyticMetric/analyticMetric.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticMetric/analyticMetric.model.js b/server/api/analyticMetric/analyticMetric.model.js
index af1785e..e24bce5 100644
--- a/server/api/analyticMetric/analyticMetric.model.js
+++ b/server/api/analyticMetric/analyticMetric.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticMetric/analyticMetric.rpc.js b/server/api/analyticMetric/analyticMetric.rpc.js
index f1e0336..9e1f24e 100644
--- a/server/api/analyticMetric/analyticMetric.rpc.js
+++ b/server/api/analyticMetric/analyticMetric.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticMetric/index.js b/server/api/analyticMetric/index.js
index cabf1f5..b3b9223 100644
--- a/server/api/analyticMetric/index.js
+++ b/server/api/analyticMetric/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticTreeReport/analyticTreeReport.attributes.js b/server/api/analyticTreeReport/analyticTreeReport.attributes.js
index ee41d83..1bc9fb5 100644
--- a/server/api/analyticTreeReport/analyticTreeReport.attributes.js
+++ b/server/api/analyticTreeReport/analyticTreeReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x848b=['exports','TEXT','sequelize'];(function(_0x26643f,_0xdfe5a9){var _0x2c17da=function(_0x21c41f){while(--_0x21c41f){_0x26643f['push'](_0x26643f['shift']());}};_0x2c17da(++_0xdfe5a9);}(_0x848b,0x12b));var _0xb848=function(_0x18dcd6,_0xf021e3){_0x18dcd6=_0x18dcd6-0x0;var _0x3468a6=_0x848b[_0x18dcd6];return _0x3468a6;};'use strict';var Sequelize=require(_0xb848('0x0'));module[_0xb848('0x1')]={'tree':{'type':Sequelize[_0xb848('0x2')],'allowNull':![]}};
\ No newline at end of file
+var _0xa7a4=['sequelize','exports','TEXT'];(function(_0x4886d1,_0x507019){var _0x45dc12=function(_0x472c6e){while(--_0x472c6e){_0x4886d1['push'](_0x4886d1['shift']());}};_0x45dc12(++_0x507019);}(_0xa7a4,0xf6));var _0x4a7a=function(_0xe2c95e,_0x3e6545){_0xe2c95e=_0xe2c95e-0x0;var _0x42ce6f=_0xa7a4[_0xe2c95e];return _0x42ce6f;};'use strict';var Sequelize=require(_0x4a7a('0x0'));module[_0x4a7a('0x1')]={'tree':{'type':Sequelize[_0x4a7a('0x2')],'allowNull':![]}};
\ No newline at end of file
diff --git a/server/api/analyticTreeReport/analyticTreeReport.controller.js b/server/api/analyticTreeReport/analyticTreeReport.controller.js
index 643e3ed..7a7de13 100644
--- a/server/api/analyticTreeReport/analyticTreeReport.controller.js
+++ b/server/api/analyticTreeReport/analyticTreeReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticTreeReport/analyticTreeReport.model.js b/server/api/analyticTreeReport/analyticTreeReport.model.js
index cb83468..655b040 100644
--- a/server/api/analyticTreeReport/analyticTreeReport.model.js
+++ b/server/api/analyticTreeReport/analyticTreeReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticTreeReport/analyticTreeReport.rpc.js b/server/api/analyticTreeReport/analyticTreeReport.rpc.js
index c32acb0..7721cfb 100644
--- a/server/api/analyticTreeReport/analyticTreeReport.rpc.js
+++ b/server/api/analyticTreeReport/analyticTreeReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/analyticTreeReport/index.js b/server/api/analyticTreeReport/index.js
index 047d3e2..eaac9e5 100644
--- a/server/api/analyticTreeReport/index.js
+++ b/server/api/analyticTreeReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/attachment/attachment.attributes.js b/server/api/attachment/attachment.attributes.js
index 7291865..7f0c752 100644
--- a/server/api/attachment/attachment.attributes.js
+++ b/server/api/attachment/attachment.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/attachment/attachment.controller.js b/server/api/attachment/attachment.controller.js
index 9cc9c75..31347c1 100644
--- a/server/api/attachment/attachment.controller.js
+++ b/server/api/attachment/attachment.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/attachment/attachment.model.js b/server/api/attachment/attachment.model.js
index 3bf0272..7c0d700 100644
--- a/server/api/attachment/attachment.model.js
+++ b/server/api/attachment/attachment.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/attachment/attachment.rpc.js b/server/api/attachment/attachment.rpc.js
index d89ccb5..c950e7b 100644
--- a/server/api/attachment/attachment.rpc.js
+++ b/server/api/attachment/attachment.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/attachment/index.js b/server/api/attachment/index.js
index 607de9c..1e99095 100644
--- a/server/api/attachment/index.js
+++ b/server/api/attachment/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/authActiveDirectory/authActiveDirectory.controller.js b/server/api/authActiveDirectory/authActiveDirectory.controller.js
new file mode 100644
index 0000000..d9dbc0b
--- /dev/null
+++ b/server/api/authActiveDirectory/authActiveDirectory.controller.js
@@ -0,0 +1,18 @@
+// *************************************************************************
+// *                                                                       *
+// * xCALLY Motion -  The Omnichannel Contact Center                       *
+// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * Email: [email-masked]                                                *
+// * Website: https://www.xcally.com                                       *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * The SOFTWARE PRODUCT is protected by copyright laws and international *
+// * copyright treaties, as well as other intellectual property laws and   *
+// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
+// *                                                                       *
+// *************************************************************************
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.attributes.js b/server/api/authActiveDirectory/index.js
similarity index 67%
copy from server/api/contactItemType/contactItemType.attributes.js
copy to server/api/authActiveDirectory/index.js
index 60a13fe..c4cd562 100644
--- a/server/api/contactItemType/contactItemType.attributes.js
+++ b/server/api/authActiveDirectory/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/authGoogle/authGoogle.controller.js b/server/api/authGoogle/authGoogle.controller.js
index e291dc7..2713815 100644
--- a/server/api/authGoogle/authGoogle.controller.js
+++ b/server/api/authGoogle/authGoogle.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/authGoogle/index.js b/server/api/authGoogle/index.js
index 1d23ef8..79ee7b6 100644
--- a/server/api/authGoogle/index.js
+++ b/server/api/authGoogle/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/authLocal/authLocal.controller.js b/server/api/authLocal/authLocal.controller.js
index b1cdf60..960239d 100644
--- a/server/api/authLocal/authLocal.controller.js
+++ b/server/api/authLocal/authLocal.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/authLocal/index.js b/server/api/authLocal/index.js
index 72520c0..9d880d4 100644
--- a/server/api/authLocal/index.js
+++ b/server/api/authLocal/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/automation/automation.attributes.js b/server/api/automation/automation.attributes.js
index c6d6822..edd7294 100644
--- a/server/api/automation/automation.attributes.js
+++ b/server/api/automation/automation.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/automation/automation.controller.js b/server/api/automation/automation.controller.js
index c4c424c..109be30 100644
--- a/server/api/automation/automation.controller.js
+++ b/server/api/automation/automation.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/automation/automation.model.js b/server/api/automation/automation.model.js
index 00e0811..3e73f73 100644
--- a/server/api/automation/automation.model.js
+++ b/server/api/automation/automation.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/automation/automation.rpc.js b/server/api/automation/automation.rpc.js
index 6c33195..29e6fd9 100644
--- a/server/api/automation/automation.rpc.js
+++ b/server/api/automation/automation.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/automation/index.js b/server/api/automation/index.js
index e648e4c..2c7829b 100644
--- a/server/api/automation/index.js
+++ b/server/api/automation/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/campaign/campaign.attributes.js b/server/api/campaign/campaign.attributes.js
index 1e1972a..93da46f 100644
--- a/server/api/campaign/campaign.attributes.js
+++ b/server/api/campaign/campaign.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/campaign/campaign.controller.js b/server/api/campaign/campaign.controller.js
index fb6ea77..238c4a0 100644
--- a/server/api/campaign/campaign.controller.js
+++ b/server/api/campaign/campaign.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/campaign/campaign.model.js b/server/api/campaign/campaign.model.js
index 5d225d9..63897b5 100644
--- a/server/api/campaign/campaign.model.js
+++ b/server/api/campaign/campaign.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/campaign/campaign.rpc.js b/server/api/campaign/campaign.rpc.js
index c97cbd8..bd28459 100644
--- a/server/api/campaign/campaign.rpc.js
+++ b/server/api/campaign/campaign.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/campaign/index.js b/server/api/campaign/index.js
index 1d267c1..2936deb 100644
--- a/server/api/campaign/index.js
+++ b/server/api/campaign/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cannedAnswer/cannedAnswer.attributes.js b/server/api/cannedAnswer/cannedAnswer.attributes.js
index 16bea58..381d362 100644
--- a/server/api/cannedAnswer/cannedAnswer.attributes.js
+++ b/server/api/cannedAnswer/cannedAnswer.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cannedAnswer/cannedAnswer.controller.js b/server/api/cannedAnswer/cannedAnswer.controller.js
index 8a7b2a7..d4d6cbf 100644
--- a/server/api/cannedAnswer/cannedAnswer.controller.js
+++ b/server/api/cannedAnswer/cannedAnswer.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cannedAnswer/cannedAnswer.model.js b/server/api/cannedAnswer/cannedAnswer.model.js
index 8f3ca2e..1b3613c 100644
--- a/server/api/cannedAnswer/cannedAnswer.model.js
+++ b/server/api/cannedAnswer/cannedAnswer.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cannedAnswer/cannedAnswer.rpc.js b/server/api/cannedAnswer/cannedAnswer.rpc.js
index 87c21f0..eb2e2de 100644
--- a/server/api/cannedAnswer/cannedAnswer.rpc.js
+++ b/server/api/cannedAnswer/cannedAnswer.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cannedAnswer/index.js b/server/api/cannedAnswer/index.js
index 92e4b4d..bc7c8bd 100644
--- a/server/api/cannedAnswer/index.js
+++ b/server/api/cannedAnswer/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cdr/cdr.attributes.js b/server/api/cdr/cdr.attributes.js
index 7a77a19..7151204 100644
--- a/server/api/cdr/cdr.attributes.js
+++ b/server/api/cdr/cdr.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cdr/cdr.controller.js b/server/api/cdr/cdr.controller.js
index d7c1264..3bef327 100644
--- a/server/api/cdr/cdr.controller.js
+++ b/server/api/cdr/cdr.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cdr/cdr.model.js b/server/api/cdr/cdr.model.js
index f51ae65..6b3ebf0 100644
--- a/server/api/cdr/cdr.model.js
+++ b/server/api/cdr/cdr.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cdr/cdr.rpc.js b/server/api/cdr/cdr.rpc.js
index 163b327..7e77add 100644
--- a/server/api/cdr/cdr.rpc.js
+++ b/server/api/cdr/cdr.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cdr/index.js b/server/api/cdr/index.js
index e417aec..0749540 100644
--- a/server/api/cdr/index.js
+++ b/server/api/cdr/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatApplication/chatApplication.attributes.js b/server/api/chatApplication/chatApplication.attributes.js
index e7e1c32..215e08f 100644
--- a/server/api/chatApplication/chatApplication.attributes.js
+++ b/server/api/chatApplication/chatApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatApplication/chatApplication.controller.js b/server/api/chatApplication/chatApplication.controller.js
index 7a41506..ff2b31d 100644
--- a/server/api/chatApplication/chatApplication.controller.js
+++ b/server/api/chatApplication/chatApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatApplication/chatApplication.model.js b/server/api/chatApplication/chatApplication.model.js
index 084595c..adb11ce 100644
--- a/server/api/chatApplication/chatApplication.model.js
+++ b/server/api/chatApplication/chatApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatApplication/chatApplication.rpc.js b/server/api/chatApplication/chatApplication.rpc.js
index d646d3b..f0a51e3 100644
--- a/server/api/chatApplication/chatApplication.rpc.js
+++ b/server/api/chatApplication/chatApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatApplication/index.js b/server/api/chatApplication/index.js
index aca2712..7c8296c 100644
--- a/server/api/chatApplication/index.js
+++ b/server/api/chatApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.attributes.js b/server/api/chatGroup/chatGroup.attributes.js
index f22af40..ba6729a 100644
--- a/server/api/chatGroup/chatGroup.attributes.js
+++ b/server/api/chatGroup/chatGroup.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.controller.js b/server/api/chatGroup/chatGroup.controller.js
index f094e97..a0ace8d 100644
--- a/server/api/chatGroup/chatGroup.controller.js
+++ b/server/api/chatGroup/chatGroup.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.events.js b/server/api/chatGroup/chatGroup.events.js
index 92c1afc..bae8b7e 100644
--- a/server/api/chatGroup/chatGroup.events.js
+++ b/server/api/chatGroup/chatGroup.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.model.js b/server/api/chatGroup/chatGroup.model.js
index dad4a68..36965df 100644
--- a/server/api/chatGroup/chatGroup.model.js
+++ b/server/api/chatGroup/chatGroup.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.rpc.js b/server/api/chatGroup/chatGroup.rpc.js
index bf7f859..d8a40c3 100644
--- a/server/api/chatGroup/chatGroup.rpc.js
+++ b/server/api/chatGroup/chatGroup.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/chatGroup.socket.js b/server/api/chatGroup/chatGroup.socket.js
index f84d037..6c2f3b6 100644
--- a/server/api/chatGroup/chatGroup.socket.js
+++ b/server/api/chatGroup/chatGroup.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatGroup/index.js b/server/api/chatGroup/index.js
index 59274c1..a4483eb 100644
--- a/server/api/chatGroup/index.js
+++ b/server/api/chatGroup/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.attributes.js b/server/api/chatInteraction/chatInteraction.attributes.js
index 8f8514b..76464c0 100644
--- a/server/api/chatInteraction/chatInteraction.attributes.js
+++ b/server/api/chatInteraction/chatInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.controller.js b/server/api/chatInteraction/chatInteraction.controller.js
index 33b156e..1e8a97e 100644
--- a/server/api/chatInteraction/chatInteraction.controller.js
+++ b/server/api/chatInteraction/chatInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.events.js b/server/api/chatInteraction/chatInteraction.events.js
index 9008159..6d61872 100644
--- a/server/api/chatInteraction/chatInteraction.events.js
+++ b/server/api/chatInteraction/chatInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.model.js b/server/api/chatInteraction/chatInteraction.model.js
index a806a63..35c2fc0 100644
--- a/server/api/chatInteraction/chatInteraction.model.js
+++ b/server/api/chatInteraction/chatInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.rpc.js b/server/api/chatInteraction/chatInteraction.rpc.js
index 62b868c..b418e5c 100644
--- a/server/api/chatInteraction/chatInteraction.rpc.js
+++ b/server/api/chatInteraction/chatInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/chatInteraction.socket.js b/server/api/chatInteraction/chatInteraction.socket.js
index 652bc2b..0d93b46 100644
--- a/server/api/chatInteraction/chatInteraction.socket.js
+++ b/server/api/chatInteraction/chatInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInteraction/index.js b/server/api/chatInteraction/index.js
index 41b9371..0a7b29c 100644
--- a/server/api/chatInteraction/index.js
+++ b/server/api/chatInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.attributes.js b/server/api/chatInternalMessage/chatInternalMessage.attributes.js
index fd752e8..816888f 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.attributes.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.controller.js b/server/api/chatInternalMessage/chatInternalMessage.controller.js
index 13326cd..08cafcb 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.controller.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.events.js b/server/api/chatInternalMessage/chatInternalMessage.events.js
index 0544213..edac90b 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.events.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.model.js b/server/api/chatInternalMessage/chatInternalMessage.model.js
index da59fa1..4a2dfea 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.model.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.rpc.js b/server/api/chatInternalMessage/chatInternalMessage.rpc.js
index 037aca7..42131a8 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.rpc.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/chatInternalMessage.socket.js b/server/api/chatInternalMessage/chatInternalMessage.socket.js
index 5bdce3e..6c798b2 100644
--- a/server/api/chatInternalMessage/chatInternalMessage.socket.js
+++ b/server/api/chatInternalMessage/chatInternalMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatInternalMessage/index.js b/server/api/chatInternalMessage/index.js
index 9fdfbfa..78a078f 100644
--- a/server/api/chatInternalMessage/index.js
+++ b/server/api/chatInternalMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.attributes.js b/server/api/chatMessage/chatMessage.attributes.js
index 758a748..7e61d22 100644
--- a/server/api/chatMessage/chatMessage.attributes.js
+++ b/server/api/chatMessage/chatMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.controller.js b/server/api/chatMessage/chatMessage.controller.js
index 148f917..1aea0a3 100644
--- a/server/api/chatMessage/chatMessage.controller.js
+++ b/server/api/chatMessage/chatMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.events.js b/server/api/chatMessage/chatMessage.events.js
index 627295b..cf3ea3c 100644
--- a/server/api/chatMessage/chatMessage.events.js
+++ b/server/api/chatMessage/chatMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.model.js b/server/api/chatMessage/chatMessage.model.js
index c0932d8..6dcf52f 100644
--- a/server/api/chatMessage/chatMessage.model.js
+++ b/server/api/chatMessage/chatMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.rpc.js b/server/api/chatMessage/chatMessage.rpc.js
index 6787114..62924d3 100644
--- a/server/api/chatMessage/chatMessage.rpc.js
+++ b/server/api/chatMessage/chatMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/chatMessage.socket.js b/server/api/chatMessage/chatMessage.socket.js
index e90d021..596861c 100644
--- a/server/api/chatMessage/chatMessage.socket.js
+++ b/server/api/chatMessage/chatMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatMessage/index.js b/server/api/chatMessage/index.js
index 4482853..1ea2253 100644
--- a/server/api/chatMessage/index.js
+++ b/server/api/chatMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatOfflineMessage/chatOfflineMessage.attributes.js b/server/api/chatOfflineMessage/chatOfflineMessage.attributes.js
index b6dbdc3..8668c2f 100644
--- a/server/api/chatOfflineMessage/chatOfflineMessage.attributes.js
+++ b/server/api/chatOfflineMessage/chatOfflineMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xfea4=['exports','medium'];(function(_0x421316,_0x5e0ea2){var _0x452076=function(_0x49cd81){while(--_0x49cd81){_0x421316['push'](_0x421316['shift']());}};_0x452076(++_0x5e0ea2);}(_0xfea4,0x1a8));var _0x4fea=function(_0x51beba,_0x202d19){_0x51beba=_0x51beba-0x0;var _0x167ee0=_0xfea4[_0x51beba];return _0x167ee0;};'use strict';var Sequelize=require('sequelize');module[_0x4fea('0x0')]={'body':{'type':Sequelize['TEXT'](_0x4fea('0x1')),'allowNull':![]}};
\ No newline at end of file
+var _0xb494=['medium','sequelize','exports','TEXT'];(function(_0x2d1f97,_0x37d7ec){var _0x2c1ed0=function(_0x519342){while(--_0x519342){_0x2d1f97['push'](_0x2d1f97['shift']());}};_0x2c1ed0(++_0x37d7ec);}(_0xb494,0x69));var _0x4b49=function(_0xef8146,_0x459c34){_0xef8146=_0xef8146-0x0;var _0x5a6cb0=_0xb494[_0xef8146];return _0x5a6cb0;};'use strict';var Sequelize=require(_0x4b49('0x0'));module[_0x4b49('0x1')]={'body':{'type':Sequelize[_0x4b49('0x2')](_0x4b49('0x3')),'allowNull':![]}};
\ No newline at end of file
diff --git a/server/api/chatOfflineMessage/chatOfflineMessage.controller.js b/server/api/chatOfflineMessage/chatOfflineMessage.controller.js
index 6175cb5..38ecfaa 100644
--- a/server/api/chatOfflineMessage/chatOfflineMessage.controller.js
+++ b/server/api/chatOfflineMessage/chatOfflineMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.model.js b/server/api/chatOfflineMessage/chatOfflineMessage.events.js
similarity index 54%
rename from server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.model.js
rename to server/api/chatOfflineMessage/chatOfflineMessage.events.js
index b1470ca..b735cba 100644
--- a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.model.js
+++ b/server/api/chatOfflineMessage/chatOfflineMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatOfflineMessage/chatOfflineMessage.model.js b/server/api/chatOfflineMessage/chatOfflineMessage.model.js
index b7993f6..fcbffe2 100644
--- a/server/api/chatOfflineMessage/chatOfflineMessage.model.js
+++ b/server/api/chatOfflineMessage/chatOfflineMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatOfflineMessage/chatOfflineMessage.rpc.js b/server/api/chatOfflineMessage/chatOfflineMessage.rpc.js
index c269eb4..3b39f25 100644
--- a/server/api/chatOfflineMessage/chatOfflineMessage.rpc.js
+++ b/server/api/chatOfflineMessage/chatOfflineMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatOfflineMessage/index.js b/server/api/chatOfflineMessage/index.js
index 0a69f77..fc472bc 100644
--- a/server/api/chatOfflineMessage/index.js
+++ b/server/api/chatOfflineMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatProactiveAction/chatProactiveAction.attributes.js b/server/api/chatProactiveAction/chatProactiveAction.attributes.js
index be9bf28..1868c02 100644
--- a/server/api/chatProactiveAction/chatProactiveAction.attributes.js
+++ b/server/api/chatProactiveAction/chatProactiveAction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatProactiveAction/chatProactiveAction.controller.js b/server/api/chatProactiveAction/chatProactiveAction.controller.js
index 577262e..3c978bf 100644
--- a/server/api/chatProactiveAction/chatProactiveAction.controller.js
+++ b/server/api/chatProactiveAction/chatProactiveAction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatProactiveAction/chatProactiveAction.model.js b/server/api/chatProactiveAction/chatProactiveAction.model.js
index 50fcaf8..e16c37f 100644
--- a/server/api/chatProactiveAction/chatProactiveAction.model.js
+++ b/server/api/chatProactiveAction/chatProactiveAction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatProactiveAction/chatProactiveAction.rpc.js b/server/api/chatProactiveAction/chatProactiveAction.rpc.js
index 39116c5..306c551 100644
--- a/server/api/chatProactiveAction/chatProactiveAction.rpc.js
+++ b/server/api/chatProactiveAction/chatProactiveAction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatProactiveAction/index.js b/server/api/chatProactiveAction/index.js
index 4784417..3c48023 100644
--- a/server/api/chatProactiveAction/index.js
+++ b/server/api/chatProactiveAction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.attributes.js b/server/api/chatQueue/chatQueue.attributes.js
index b6d967c..cf70f84 100644
--- a/server/api/chatQueue/chatQueue.attributes.js
+++ b/server/api/chatQueue/chatQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.controller.js b/server/api/chatQueue/chatQueue.controller.js
index 549765c..0076bff 100644
--- a/server/api/chatQueue/chatQueue.controller.js
+++ b/server/api/chatQueue/chatQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.events.js b/server/api/chatQueue/chatQueue.events.js
index 07cd6ac..a3ec44e 100644
--- a/server/api/chatQueue/chatQueue.events.js
+++ b/server/api/chatQueue/chatQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.model.js b/server/api/chatQueue/chatQueue.model.js
index 40a219e..d2f8ed9 100644
--- a/server/api/chatQueue/chatQueue.model.js
+++ b/server/api/chatQueue/chatQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.rpc.js b/server/api/chatQueue/chatQueue.rpc.js
index d9d3d72..24b2250 100644
--- a/server/api/chatQueue/chatQueue.rpc.js
+++ b/server/api/chatQueue/chatQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/chatQueue.socket.js b/server/api/chatQueue/chatQueue.socket.js
index ded4810..9024691 100644
--- a/server/api/chatQueue/chatQueue.socket.js
+++ b/server/api/chatQueue/chatQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueue/index.js b/server/api/chatQueue/index.js
index 81a90bc..92ac662 100644
--- a/server/api/chatQueue/index.js
+++ b/server/api/chatQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueueReport/chatQueueReport.attributes.js b/server/api/chatQueueReport/chatQueueReport.attributes.js
index 8b03cd2..1878990 100644
--- a/server/api/chatQueueReport/chatQueueReport.attributes.js
+++ b/server/api/chatQueueReport/chatQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueueReport/chatQueueReport.controller.js b/server/api/chatQueueReport/chatQueueReport.controller.js
index 03a1199..90a8785 100644
--- a/server/api/chatQueueReport/chatQueueReport.controller.js
+++ b/server/api/chatQueueReport/chatQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueueReport/chatQueueReport.model.js b/server/api/chatQueueReport/chatQueueReport.model.js
index ce940b0..9d9e14d 100644
--- a/server/api/chatQueueReport/chatQueueReport.model.js
+++ b/server/api/chatQueueReport/chatQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueueReport/chatQueueReport.rpc.js b/server/api/chatQueueReport/chatQueueReport.rpc.js
index a11d42f..38476b0 100644
--- a/server/api/chatQueueReport/chatQueueReport.rpc.js
+++ b/server/api/chatQueueReport/chatQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatQueueReport/index.js b/server/api/chatQueueReport/index.js
index e3fd990..aec0eec 100644
--- a/server/api/chatQueueReport/index.js
+++ b/server/api/chatQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatTransferReport/chatTransferReport.attributes.js b/server/api/chatTransferReport/chatTransferReport.attributes.js
index 7cd16df..547d58f 100644
--- a/server/api/chatTransferReport/chatTransferReport.attributes.js
+++ b/server/api/chatTransferReport/chatTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatTransferReport/chatTransferReport.controller.js b/server/api/chatTransferReport/chatTransferReport.controller.js
index 31e1956..09c0b39 100644
--- a/server/api/chatTransferReport/chatTransferReport.controller.js
+++ b/server/api/chatTransferReport/chatTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatTransferReport/chatTransferReport.model.js b/server/api/chatTransferReport/chatTransferReport.model.js
index ce45f4f..bc22c62 100644
--- a/server/api/chatTransferReport/chatTransferReport.model.js
+++ b/server/api/chatTransferReport/chatTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatTransferReport/chatTransferReport.rpc.js b/server/api/chatTransferReport/chatTransferReport.rpc.js
index 49ba029..901f795 100644
--- a/server/api/chatTransferReport/chatTransferReport.rpc.js
+++ b/server/api/chatTransferReport/chatTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatTransferReport/index.js b/server/api/chatTransferReport/index.js
index 5110cea..5a73f37 100644
--- a/server/api/chatTransferReport/index.js
+++ b/server/api/chatTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.attributes.js b/server/api/chatWebsite/chatWebsite.attributes.js
index 8305aa8..ff868a9 100644
--- a/server/api/chatWebsite/chatWebsite.attributes.js
+++ b/server/api/chatWebsite/chatWebsite.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.controller.js b/server/api/chatWebsite/chatWebsite.controller.js
index 38f5797..3d9135e 100644
--- a/server/api/chatWebsite/chatWebsite.controller.js
+++ b/server/api/chatWebsite/chatWebsite.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.events.js b/server/api/chatWebsite/chatWebsite.events.js
index 4f067ed..bd43e21 100644
--- a/server/api/chatWebsite/chatWebsite.events.js
+++ b/server/api/chatWebsite/chatWebsite.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.model.js b/server/api/chatWebsite/chatWebsite.model.js
index 4da435d..56dd8ee 100644
--- a/server/api/chatWebsite/chatWebsite.model.js
+++ b/server/api/chatWebsite/chatWebsite.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.rpc.js b/server/api/chatWebsite/chatWebsite.rpc.js
index 9661935..17ca551 100644
--- a/server/api/chatWebsite/chatWebsite.rpc.js
+++ b/server/api/chatWebsite/chatWebsite.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/chatWebsite.socket.js b/server/api/chatWebsite/chatWebsite.socket.js
index 0cbda1a..06f0551 100644
--- a/server/api/chatWebsite/chatWebsite.socket.js
+++ b/server/api/chatWebsite/chatWebsite.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/chatWebsite/index.js b/server/api/chatWebsite/index.js
index 9577dd5..275a8f7 100644
--- a/server/api/chatWebsite/index.js
+++ b/server/api/chatWebsite/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cloudProvider/cloudProvider.attributes.js b/server/api/cloudProvider/cloudProvider.attributes.js
index 7d5f4c5..6adba28 100644
--- a/server/api/cloudProvider/cloudProvider.attributes.js
+++ b/server/api/cloudProvider/cloudProvider.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cloudProvider/cloudProvider.controller.js b/server/api/cloudProvider/cloudProvider.controller.js
index e0821f6..2b8f9ce 100644
--- a/server/api/cloudProvider/cloudProvider.controller.js
+++ b/server/api/cloudProvider/cloudProvider.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cloudProvider/cloudProvider.model.js b/server/api/cloudProvider/cloudProvider.model.js
index 69d1c6b..c63c5d7 100644
--- a/server/api/cloudProvider/cloudProvider.model.js
+++ b/server/api/cloudProvider/cloudProvider.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cloudProvider/cloudProvider.oauth.js b/server/api/cloudProvider/cloudProvider.oauth.js
new file mode 100644
index 0000000..7cb6c17
--- /dev/null
+++ b/server/api/cloudProvider/cloudProvider.oauth.js
@@ -0,0 +1,18 @@
+// *************************************************************************
+// *                                                                       *
+// * xCALLY Motion -  The Omnichannel Contact Center                       *
+// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * Email: [email-masked]                                                *
+// * Website: https://www.xcally.com                                       *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * The SOFTWARE PRODUCT is protected by copyright laws and international *
+// * copyright treaties, as well as other intellectual property laws and   *
+// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
+// *                                                                       *
+// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cloudProvider/cloudProvider.rpc.js b/server/api/cloudProvider/cloudProvider.rpc.js
index 31ee48b..99d0297 100644
--- a/server/api/cloudProvider/cloudProvider.rpc.js
+++ b/server/api/cloudProvider/cloudProvider.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cloudProvider/index.js b/server/api/cloudProvider/index.js
index dc0d5e8..1c84b4d 100644
--- a/server/api/cloudProvider/index.js
+++ b/server/api/cloudProvider/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCompany/cmCompany.attributes.js b/server/api/cmCompany/cmCompany.attributes.js
index 0236ca4..94fd50c 100644
--- a/server/api/cmCompany/cmCompany.attributes.js
+++ b/server/api/cmCompany/cmCompany.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCompany/cmCompany.controller.js b/server/api/cmCompany/cmCompany.controller.js
index b8ac7e0..e2dfe41 100644
--- a/server/api/cmCompany/cmCompany.controller.js
+++ b/server/api/cmCompany/cmCompany.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCompany/cmCompany.model.js b/server/api/cmCompany/cmCompany.model.js
index 5f572bc..892bb44 100644
--- a/server/api/cmCompany/cmCompany.model.js
+++ b/server/api/cmCompany/cmCompany.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCompany/cmCompany.rpc.js b/server/api/cmCompany/cmCompany.rpc.js
index 8555658..25cf38d 100644
--- a/server/api/cmCompany/cmCompany.rpc.js
+++ b/server/api/cmCompany/cmCompany.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCompany/index.js b/server/api/cmCompany/index.js
index 170528d..dd6ee32 100644
--- a/server/api/cmCompany/index.js
+++ b/server/api/cmCompany/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.attributes.js b/server/api/cmContact/cmContact.attributes.js
index 1db095e..25a2f4f 100644
--- a/server/api/cmContact/cmContact.attributes.js
+++ b/server/api/cmContact/cmContact.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.controller.js b/server/api/cmContact/cmContact.controller.js
index 5a42085..654a534 100644
--- a/server/api/cmContact/cmContact.controller.js
+++ b/server/api/cmContact/cmContact.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.events.js b/server/api/cmContact/cmContact.events.js
index ce0a656..3f01e08 100644
--- a/server/api/cmContact/cmContact.events.js
+++ b/server/api/cmContact/cmContact.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.model.js b/server/api/cmContact/cmContact.model.js
index 821139c..5f724a5 100644
--- a/server/api/cmContact/cmContact.model.js
+++ b/server/api/cmContact/cmContact.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.rpc.js b/server/api/cmContact/cmContact.rpc.js
index ccd8be6..74c1710 100644
--- a/server/api/cmContact/cmContact.rpc.js
+++ b/server/api/cmContact/cmContact.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/cmContact.socket.js b/server/api/cmContact/cmContact.socket.js
index b65160c..4ddd7f4 100644
--- a/server/api/cmContact/cmContact.socket.js
+++ b/server/api/cmContact/cmContact.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContact/index.js b/server/api/cmContact/index.js
index 01aaf02..761eae2 100644
--- a/server/api/cmContact/index.js
+++ b/server/api/cmContact/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.controller.js b/server/api/cmContactHasItem/cmContactHasItem.controller.js
deleted file mode 100644
index be407da..0000000
--- a/server/api/cmContactHasItem/cmContactHasItem.controller.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.rpc.js b/server/api/cmContactHasItem/cmContactHasItem.rpc.js
deleted file mode 100644
index 868e150..0000000
--- a/server/api/cmContactHasItem/cmContactHasItem.rpc.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/index.js b/server/api/cmContactHasItem/index.js
deleted file mode 100644
index ecc3e30..0000000
--- a/server/api/cmContactHasItem/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmCustomField/cmCustomField.attributes.js b/server/api/cmCustomField/cmCustomField.attributes.js
index b9ffce8..10af9a8 100644
--- a/server/api/cmCustomField/cmCustomField.attributes.js
+++ b/server/api/cmCustomField/cmCustomField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCustomField/cmCustomField.controller.js b/server/api/cmCustomField/cmCustomField.controller.js
index 370188b..d78fc86 100644
--- a/server/api/cmCustomField/cmCustomField.controller.js
+++ b/server/api/cmCustomField/cmCustomField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCustomField/cmCustomField.model.js b/server/api/cmCustomField/cmCustomField.model.js
index 1908cff..d18e7f8 100644
--- a/server/api/cmCustomField/cmCustomField.model.js
+++ b/server/api/cmCustomField/cmCustomField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCustomField/cmCustomField.rpc.js b/server/api/cmCustomField/cmCustomField.rpc.js
index 8a0feae..38d8c9f 100644
--- a/server/api/cmCustomField/cmCustomField.rpc.js
+++ b/server/api/cmCustomField/cmCustomField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmCustomField/index.js b/server/api/cmCustomField/index.js
index 5c46f9d..c0401db 100644
--- a/server/api/cmCustomField/index.js
+++ b/server/api/cmCustomField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopper/cmHopper.attributes.js b/server/api/cmHopper/cmHopper.attributes.js
index 470bbdc..026dd71 100644
--- a/server/api/cmHopper/cmHopper.attributes.js
+++ b/server/api/cmHopper/cmHopper.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopper/cmHopper.controller.js b/server/api/cmHopper/cmHopper.controller.js
index 384d11e..d3ba96a 100644
--- a/server/api/cmHopper/cmHopper.controller.js
+++ b/server/api/cmHopper/cmHopper.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopper/cmHopper.model.js b/server/api/cmHopper/cmHopper.model.js
index 3ce8bf8..46e4f95 100644
--- a/server/api/cmHopper/cmHopper.model.js
+++ b/server/api/cmHopper/cmHopper.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopper/cmHopper.rpc.js b/server/api/cmHopper/cmHopper.rpc.js
index 660e9c9..84b0b87 100644
--- a/server/api/cmHopper/cmHopper.rpc.js
+++ b/server/api/cmHopper/cmHopper.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopper/index.js b/server/api/cmHopper/index.js
index d4440ff..bced967 100644
--- a/server/api/cmHopper/index.js
+++ b/server/api/cmHopper/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.attributes.js b/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.attributes.js
deleted file mode 100644
index 5754e57..0000000
--- a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.attributes.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.controller.js b/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.controller.js
deleted file mode 100644
index 763172e..0000000
--- a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.controller.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.rpc.js b/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.rpc.js
deleted file mode 100644
index 0171bfd..0000000
--- a/server/api/cmHopperAdditionalPhone/cmHopperAdditionalPhone.rpc.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmHopperAdditionalPhone/index.js b/server/api/cmHopperAdditionalPhone/index.js
deleted file mode 100644
index 4c80bc3..0000000
--- a/server/api/cmHopperAdditionalPhone/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/cmHopperBlack/cmHopperBlack.attributes.js b/server/api/cmHopperBlack/cmHopperBlack.attributes.js
index 8aaa12a..8e4a43a 100644
--- a/server/api/cmHopperBlack/cmHopperBlack.attributes.js
+++ b/server/api/cmHopperBlack/cmHopperBlack.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperBlack/cmHopperBlack.controller.js b/server/api/cmHopperBlack/cmHopperBlack.controller.js
index 5eef240..408db48 100644
--- a/server/api/cmHopperBlack/cmHopperBlack.controller.js
+++ b/server/api/cmHopperBlack/cmHopperBlack.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperBlack/cmHopperBlack.model.js b/server/api/cmHopperBlack/cmHopperBlack.model.js
index 459dcfa..3c87f31 100644
--- a/server/api/cmHopperBlack/cmHopperBlack.model.js
+++ b/server/api/cmHopperBlack/cmHopperBlack.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperBlack/cmHopperBlack.rpc.js b/server/api/cmHopperBlack/cmHopperBlack.rpc.js
index 047f111..744874f 100644
--- a/server/api/cmHopperBlack/cmHopperBlack.rpc.js
+++ b/server/api/cmHopperBlack/cmHopperBlack.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperBlack/index.js b/server/api/cmHopperBlack/index.js
index 7fc93f2..3c79df4 100644
--- a/server/api/cmHopperBlack/index.js
+++ b/server/api/cmHopperBlack/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperFinal/cmHopperFinal.attributes.js b/server/api/cmHopperFinal/cmHopperFinal.attributes.js
index 05a7b71..d781b73 100644
--- a/server/api/cmHopperFinal/cmHopperFinal.attributes.js
+++ b/server/api/cmHopperFinal/cmHopperFinal.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperFinal/cmHopperFinal.controller.js b/server/api/cmHopperFinal/cmHopperFinal.controller.js
index 4c22e5a..c077d7a 100644
--- a/server/api/cmHopperFinal/cmHopperFinal.controller.js
+++ b/server/api/cmHopperFinal/cmHopperFinal.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperFinal/cmHopperFinal.model.js b/server/api/cmHopperFinal/cmHopperFinal.model.js
index 19101dd..3b7917b 100644
--- a/server/api/cmHopperFinal/cmHopperFinal.model.js
+++ b/server/api/cmHopperFinal/cmHopperFinal.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperFinal/cmHopperFinal.rpc.js b/server/api/cmHopperFinal/cmHopperFinal.rpc.js
index 88228e7..95b04c9 100644
--- a/server/api/cmHopperFinal/cmHopperFinal.rpc.js
+++ b/server/api/cmHopperFinal/cmHopperFinal.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperFinal/index.js b/server/api/cmHopperFinal/index.js
index 82a90f7..c124b50 100644
--- a/server/api/cmHopperFinal/index.js
+++ b/server/api/cmHopperFinal/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperHistory/cmHopperHistory.attributes.js b/server/api/cmHopperHistory/cmHopperHistory.attributes.js
index 7de2cc3..11afe58 100644
--- a/server/api/cmHopperHistory/cmHopperHistory.attributes.js
+++ b/server/api/cmHopperHistory/cmHopperHistory.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperHistory/cmHopperHistory.controller.js b/server/api/cmHopperHistory/cmHopperHistory.controller.js
index 6384792..020d193 100644
--- a/server/api/cmHopperHistory/cmHopperHistory.controller.js
+++ b/server/api/cmHopperHistory/cmHopperHistory.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperHistory/cmHopperHistory.model.js b/server/api/cmHopperHistory/cmHopperHistory.model.js
index 2894f6e..ef142c3 100644
--- a/server/api/cmHopperHistory/cmHopperHistory.model.js
+++ b/server/api/cmHopperHistory/cmHopperHistory.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperHistory/cmHopperHistory.rpc.js b/server/api/cmHopperHistory/cmHopperHistory.rpc.js
index 22205ad..fd76fab 100644
--- a/server/api/cmHopperHistory/cmHopperHistory.rpc.js
+++ b/server/api/cmHopperHistory/cmHopperHistory.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmHopperHistory/index.js b/server/api/cmHopperHistory/index.js
index fccea2d..7b85d93 100644
--- a/server/api/cmHopperHistory/index.js
+++ b/server/api/cmHopperHistory/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.attributes.js b/server/api/cmList/cmList.attributes.js
index b35f439..da6ab08 100644
--- a/server/api/cmList/cmList.attributes.js
+++ b/server/api/cmList/cmList.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.controller.js b/server/api/cmList/cmList.controller.js
index c3bdf30..f2b0b81 100644
--- a/server/api/cmList/cmList.controller.js
+++ b/server/api/cmList/cmList.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.events.js b/server/api/cmList/cmList.events.js
index a8b4eb9..61e9bb1 100644
--- a/server/api/cmList/cmList.events.js
+++ b/server/api/cmList/cmList.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.model.js b/server/api/cmList/cmList.model.js
index 84d7ada..24b2e4a 100644
--- a/server/api/cmList/cmList.model.js
+++ b/server/api/cmList/cmList.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.rpc.js b/server/api/cmList/cmList.rpc.js
index d6f0944..b4d4432 100644
--- a/server/api/cmList/cmList.rpc.js
+++ b/server/api/cmList/cmList.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/cmList.socket.js b/server/api/cmList/cmList.socket.js
index 7dd5924..8e7018f 100644
--- a/server/api/cmList/cmList.socket.js
+++ b/server/api/cmList/cmList.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmList/index.js b/server/api/cmList/index.js
index c0a76f6..d387b7c 100644
--- a/server/api/cmList/index.js
+++ b/server/api/cmList/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/condition/condition.attributes.js b/server/api/condition/condition.attributes.js
index 6ecf7ce..c71d310 100644
--- a/server/api/condition/condition.attributes.js
+++ b/server/api/condition/condition.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/condition/condition.controller.js b/server/api/condition/condition.controller.js
index c4ca64e..9080bab 100644
--- a/server/api/condition/condition.controller.js
+++ b/server/api/condition/condition.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/condition/condition.model.js b/server/api/condition/condition.model.js
index 6d2f6ae..d6dfbc1 100644
--- a/server/api/condition/condition.model.js
+++ b/server/api/condition/condition.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/condition/condition.rpc.js b/server/api/condition/condition.rpc.js
index 401a9cd..6a635bc 100644
--- a/server/api/condition/condition.rpc.js
+++ b/server/api/condition/condition.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/condition/index.js b/server/api/condition/index.js
index 21457f9..a69b370 100644
--- a/server/api/condition/index.js
+++ b/server/api/condition/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.controller.js b/server/api/contactItemType/contactItemType.controller.js
deleted file mode 100644
index 0f74d0b..0000000
--- a/server/api/contactItemType/contactItemType.controller.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.rpc.js b/server/api/contactItemType/contactItemType.rpc.js
deleted file mode 100644
index 8cc2856..0000000
--- a/server/api/contactItemType/contactItemType.rpc.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/contactItemType/index.js b/server/api/contactItemType/index.js
deleted file mode 100644
index e8620c5..0000000
--- a/server/api/contactItemType/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.attributes.js b/server/api/dashboard/dashboard.attributes.js
index 5e7e87a..1f934a6 100644
--- a/server/api/dashboard/dashboard.attributes.js
+++ b/server/api/dashboard/dashboard.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.controller.js b/server/api/dashboard/dashboard.controller.js
index 335957d..5a8087b 100644
--- a/server/api/dashboard/dashboard.controller.js
+++ b/server/api/dashboard/dashboard.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.events.js b/server/api/dashboard/dashboard.events.js
index 740cdf5..26483a6 100644
--- a/server/api/dashboard/dashboard.events.js
+++ b/server/api/dashboard/dashboard.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.model.js b/server/api/dashboard/dashboard.model.js
index 352a69a..40f0eec 100644
--- a/server/api/dashboard/dashboard.model.js
+++ b/server/api/dashboard/dashboard.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.rpc.js b/server/api/dashboard/dashboard.rpc.js
index 6f1f621..22064ae 100644
--- a/server/api/dashboard/dashboard.rpc.js
+++ b/server/api/dashboard/dashboard.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.socket.js b/server/api/dashboard/dashboard.socket.js
index 5e83d6b..ee1e9b3 100644
--- a/server/api/dashboard/dashboard.socket.js
+++ b/server/api/dashboard/dashboard.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboard/index.js b/server/api/dashboard/index.js
index da6d904..45b71d1 100644
--- a/server/api/dashboard/index.js
+++ b/server/api/dashboard/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.attributes.js b/server/api/dashboardItem/dashboardItem.attributes.js
index 2ea91d8..81d008c 100644
--- a/server/api/dashboardItem/dashboardItem.attributes.js
+++ b/server/api/dashboardItem/dashboardItem.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.controller.js b/server/api/dashboardItem/dashboardItem.controller.js
index 4d60044..2750b98 100644
--- a/server/api/dashboardItem/dashboardItem.controller.js
+++ b/server/api/dashboardItem/dashboardItem.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.events.js b/server/api/dashboardItem/dashboardItem.events.js
index 9a09bef..567cbcb 100644
--- a/server/api/dashboardItem/dashboardItem.events.js
+++ b/server/api/dashboardItem/dashboardItem.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.model.js b/server/api/dashboardItem/dashboardItem.model.js
index 6843c1f..6223534 100644
--- a/server/api/dashboardItem/dashboardItem.model.js
+++ b/server/api/dashboardItem/dashboardItem.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.rpc.js b/server/api/dashboardItem/dashboardItem.rpc.js
index 9166cbc..4d49aab 100644
--- a/server/api/dashboardItem/dashboardItem.rpc.js
+++ b/server/api/dashboardItem/dashboardItem.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/dashboardItem.socket.js b/server/api/dashboardItem/dashboardItem.socket.js
index 92aaaca..e74c4bc 100644
--- a/server/api/dashboardItem/dashboardItem.socket.js
+++ b/server/api/dashboardItem/dashboardItem.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/dashboardItem/index.js b/server/api/dashboardItem/index.js
index 589cf6b..48ea381 100644
--- a/server/api/dashboardItem/index.js
+++ b/server/api/dashboardItem/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/disposition/disposition.attributes.js b/server/api/disposition/disposition.attributes.js
index 356f885..2e33270 100644
--- a/server/api/disposition/disposition.attributes.js
+++ b/server/api/disposition/disposition.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/disposition/disposition.controller.js b/server/api/disposition/disposition.controller.js
index 04faf0b..0ccb735 100644
--- a/server/api/disposition/disposition.controller.js
+++ b/server/api/disposition/disposition.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/disposition/disposition.model.js b/server/api/disposition/disposition.model.js
index 04b82f0..2be76c4 100644
--- a/server/api/disposition/disposition.model.js
+++ b/server/api/disposition/disposition.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/disposition/disposition.rpc.js b/server/api/disposition/disposition.rpc.js
index 7785d17..65a94b4 100644
--- a/server/api/disposition/disposition.rpc.js
+++ b/server/api/disposition/disposition.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/disposition/index.js b/server/api/disposition/index.js
index c6fa665..3ebe887 100644
--- a/server/api/disposition/index.js
+++ b/server/api/disposition/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.attributes.js b/server/api/faxAccount/faxAccount.attributes.js
index 1e697f1..07e909b 100644
--- a/server/api/faxAccount/faxAccount.attributes.js
+++ b/server/api/faxAccount/faxAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.controller.js b/server/api/faxAccount/faxAccount.controller.js
index a68aeba..81c5d8d 100644
--- a/server/api/faxAccount/faxAccount.controller.js
+++ b/server/api/faxAccount/faxAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.events.js b/server/api/faxAccount/faxAccount.events.js
index 21402ab..e770bc6 100644
--- a/server/api/faxAccount/faxAccount.events.js
+++ b/server/api/faxAccount/faxAccount.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.model.js b/server/api/faxAccount/faxAccount.model.js
index 2b777dc..74d284c 100644
--- a/server/api/faxAccount/faxAccount.model.js
+++ b/server/api/faxAccount/faxAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.rpc.js b/server/api/faxAccount/faxAccount.rpc.js
index b5ef53f..fa2b50e 100644
--- a/server/api/faxAccount/faxAccount.rpc.js
+++ b/server/api/faxAccount/faxAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/faxAccount.socket.js b/server/api/faxAccount/faxAccount.socket.js
index 6a5d233..d655a3e 100644
--- a/server/api/faxAccount/faxAccount.socket.js
+++ b/server/api/faxAccount/faxAccount.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxAccount/index.js b/server/api/faxAccount/index.js
index fac8a6d..a11fccb 100644
--- a/server/api/faxAccount/index.js
+++ b/server/api/faxAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxApplication/faxApplication.attributes.js b/server/api/faxApplication/faxApplication.attributes.js
index 03df8d6..d678c54 100644
--- a/server/api/faxApplication/faxApplication.attributes.js
+++ b/server/api/faxApplication/faxApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxApplication/faxApplication.controller.js b/server/api/faxApplication/faxApplication.controller.js
index 99d6b08..fba5ea1 100644
--- a/server/api/faxApplication/faxApplication.controller.js
+++ b/server/api/faxApplication/faxApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxApplication/faxApplication.model.js b/server/api/faxApplication/faxApplication.model.js
index 637ab55..52ea79d 100644
--- a/server/api/faxApplication/faxApplication.model.js
+++ b/server/api/faxApplication/faxApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxApplication/faxApplication.rpc.js b/server/api/faxApplication/faxApplication.rpc.js
index 11a003d..2ac8da0 100644
--- a/server/api/faxApplication/faxApplication.rpc.js
+++ b/server/api/faxApplication/faxApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxApplication/index.js b/server/api/faxApplication/index.js
index 6698b42..31d537f 100644
--- a/server/api/faxApplication/index.js
+++ b/server/api/faxApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.attributes.js b/server/api/faxInteraction/faxInteraction.attributes.js
index ba0d5ec..a59652a 100644
--- a/server/api/faxInteraction/faxInteraction.attributes.js
+++ b/server/api/faxInteraction/faxInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.controller.js b/server/api/faxInteraction/faxInteraction.controller.js
index 12421c2..ed3d766 100644
--- a/server/api/faxInteraction/faxInteraction.controller.js
+++ b/server/api/faxInteraction/faxInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.events.js b/server/api/faxInteraction/faxInteraction.events.js
index 348e650..ae03205 100644
--- a/server/api/faxInteraction/faxInteraction.events.js
+++ b/server/api/faxInteraction/faxInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.model.js b/server/api/faxInteraction/faxInteraction.model.js
index 5cceef4..4b5c6f3 100644
--- a/server/api/faxInteraction/faxInteraction.model.js
+++ b/server/api/faxInteraction/faxInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.rpc.js b/server/api/faxInteraction/faxInteraction.rpc.js
index 5923584..a7106d3 100644
--- a/server/api/faxInteraction/faxInteraction.rpc.js
+++ b/server/api/faxInteraction/faxInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/faxInteraction.socket.js b/server/api/faxInteraction/faxInteraction.socket.js
index 37fb1ba..50a7aca 100644
--- a/server/api/faxInteraction/faxInteraction.socket.js
+++ b/server/api/faxInteraction/faxInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxInteraction/index.js b/server/api/faxInteraction/index.js
index 32b34c9..1261f16 100644
--- a/server/api/faxInteraction/index.js
+++ b/server/api/faxInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.attributes.js b/server/api/faxMessage/faxMessage.attributes.js
index 8202f55..4c668e0 100644
--- a/server/api/faxMessage/faxMessage.attributes.js
+++ b/server/api/faxMessage/faxMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.controller.js b/server/api/faxMessage/faxMessage.controller.js
index 77d7260..7263b12 100644
--- a/server/api/faxMessage/faxMessage.controller.js
+++ b/server/api/faxMessage/faxMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.events.js b/server/api/faxMessage/faxMessage.events.js
index e5a2b9c..90c0c28 100644
--- a/server/api/faxMessage/faxMessage.events.js
+++ b/server/api/faxMessage/faxMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.model.js b/server/api/faxMessage/faxMessage.model.js
index 05f0bfa..7fc1df0 100644
--- a/server/api/faxMessage/faxMessage.model.js
+++ b/server/api/faxMessage/faxMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.rpc.js b/server/api/faxMessage/faxMessage.rpc.js
index c0861ba..3e2defd 100644
--- a/server/api/faxMessage/faxMessage.rpc.js
+++ b/server/api/faxMessage/faxMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/faxMessage.socket.js b/server/api/faxMessage/faxMessage.socket.js
index ed80e44..06fc796 100644
--- a/server/api/faxMessage/faxMessage.socket.js
+++ b/server/api/faxMessage/faxMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxMessage/index.js b/server/api/faxMessage/index.js
index a98081f..e0ec311 100644
--- a/server/api/faxMessage/index.js
+++ b/server/api/faxMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.attributes.js b/server/api/faxQueue/faxQueue.attributes.js
index faa8e42..5952c24 100644
--- a/server/api/faxQueue/faxQueue.attributes.js
+++ b/server/api/faxQueue/faxQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.controller.js b/server/api/faxQueue/faxQueue.controller.js
index 432e379..e57061a 100644
--- a/server/api/faxQueue/faxQueue.controller.js
+++ b/server/api/faxQueue/faxQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.events.js b/server/api/faxQueue/faxQueue.events.js
index c253c61..1a0f133 100644
--- a/server/api/faxQueue/faxQueue.events.js
+++ b/server/api/faxQueue/faxQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.model.js b/server/api/faxQueue/faxQueue.model.js
index 1b582c8..73a8542 100644
--- a/server/api/faxQueue/faxQueue.model.js
+++ b/server/api/faxQueue/faxQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.rpc.js b/server/api/faxQueue/faxQueue.rpc.js
index cd7f7f7..7a271eb 100644
--- a/server/api/faxQueue/faxQueue.rpc.js
+++ b/server/api/faxQueue/faxQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/faxQueue.socket.js b/server/api/faxQueue/faxQueue.socket.js
index f269a4c..f2eb124 100644
--- a/server/api/faxQueue/faxQueue.socket.js
+++ b/server/api/faxQueue/faxQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueue/index.js b/server/api/faxQueue/index.js
index 588ec30..68e6bd2 100644
--- a/server/api/faxQueue/index.js
+++ b/server/api/faxQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueueReport/faxQueueReport.attributes.js b/server/api/faxQueueReport/faxQueueReport.attributes.js
index bb8ea55..e2ce4e3 100644
--- a/server/api/faxQueueReport/faxQueueReport.attributes.js
+++ b/server/api/faxQueueReport/faxQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueueReport/faxQueueReport.controller.js b/server/api/faxQueueReport/faxQueueReport.controller.js
index 37b897a..b1229a7 100644
--- a/server/api/faxQueueReport/faxQueueReport.controller.js
+++ b/server/api/faxQueueReport/faxQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueueReport/faxQueueReport.model.js b/server/api/faxQueueReport/faxQueueReport.model.js
index adee96f..ef3e564 100644
--- a/server/api/faxQueueReport/faxQueueReport.model.js
+++ b/server/api/faxQueueReport/faxQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueueReport/faxQueueReport.rpc.js b/server/api/faxQueueReport/faxQueueReport.rpc.js
index 6d8f828..64286cb 100644
--- a/server/api/faxQueueReport/faxQueueReport.rpc.js
+++ b/server/api/faxQueueReport/faxQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxQueueReport/index.js b/server/api/faxQueueReport/index.js
index 716196f..021fb4e 100644
--- a/server/api/faxQueueReport/index.js
+++ b/server/api/faxQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxTransferReport/faxTransferReport.attributes.js b/server/api/faxTransferReport/faxTransferReport.attributes.js
index 423d5ce..94e3a56 100644
--- a/server/api/faxTransferReport/faxTransferReport.attributes.js
+++ b/server/api/faxTransferReport/faxTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxTransferReport/faxTransferReport.controller.js b/server/api/faxTransferReport/faxTransferReport.controller.js
index 8e7bc5b..626fdc7 100644
--- a/server/api/faxTransferReport/faxTransferReport.controller.js
+++ b/server/api/faxTransferReport/faxTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxTransferReport/faxTransferReport.model.js b/server/api/faxTransferReport/faxTransferReport.model.js
index 6a5a543..727a853 100644
--- a/server/api/faxTransferReport/faxTransferReport.model.js
+++ b/server/api/faxTransferReport/faxTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxTransferReport/faxTransferReport.rpc.js b/server/api/faxTransferReport/faxTransferReport.rpc.js
index 5caa956..df8457a 100644
--- a/server/api/faxTransferReport/faxTransferReport.rpc.js
+++ b/server/api/faxTransferReport/faxTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/faxTransferReport/index.js b/server/api/faxTransferReport/index.js
index 9907373..86d0619 100644
--- a/server/api/faxTransferReport/index.js
+++ b/server/api/faxTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskAccount/index.js b/server/api/intDeskAccount/index.js
index 3aed718..68909d0 100644
--- a/server/api/intDeskAccount/index.js
+++ b/server/api/intDeskAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskAccount/intDeskAccount.attributes.js b/server/api/intDeskAccount/intDeskAccount.attributes.js
index e07cf2b..b1cf646 100644
--- a/server/api/intDeskAccount/intDeskAccount.attributes.js
+++ b/server/api/intDeskAccount/intDeskAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskAccount/intDeskAccount.controller.js b/server/api/intDeskAccount/intDeskAccount.controller.js
index bff0515..761b37c 100644
--- a/server/api/intDeskAccount/intDeskAccount.controller.js
+++ b/server/api/intDeskAccount/intDeskAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskAccount/intDeskAccount.model.js b/server/api/intDeskAccount/intDeskAccount.model.js
index 1a0ed26..b50356c 100644
--- a/server/api/intDeskAccount/intDeskAccount.model.js
+++ b/server/api/intDeskAccount/intDeskAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskAccount/intDeskAccount.rpc.js b/server/api/intDeskAccount/intDeskAccount.rpc.js
index 8d02b2e..61076a0 100644
--- a/server/api/intDeskAccount/intDeskAccount.rpc.js
+++ b/server/api/intDeskAccount/intDeskAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskConfiguration/index.js b/server/api/intDeskConfiguration/index.js
index cbb424e..c14b13b 100644
--- a/server/api/intDeskConfiguration/index.js
+++ b/server/api/intDeskConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskConfiguration/intDeskConfiguration.attributes.js b/server/api/intDeskConfiguration/intDeskConfiguration.attributes.js
index 8a6fede..4128482 100644
--- a/server/api/intDeskConfiguration/intDeskConfiguration.attributes.js
+++ b/server/api/intDeskConfiguration/intDeskConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x0d32=['STRING','exports'];(function(_0x2be8c2,_0x14a4b5){var _0x97f531=function(_0xcee58d){while(--_0xcee58d){_0x2be8c2['push'](_0x2be8c2['shift']());}};_0x97f531(++_0x14a4b5);}(_0x0d32,0x119));var _0x20d3=function(_0x490730,_0x26334b){_0x490730=_0x490730-0x0;var _0x2494e4=_0x0d32[_0x490730];return _0x2494e4;};'use strict';var Sequelize=require('sequelize');module[_0x20d3('0x0')]={'name':{'type':Sequelize[_0x20d3('0x1')]},'description':{'type':Sequelize[_0x20d3('0x1')]}};
\ No newline at end of file
+var _0x62b1=['STRING','sequelize'];(function(_0xe0d2ae,_0x272cfb){var _0x20ce13=function(_0x3e06ba){while(--_0x3e06ba){_0xe0d2ae['push'](_0xe0d2ae['shift']());}};_0x20ce13(++_0x272cfb);}(_0x62b1,0x137));var _0x162b=function(_0x2e9dae,_0x5f13b0){_0x2e9dae=_0x2e9dae-0x0;var _0x2b8016=_0x62b1[_0x2e9dae];return _0x2b8016;};'use strict';var Sequelize=require(_0x162b('0x0'));module['exports']={'name':{'type':Sequelize[_0x162b('0x1')]},'description':{'type':Sequelize['STRING']}};
\ No newline at end of file
diff --git a/server/api/intDeskConfiguration/intDeskConfiguration.controller.js b/server/api/intDeskConfiguration/intDeskConfiguration.controller.js
index 17fde37..4134c30 100644
--- a/server/api/intDeskConfiguration/intDeskConfiguration.controller.js
+++ b/server/api/intDeskConfiguration/intDeskConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskConfiguration/intDeskConfiguration.model.js b/server/api/intDeskConfiguration/intDeskConfiguration.model.js
index dcb546a..74b6c3f 100644
--- a/server/api/intDeskConfiguration/intDeskConfiguration.model.js
+++ b/server/api/intDeskConfiguration/intDeskConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskConfiguration/intDeskConfiguration.rpc.js b/server/api/intDeskConfiguration/intDeskConfiguration.rpc.js
index f33d080..d150b6b 100644
--- a/server/api/intDeskConfiguration/intDeskConfiguration.rpc.js
+++ b/server/api/intDeskConfiguration/intDeskConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskField/index.js b/server/api/intDeskField/index.js
index 0e9b821..03a2eec 100644
--- a/server/api/intDeskField/index.js
+++ b/server/api/intDeskField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskField/intDeskField.attributes.js b/server/api/intDeskField/intDeskField.attributes.js
index 9d4fdcb..5b908f1 100644
--- a/server/api/intDeskField/intDeskField.attributes.js
+++ b/server/api/intDeskField/intDeskField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskField/intDeskField.controller.js b/server/api/intDeskField/intDeskField.controller.js
index a88af93..e437b92 100644
--- a/server/api/intDeskField/intDeskField.controller.js
+++ b/server/api/intDeskField/intDeskField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskField/intDeskField.model.js b/server/api/intDeskField/intDeskField.model.js
index 3695148..b6a4689 100644
--- a/server/api/intDeskField/intDeskField.model.js
+++ b/server/api/intDeskField/intDeskField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDeskField/intDeskField.rpc.js b/server/api/intDeskField/intDeskField.rpc.js
index 3899742..03fb8f1 100644
--- a/server/api/intDeskField/intDeskField.rpc.js
+++ b/server/api/intDeskField/intDeskField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Account/index.js b/server/api/intDynamics365Account/index.js
index 1feab9c..e54fb91 100644
--- a/server/api/intDynamics365Account/index.js
+++ b/server/api/intDynamics365Account/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Account/intDynamics365Account.attributes.js b/server/api/intDynamics365Account/intDynamics365Account.attributes.js
index bc67d06..028948c 100644
--- a/server/api/intDynamics365Account/intDynamics365Account.attributes.js
+++ b/server/api/intDynamics365Account/intDynamics365Account.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Account/intDynamics365Account.controller.js b/server/api/intDynamics365Account/intDynamics365Account.controller.js
index 81c443b..2617158 100644
--- a/server/api/intDynamics365Account/intDynamics365Account.controller.js
+++ b/server/api/intDynamics365Account/intDynamics365Account.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Account/intDynamics365Account.model.js b/server/api/intDynamics365Account/intDynamics365Account.model.js
index 66e490e..6ce10c6 100644
--- a/server/api/intDynamics365Account/intDynamics365Account.model.js
+++ b/server/api/intDynamics365Account/intDynamics365Account.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Account/intDynamics365Account.rpc.js b/server/api/intDynamics365Account/intDynamics365Account.rpc.js
index b4a745a..1afcc95 100644
--- a/server/api/intDynamics365Account/intDynamics365Account.rpc.js
+++ b/server/api/intDynamics365Account/intDynamics365Account.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Configuration/index.js b/server/api/intDynamics365Configuration/index.js
index f56abb0..62004e6 100644
--- a/server/api/intDynamics365Configuration/index.js
+++ b/server/api/intDynamics365Configuration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Configuration/intDynamics365Configuration.attributes.js b/server/api/intDynamics365Configuration/intDynamics365Configuration.attributes.js
index d2b0be3..c58b400 100644
--- a/server/api/intDynamics365Configuration/intDynamics365Configuration.attributes.js
+++ b/server/api/intDynamics365Configuration/intDynamics365Configuration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Configuration/intDynamics365Configuration.controller.js b/server/api/intDynamics365Configuration/intDynamics365Configuration.controller.js
index 3a47b28..e9921ca 100644
--- a/server/api/intDynamics365Configuration/intDynamics365Configuration.controller.js
+++ b/server/api/intDynamics365Configuration/intDynamics365Configuration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Configuration/intDynamics365Configuration.model.js b/server/api/intDynamics365Configuration/intDynamics365Configuration.model.js
index 36b08a6..042ac24 100644
--- a/server/api/intDynamics365Configuration/intDynamics365Configuration.model.js
+++ b/server/api/intDynamics365Configuration/intDynamics365Configuration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Configuration/intDynamics365Configuration.rpc.js b/server/api/intDynamics365Configuration/intDynamics365Configuration.rpc.js
index eb64b0d..2fb8daa 100644
--- a/server/api/intDynamics365Configuration/intDynamics365Configuration.rpc.js
+++ b/server/api/intDynamics365Configuration/intDynamics365Configuration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Field/index.js b/server/api/intDynamics365Field/index.js
index 1af455f..c110071 100644
--- a/server/api/intDynamics365Field/index.js
+++ b/server/api/intDynamics365Field/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Field/intDynamics365Field.attributes.js b/server/api/intDynamics365Field/intDynamics365Field.attributes.js
index d2f7769..ac6708e 100644
--- a/server/api/intDynamics365Field/intDynamics365Field.attributes.js
+++ b/server/api/intDynamics365Field/intDynamics365Field.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Field/intDynamics365Field.controller.js b/server/api/intDynamics365Field/intDynamics365Field.controller.js
index 8144e82..1830261 100644
--- a/server/api/intDynamics365Field/intDynamics365Field.controller.js
+++ b/server/api/intDynamics365Field/intDynamics365Field.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Field/intDynamics365Field.model.js b/server/api/intDynamics365Field/intDynamics365Field.model.js
index 3d1e008..e94f529 100644
--- a/server/api/intDynamics365Field/intDynamics365Field.model.js
+++ b/server/api/intDynamics365Field/intDynamics365Field.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intDynamics365Field/intDynamics365Field.rpc.js b/server/api/intDynamics365Field/intDynamics365Field.rpc.js
index 0fe579d..e74e6e9 100644
--- a/server/api/intDynamics365Field/intDynamics365Field.rpc.js
+++ b/server/api/intDynamics365Field/intDynamics365Field.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskAccount/index.js b/server/api/intFreshdeskAccount/index.js
index eec0179..d27304e 100644
--- a/server/api/intFreshdeskAccount/index.js
+++ b/server/api/intFreshdeskAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskAccount/intFreshdeskAccount.attributes.js b/server/api/intFreshdeskAccount/intFreshdeskAccount.attributes.js
index d1011c0..43b8ade 100644
--- a/server/api/intFreshdeskAccount/intFreshdeskAccount.attributes.js
+++ b/server/api/intFreshdeskAccount/intFreshdeskAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskAccount/intFreshdeskAccount.controller.js b/server/api/intFreshdeskAccount/intFreshdeskAccount.controller.js
index 8528633..b98691c 100644
--- a/server/api/intFreshdeskAccount/intFreshdeskAccount.controller.js
+++ b/server/api/intFreshdeskAccount/intFreshdeskAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskAccount/intFreshdeskAccount.model.js b/server/api/intFreshdeskAccount/intFreshdeskAccount.model.js
index c47f470..84ad6eb 100644
--- a/server/api/intFreshdeskAccount/intFreshdeskAccount.model.js
+++ b/server/api/intFreshdeskAccount/intFreshdeskAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskAccount/intFreshdeskAccount.rpc.js b/server/api/intFreshdeskAccount/intFreshdeskAccount.rpc.js
index 2189678..daa3ae5 100644
--- a/server/api/intFreshdeskAccount/intFreshdeskAccount.rpc.js
+++ b/server/api/intFreshdeskAccount/intFreshdeskAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskConfiguration/index.js b/server/api/intFreshdeskConfiguration/index.js
index bae5e7f..c8053d5 100644
--- a/server/api/intFreshdeskConfiguration/index.js
+++ b/server/api/intFreshdeskConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.attributes.js b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.attributes.js
index aac2bd3..1ab4e33 100644
--- a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.attributes.js
+++ b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xf90e=['STRING'];(function(_0x34f03f,_0x4f97d5){var _0x17cd3a=function(_0x1c865d){while(--_0x1c865d){_0x34f03f['push'](_0x34f03f['shift']());}};_0x17cd3a(++_0x4f97d5);}(_0xf90e,0x74));var _0xef90=function(_0x8685b4,_0x2ef5f9){_0x8685b4=_0x8685b4-0x0;var _0x1b000a=_0xf90e[_0x8685b4];return _0x1b000a;};'use strict';var Sequelize=require('sequelize');module['exports']={'name':{'type':Sequelize[_0xef90('0x0')]},'description':{'type':Sequelize[_0xef90('0x0')]}};
\ No newline at end of file
+var _0xcf0d=['STRING','sequelize','exports'];(function(_0x20ab6e,_0x56b31a){var _0x58b66d=function(_0x2b2228){while(--_0x2b2228){_0x20ab6e['push'](_0x20ab6e['shift']());}};_0x58b66d(++_0x56b31a);}(_0xcf0d,0x17e));var _0xdcf0=function(_0x16117b,_0x123801){_0x16117b=_0x16117b-0x0;var _0x3892d5=_0xcf0d[_0x16117b];return _0x3892d5;};'use strict';var Sequelize=require(_0xdcf0('0x0'));module[_0xdcf0('0x1')]={'name':{'type':Sequelize[_0xdcf0('0x2')]},'description':{'type':Sequelize[_0xdcf0('0x2')]}};
\ No newline at end of file
diff --git a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.controller.js b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.controller.js
index 5c4be41..a74adf2 100644
--- a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.controller.js
+++ b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.model.js b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.model.js
index 89f3e03..131a759 100644
--- a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.model.js
+++ b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.rpc.js b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.rpc.js
index 70f254c..d740443 100644
--- a/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.rpc.js
+++ b/server/api/intFreshdeskConfiguration/intFreshdeskConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskField/index.js b/server/api/intFreshdeskField/index.js
index ebfbba4..5c8de65 100644
--- a/server/api/intFreshdeskField/index.js
+++ b/server/api/intFreshdeskField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskField/intFreshdeskField.attributes.js b/server/api/intFreshdeskField/intFreshdeskField.attributes.js
index 698685a..854a90c 100644
--- a/server/api/intFreshdeskField/intFreshdeskField.attributes.js
+++ b/server/api/intFreshdeskField/intFreshdeskField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskField/intFreshdeskField.controller.js b/server/api/intFreshdeskField/intFreshdeskField.controller.js
index d7df6dd..d6d4cdb 100644
--- a/server/api/intFreshdeskField/intFreshdeskField.controller.js
+++ b/server/api/intFreshdeskField/intFreshdeskField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskField/intFreshdeskField.model.js b/server/api/intFreshdeskField/intFreshdeskField.model.js
index 151dfd0..f8a0691 100644
--- a/server/api/intFreshdeskField/intFreshdeskField.model.js
+++ b/server/api/intFreshdeskField/intFreshdeskField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshdeskField/intFreshdeskField.rpc.js b/server/api/intFreshdeskField/intFreshdeskField.rpc.js
index 7a1ec80..fbc6b29 100644
--- a/server/api/intFreshdeskField/intFreshdeskField.rpc.js
+++ b/server/api/intFreshdeskField/intFreshdeskField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesAccount/index.js b/server/api/intFreshsalesAccount/index.js
index ca614ff..7f424de 100644
--- a/server/api/intFreshsalesAccount/index.js
+++ b/server/api/intFreshsalesAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesAccount/intFreshsalesAccount.attributes.js b/server/api/intFreshsalesAccount/intFreshsalesAccount.attributes.js
index ce1f7a5..40d5ddc 100644
--- a/server/api/intFreshsalesAccount/intFreshsalesAccount.attributes.js
+++ b/server/api/intFreshsalesAccount/intFreshsalesAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesAccount/intFreshsalesAccount.controller.js b/server/api/intFreshsalesAccount/intFreshsalesAccount.controller.js
index c379fed..84b8a0b 100644
--- a/server/api/intFreshsalesAccount/intFreshsalesAccount.controller.js
+++ b/server/api/intFreshsalesAccount/intFreshsalesAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesAccount/intFreshsalesAccount.model.js b/server/api/intFreshsalesAccount/intFreshsalesAccount.model.js
index 7b2ee30..2b785d5 100644
--- a/server/api/intFreshsalesAccount/intFreshsalesAccount.model.js
+++ b/server/api/intFreshsalesAccount/intFreshsalesAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesAccount/intFreshsalesAccount.rpc.js b/server/api/intFreshsalesAccount/intFreshsalesAccount.rpc.js
index dec4562..4cd2a8a 100644
--- a/server/api/intFreshsalesAccount/intFreshsalesAccount.rpc.js
+++ b/server/api/intFreshsalesAccount/intFreshsalesAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesConfiguration/index.js b/server/api/intFreshsalesConfiguration/index.js
index 2d0fd08..a078c7a 100644
--- a/server/api/intFreshsalesConfiguration/index.js
+++ b/server/api/intFreshsalesConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.attributes.js b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.attributes.js
index 3b6800f..b5d7516 100644
--- a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.attributes.js
+++ b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xd934=['STRING'];(function(_0x1b4304,_0x30d704){var _0x410344=function(_0x462050){while(--_0x462050){_0x1b4304['push'](_0x1b4304['shift']());}};_0x410344(++_0x30d704);}(_0xd934,0xdc));var _0x4d93=function(_0x3fdefa,_0x12dd83){_0x3fdefa=_0x3fdefa-0x0;var _0x3d179e=_0xd934[_0x3fdefa];return _0x3d179e;};'use strict';var Sequelize=require('sequelize');module['exports']={'name':{'type':Sequelize[_0x4d93('0x0')]},'description':{'type':Sequelize[_0x4d93('0x0')]}};
\ No newline at end of file
+var _0x8fca=['STRING','exports'];(function(_0x2f29cb,_0x2c596a){var _0x3e09cc=function(_0x277306){while(--_0x277306){_0x2f29cb['push'](_0x2f29cb['shift']());}};_0x3e09cc(++_0x2c596a);}(_0x8fca,0xb7));var _0xa8fc=function(_0x190909,_0xa081f3){_0x190909=_0x190909-0x0;var _0x14d6a8=_0x8fca[_0x190909];return _0x14d6a8;};'use strict';var Sequelize=require('sequelize');module[_0xa8fc('0x0')]={'name':{'type':Sequelize['STRING']},'description':{'type':Sequelize[_0xa8fc('0x1')]}};
\ No newline at end of file
diff --git a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.controller.js b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.controller.js
index 4e24288..42adafb 100644
--- a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.controller.js
+++ b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.model.js b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.model.js
index 07b59a7..62feb7b 100644
--- a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.model.js
+++ b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.rpc.js b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.rpc.js
index 2796d5d..e3136d1 100644
--- a/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.rpc.js
+++ b/server/api/intFreshsalesConfiguration/intFreshsalesConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesField/index.js b/server/api/intFreshsalesField/index.js
index a9f202b..196d5a1 100644
--- a/server/api/intFreshsalesField/index.js
+++ b/server/api/intFreshsalesField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesField/intFreshsalesField.attributes.js b/server/api/intFreshsalesField/intFreshsalesField.attributes.js
index 118bed0..3db5e14 100644
--- a/server/api/intFreshsalesField/intFreshsalesField.attributes.js
+++ b/server/api/intFreshsalesField/intFreshsalesField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesField/intFreshsalesField.controller.js b/server/api/intFreshsalesField/intFreshsalesField.controller.js
index 117a2f6..56b0c33 100644
--- a/server/api/intFreshsalesField/intFreshsalesField.controller.js
+++ b/server/api/intFreshsalesField/intFreshsalesField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesField/intFreshsalesField.model.js b/server/api/intFreshsalesField/intFreshsalesField.model.js
index 4a404e4..6e4a718 100644
--- a/server/api/intFreshsalesField/intFreshsalesField.model.js
+++ b/server/api/intFreshsalesField/intFreshsalesField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intFreshsalesField/intFreshsalesField.rpc.js b/server/api/intFreshsalesField/intFreshsalesField.rpc.js
index f96a4e8..0706994 100644
--- a/server/api/intFreshsalesField/intFreshsalesField.rpc.js
+++ b/server/api/intFreshsalesField/intFreshsalesField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceAccount/index.js b/server/api/intSalesforceAccount/index.js
index adece16..ea867b2 100644
--- a/server/api/intSalesforceAccount/index.js
+++ b/server/api/intSalesforceAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceAccount/intSalesforceAccount.attributes.js b/server/api/intSalesforceAccount/intSalesforceAccount.attributes.js
index 112366b..a91a161 100644
--- a/server/api/intSalesforceAccount/intSalesforceAccount.attributes.js
+++ b/server/api/intSalesforceAccount/intSalesforceAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceAccount/intSalesforceAccount.controller.js b/server/api/intSalesforceAccount/intSalesforceAccount.controller.js
index 41c7963..2a5b947 100644
--- a/server/api/intSalesforceAccount/intSalesforceAccount.controller.js
+++ b/server/api/intSalesforceAccount/intSalesforceAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceAccount/intSalesforceAccount.model.js b/server/api/intSalesforceAccount/intSalesforceAccount.model.js
index 6cd4d33..68ccddf 100644
--- a/server/api/intSalesforceAccount/intSalesforceAccount.model.js
+++ b/server/api/intSalesforceAccount/intSalesforceAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceAccount/intSalesforceAccount.rpc.js b/server/api/intSalesforceAccount/intSalesforceAccount.rpc.js
index 1b99ca2..3bf0206 100644
--- a/server/api/intSalesforceAccount/intSalesforceAccount.rpc.js
+++ b/server/api/intSalesforceAccount/intSalesforceAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceConfiguration/index.js b/server/api/intSalesforceConfiguration/index.js
index f34fe69..11fef7d 100644
--- a/server/api/intSalesforceConfiguration/index.js
+++ b/server/api/intSalesforceConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.attributes.js b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.attributes.js
index 60ae4d8..679e627 100644
--- a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.attributes.js
+++ b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.controller.js b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.controller.js
index ba1be08..67c46dc 100644
--- a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.controller.js
+++ b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.model.js b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.model.js
index 93f6ff9..8cfdc39 100644
--- a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.model.js
+++ b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.rpc.js b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.rpc.js
index dd0bb44..bc918fc 100644
--- a/server/api/intSalesforceConfiguration/intSalesforceConfiguration.rpc.js
+++ b/server/api/intSalesforceConfiguration/intSalesforceConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceField/index.js b/server/api/intSalesforceField/index.js
index d7f10c8..13b6c90 100644
--- a/server/api/intSalesforceField/index.js
+++ b/server/api/intSalesforceField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceField/intSalesforceField.attributes.js b/server/api/intSalesforceField/intSalesforceField.attributes.js
index 18dcd75..8dfc313 100644
--- a/server/api/intSalesforceField/intSalesforceField.attributes.js
+++ b/server/api/intSalesforceField/intSalesforceField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceField/intSalesforceField.controller.js b/server/api/intSalesforceField/intSalesforceField.controller.js
index b641f7c..1a3bddd 100644
--- a/server/api/intSalesforceField/intSalesforceField.controller.js
+++ b/server/api/intSalesforceField/intSalesforceField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceField/intSalesforceField.model.js b/server/api/intSalesforceField/intSalesforceField.model.js
index 1e43bc7..2dd4fd7 100644
--- a/server/api/intSalesforceField/intSalesforceField.model.js
+++ b/server/api/intSalesforceField/intSalesforceField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSalesforceField/intSalesforceField.rpc.js b/server/api/intSalesforceField/intSalesforceField.rpc.js
index 98e1e5c..edce097 100644
--- a/server/api/intSalesforceField/intSalesforceField.rpc.js
+++ b/server/api/intSalesforceField/intSalesforceField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowAccount/index.js b/server/api/intServicenowAccount/index.js
index a20c88d..16d25c7 100644
--- a/server/api/intServicenowAccount/index.js
+++ b/server/api/intServicenowAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowAccount/intServicenowAccount.attributes.js b/server/api/intServicenowAccount/intServicenowAccount.attributes.js
index f3f5dcf..c66da16 100644
--- a/server/api/intServicenowAccount/intServicenowAccount.attributes.js
+++ b/server/api/intServicenowAccount/intServicenowAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowAccount/intServicenowAccount.controller.js b/server/api/intServicenowAccount/intServicenowAccount.controller.js
index 8f1c70b..2276a39 100644
--- a/server/api/intServicenowAccount/intServicenowAccount.controller.js
+++ b/server/api/intServicenowAccount/intServicenowAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowAccount/intServicenowAccount.model.js b/server/api/intServicenowAccount/intServicenowAccount.model.js
index 1f9bbbb..c3d8391 100644
--- a/server/api/intServicenowAccount/intServicenowAccount.model.js
+++ b/server/api/intServicenowAccount/intServicenowAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowAccount/intServicenowAccount.rpc.js b/server/api/intServicenowAccount/intServicenowAccount.rpc.js
index c104d12..3e65d35 100644
--- a/server/api/intServicenowAccount/intServicenowAccount.rpc.js
+++ b/server/api/intServicenowAccount/intServicenowAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowConfiguration/index.js b/server/api/intServicenowConfiguration/index.js
index 323cfcf..a18359b 100644
--- a/server/api/intServicenowConfiguration/index.js
+++ b/server/api/intServicenowConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowConfiguration/intServicenowConfiguration.attributes.js b/server/api/intServicenowConfiguration/intServicenowConfiguration.attributes.js
index 5c54d11..a688135 100644
--- a/server/api/intServicenowConfiguration/intServicenowConfiguration.attributes.js
+++ b/server/api/intServicenowConfiguration/intServicenowConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x2150=['exports','STRING','sequelize'];(function(_0x150f02,_0x54afb9){var _0x2eb8df=function(_0x1bdd16){while(--_0x1bdd16){_0x150f02['push'](_0x150f02['shift']());}};_0x2eb8df(++_0x54afb9);}(_0x2150,0xf2));var _0x0215=function(_0x5f002d,_0x1b9dc8){_0x5f002d=_0x5f002d-0x0;var _0x544598=_0x2150[_0x5f002d];return _0x544598;};'use strict';var Sequelize=require(_0x0215('0x0'));module[_0x0215('0x1')]={'name':{'type':Sequelize[_0x0215('0x2')]},'description':{'type':Sequelize[_0x0215('0x2')]}};
\ No newline at end of file
+'use strict';var Sequelize=require('sequelize');module['exports']={'name':{'type':Sequelize['STRING']},'description':{'type':Sequelize['STRING']}};
\ No newline at end of file
diff --git a/server/api/intServicenowConfiguration/intServicenowConfiguration.controller.js b/server/api/intServicenowConfiguration/intServicenowConfiguration.controller.js
index 129d76f..2f702be 100644
--- a/server/api/intServicenowConfiguration/intServicenowConfiguration.controller.js
+++ b/server/api/intServicenowConfiguration/intServicenowConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowConfiguration/intServicenowConfiguration.model.js b/server/api/intServicenowConfiguration/intServicenowConfiguration.model.js
index 1378f62..bfce0e2 100644
--- a/server/api/intServicenowConfiguration/intServicenowConfiguration.model.js
+++ b/server/api/intServicenowConfiguration/intServicenowConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowConfiguration/intServicenowConfiguration.rpc.js b/server/api/intServicenowConfiguration/intServicenowConfiguration.rpc.js
index 336c119..4f8f74b 100644
--- a/server/api/intServicenowConfiguration/intServicenowConfiguration.rpc.js
+++ b/server/api/intServicenowConfiguration/intServicenowConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowField/index.js b/server/api/intServicenowField/index.js
index b780eba..86992df 100644
--- a/server/api/intServicenowField/index.js
+++ b/server/api/intServicenowField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowField/intServicenowField.attributes.js b/server/api/intServicenowField/intServicenowField.attributes.js
index 09cdffc..527e77d 100644
--- a/server/api/intServicenowField/intServicenowField.attributes.js
+++ b/server/api/intServicenowField/intServicenowField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowField/intServicenowField.controller.js b/server/api/intServicenowField/intServicenowField.controller.js
index 2ecf2c1..68ed9d9 100644
--- a/server/api/intServicenowField/intServicenowField.controller.js
+++ b/server/api/intServicenowField/intServicenowField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowField/intServicenowField.model.js b/server/api/intServicenowField/intServicenowField.model.js
index 9a9d640..169944a 100644
--- a/server/api/intServicenowField/intServicenowField.model.js
+++ b/server/api/intServicenowField/intServicenowField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intServicenowField/intServicenowField.rpc.js b/server/api/intServicenowField/intServicenowField.rpc.js
index eaf1fd2..7ac237a 100644
--- a/server/api/intServicenowField/intServicenowField.rpc.js
+++ b/server/api/intServicenowField/intServicenowField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmAccount/index.js b/server/api/intSugarcrmAccount/index.js
index 0fbe9c4..bb14885 100644
--- a/server/api/intSugarcrmAccount/index.js
+++ b/server/api/intSugarcrmAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmAccount/intSugarcrmAccount.attributes.js b/server/api/intSugarcrmAccount/intSugarcrmAccount.attributes.js
index b3ac18f..6d229d9 100644
--- a/server/api/intSugarcrmAccount/intSugarcrmAccount.attributes.js
+++ b/server/api/intSugarcrmAccount/intSugarcrmAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmAccount/intSugarcrmAccount.controller.js b/server/api/intSugarcrmAccount/intSugarcrmAccount.controller.js
index bad8aa6..3b47702 100644
--- a/server/api/intSugarcrmAccount/intSugarcrmAccount.controller.js
+++ b/server/api/intSugarcrmAccount/intSugarcrmAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmAccount/intSugarcrmAccount.model.js b/server/api/intSugarcrmAccount/intSugarcrmAccount.model.js
index ae9165d..9e830f2 100644
--- a/server/api/intSugarcrmAccount/intSugarcrmAccount.model.js
+++ b/server/api/intSugarcrmAccount/intSugarcrmAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmAccount/intSugarcrmAccount.rpc.js b/server/api/intSugarcrmAccount/intSugarcrmAccount.rpc.js
index ae5aa1a..b63bdd6 100644
--- a/server/api/intSugarcrmAccount/intSugarcrmAccount.rpc.js
+++ b/server/api/intSugarcrmAccount/intSugarcrmAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmConfiguration/index.js b/server/api/intSugarcrmConfiguration/index.js
index 395cb02..60236b3 100644
--- a/server/api/intSugarcrmConfiguration/index.js
+++ b/server/api/intSugarcrmConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.attributes.js b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.attributes.js
index d09e8be..3f6ec5e 100644
--- a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.attributes.js
+++ b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x3461=['STRING','exports'];(function(_0x53199f,_0x1dac3a){var _0x1f9609=function(_0x452065){while(--_0x452065){_0x53199f['push'](_0x53199f['shift']());}};_0x1f9609(++_0x1dac3a);}(_0x3461,0x1b7));var _0x1346=function(_0x496623,_0x39258e){_0x496623=_0x496623-0x0;var _0xb8480=_0x3461[_0x496623];return _0xb8480;};'use strict';var Sequelize=require('sequelize');module[_0x1346('0x0')]={'name':{'type':Sequelize['STRING']},'description':{'type':Sequelize[_0x1346('0x1')]}};
\ No newline at end of file
+var _0x9e43=['exports','STRING','sequelize'];(function(_0x35c4bc,_0x3d70f4){var _0x5f0cc1=function(_0x3e83be){while(--_0x3e83be){_0x35c4bc['push'](_0x35c4bc['shift']());}};_0x5f0cc1(++_0x3d70f4);}(_0x9e43,0x1e5));var _0x39e4=function(_0x2f8125,_0x260435){_0x2f8125=_0x2f8125-0x0;var _0x332dfb=_0x9e43[_0x2f8125];return _0x332dfb;};'use strict';var Sequelize=require(_0x39e4('0x0'));module[_0x39e4('0x1')]={'name':{'type':Sequelize[_0x39e4('0x2')]},'description':{'type':Sequelize['STRING']}};
\ No newline at end of file
diff --git a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.controller.js b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.controller.js
index 7556644..7dbb462 100644
--- a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.controller.js
+++ b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.model.js b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.model.js
index 56fa822..34fae1c 100644
--- a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.model.js
+++ b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.rpc.js b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.rpc.js
index 4024cee..61f7cc8 100644
--- a/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.rpc.js
+++ b/server/api/intSugarcrmConfiguration/intSugarcrmConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmField/index.js b/server/api/intSugarcrmField/index.js
index 1f8a2fc..8165bec 100644
--- a/server/api/intSugarcrmField/index.js
+++ b/server/api/intSugarcrmField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmField/intSugarcrmField.attributes.js b/server/api/intSugarcrmField/intSugarcrmField.attributes.js
index 569de26..c31dfa3 100644
--- a/server/api/intSugarcrmField/intSugarcrmField.attributes.js
+++ b/server/api/intSugarcrmField/intSugarcrmField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmField/intSugarcrmField.controller.js b/server/api/intSugarcrmField/intSugarcrmField.controller.js
index 1854ed9..ccb71fc 100644
--- a/server/api/intSugarcrmField/intSugarcrmField.controller.js
+++ b/server/api/intSugarcrmField/intSugarcrmField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmField/intSugarcrmField.model.js b/server/api/intSugarcrmField/intSugarcrmField.model.js
index f36a182..92509ab 100644
--- a/server/api/intSugarcrmField/intSugarcrmField.model.js
+++ b/server/api/intSugarcrmField/intSugarcrmField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intSugarcrmField/intSugarcrmField.rpc.js b/server/api/intSugarcrmField/intSugarcrmField.rpc.js
index c491537..c6bfe64 100644
--- a/server/api/intSugarcrmField/intSugarcrmField.rpc.js
+++ b/server/api/intSugarcrmField/intSugarcrmField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerAccount/index.js b/server/api/intVtigerAccount/index.js
index 3f711b9..59b673b 100644
--- a/server/api/intVtigerAccount/index.js
+++ b/server/api/intVtigerAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerAccount/intVtigerAccount.attributes.js b/server/api/intVtigerAccount/intVtigerAccount.attributes.js
index 48159c1..177ee10 100644
--- a/server/api/intVtigerAccount/intVtigerAccount.attributes.js
+++ b/server/api/intVtigerAccount/intVtigerAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerAccount/intVtigerAccount.controller.js b/server/api/intVtigerAccount/intVtigerAccount.controller.js
index c9cb4fe..ab98008 100644
--- a/server/api/intVtigerAccount/intVtigerAccount.controller.js
+++ b/server/api/intVtigerAccount/intVtigerAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerAccount/intVtigerAccount.model.js b/server/api/intVtigerAccount/intVtigerAccount.model.js
index aa779f0..d8a843c 100644
--- a/server/api/intVtigerAccount/intVtigerAccount.model.js
+++ b/server/api/intVtigerAccount/intVtigerAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerAccount/intVtigerAccount.rpc.js b/server/api/intVtigerAccount/intVtigerAccount.rpc.js
index 428ec3e..316ee09 100644
--- a/server/api/intVtigerAccount/intVtigerAccount.rpc.js
+++ b/server/api/intVtigerAccount/intVtigerAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerConfiguration/index.js b/server/api/intVtigerConfiguration/index.js
index 90ae4b6..36e0f08 100644
--- a/server/api/intVtigerConfiguration/index.js
+++ b/server/api/intVtigerConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerConfiguration/intVtigerConfiguration.attributes.js b/server/api/intVtigerConfiguration/intVtigerConfiguration.attributes.js
index b712264..71362a3 100644
--- a/server/api/intVtigerConfiguration/intVtigerConfiguration.attributes.js
+++ b/server/api/intVtigerConfiguration/intVtigerConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x2932=['exports','STRING','sequelize'];(function(_0xdc37a1,_0x53ebb9){var _0x99b4fe=function(_0x2811e3){while(--_0x2811e3){_0xdc37a1['push'](_0xdc37a1['shift']());}};_0x99b4fe(++_0x53ebb9);}(_0x2932,0x1f1));var _0x2293=function(_0x18a4f7,_0x3f915c){_0x18a4f7=_0x18a4f7-0x0;var _0x368cf3=_0x2932[_0x18a4f7];return _0x368cf3;};'use strict';var Sequelize=require(_0x2293('0x0'));module[_0x2293('0x1')]={'name':{'type':Sequelize[_0x2293('0x2')]},'description':{'type':Sequelize[_0x2293('0x2')]}};
\ No newline at end of file
+var _0x8e90=['exports','STRING'];(function(_0x2a7a33,_0x2d3fa8){var _0x293883=function(_0x5e2585){while(--_0x5e2585){_0x2a7a33['push'](_0x2a7a33['shift']());}};_0x293883(++_0x2d3fa8);}(_0x8e90,0x124));var _0x08e9=function(_0x538c70,_0x35531f){_0x538c70=_0x538c70-0x0;var _0x42ae01=_0x8e90[_0x538c70];return _0x42ae01;};'use strict';var Sequelize=require('sequelize');module[_0x08e9('0x0')]={'name':{'type':Sequelize['STRING']},'description':{'type':Sequelize[_0x08e9('0x1')]}};
\ No newline at end of file
diff --git a/server/api/intVtigerConfiguration/intVtigerConfiguration.controller.js b/server/api/intVtigerConfiguration/intVtigerConfiguration.controller.js
index f530e5e..c87082b 100644
--- a/server/api/intVtigerConfiguration/intVtigerConfiguration.controller.js
+++ b/server/api/intVtigerConfiguration/intVtigerConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerConfiguration/intVtigerConfiguration.model.js b/server/api/intVtigerConfiguration/intVtigerConfiguration.model.js
index 55b560d..bb793ea 100644
--- a/server/api/intVtigerConfiguration/intVtigerConfiguration.model.js
+++ b/server/api/intVtigerConfiguration/intVtigerConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerConfiguration/intVtigerConfiguration.rpc.js b/server/api/intVtigerConfiguration/intVtigerConfiguration.rpc.js
index 368ef92..c8baa7f 100644
--- a/server/api/intVtigerConfiguration/intVtigerConfiguration.rpc.js
+++ b/server/api/intVtigerConfiguration/intVtigerConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerField/index.js b/server/api/intVtigerField/index.js
index 72c5d3e..c651bc2 100644
--- a/server/api/intVtigerField/index.js
+++ b/server/api/intVtigerField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerField/intVtigerField.attributes.js b/server/api/intVtigerField/intVtigerField.attributes.js
index 960ec59..3e32c67 100644
--- a/server/api/intVtigerField/intVtigerField.attributes.js
+++ b/server/api/intVtigerField/intVtigerField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerField/intVtigerField.controller.js b/server/api/intVtigerField/intVtigerField.controller.js
index ea981f8..face289 100644
--- a/server/api/intVtigerField/intVtigerField.controller.js
+++ b/server/api/intVtigerField/intVtigerField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerField/intVtigerField.model.js b/server/api/intVtigerField/intVtigerField.model.js
index 00605a3..cdabf8a 100644
--- a/server/api/intVtigerField/intVtigerField.model.js
+++ b/server/api/intVtigerField/intVtigerField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intVtigerField/intVtigerField.rpc.js b/server/api/intVtigerField/intVtigerField.rpc.js
index 1edd5eb..428eb9b 100644
--- a/server/api/intVtigerField/intVtigerField.rpc.js
+++ b/server/api/intVtigerField/intVtigerField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskAccount/index.js b/server/api/intZendeskAccount/index.js
index 2f98640..aef85b6 100644
--- a/server/api/intZendeskAccount/index.js
+++ b/server/api/intZendeskAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskAccount/intZendeskAccount.attributes.js b/server/api/intZendeskAccount/intZendeskAccount.attributes.js
index c9eadca..2f30a5f 100644
--- a/server/api/intZendeskAccount/intZendeskAccount.attributes.js
+++ b/server/api/intZendeskAccount/intZendeskAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskAccount/intZendeskAccount.controller.js b/server/api/intZendeskAccount/intZendeskAccount.controller.js
index ed0e9e2..e0a2432 100644
--- a/server/api/intZendeskAccount/intZendeskAccount.controller.js
+++ b/server/api/intZendeskAccount/intZendeskAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskAccount/intZendeskAccount.model.js b/server/api/intZendeskAccount/intZendeskAccount.model.js
index 544d672..8827875 100644
--- a/server/api/intZendeskAccount/intZendeskAccount.model.js
+++ b/server/api/intZendeskAccount/intZendeskAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskAccount/intZendeskAccount.rpc.js b/server/api/intZendeskAccount/intZendeskAccount.rpc.js
index 9d3b220..09921af 100644
--- a/server/api/intZendeskAccount/intZendeskAccount.rpc.js
+++ b/server/api/intZendeskAccount/intZendeskAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskConfiguration/index.js b/server/api/intZendeskConfiguration/index.js
index ab96569..83361a3 100644
--- a/server/api/intZendeskConfiguration/index.js
+++ b/server/api/intZendeskConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskConfiguration/intZendeskConfiguration.attributes.js b/server/api/intZendeskConfiguration/intZendeskConfiguration.attributes.js
index 0037da5..62e275a 100644
--- a/server/api/intZendeskConfiguration/intZendeskConfiguration.attributes.js
+++ b/server/api/intZendeskConfiguration/intZendeskConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xfa18=['exports','STRING'];(function(_0x1e02a7,_0x4d8558){var _0x5db9f6=function(_0x571bf9){while(--_0x571bf9){_0x1e02a7['push'](_0x1e02a7['shift']());}};_0x5db9f6(++_0x4d8558);}(_0xfa18,0x1e2));var _0x8fa1=function(_0x26b403,_0x447cfa){_0x26b403=_0x26b403-0x0;var _0x28c380=_0xfa18[_0x26b403];return _0x28c380;};'use strict';var Sequelize=require('sequelize');module[_0x8fa1('0x0')]={'name':{'type':Sequelize[_0x8fa1('0x1')]},'description':{'type':Sequelize[_0x8fa1('0x1')]}};
\ No newline at end of file
+var _0xb25e=['sequelize'];(function(_0x466c53,_0x934621){var _0x120897=function(_0x311257){while(--_0x311257){_0x466c53['push'](_0x466c53['shift']());}};_0x120897(++_0x934621);}(_0xb25e,0x99));var _0xeb25=function(_0x4da769,_0x58f474){_0x4da769=_0x4da769-0x0;var _0x2b343b=_0xb25e[_0x4da769];return _0x2b343b;};'use strict';var Sequelize=require(_0xeb25('0x0'));module['exports']={'name':{'type':Sequelize['STRING']},'description':{'type':Sequelize['STRING']}};
\ No newline at end of file
diff --git a/server/api/intZendeskConfiguration/intZendeskConfiguration.controller.js b/server/api/intZendeskConfiguration/intZendeskConfiguration.controller.js
index 0f9253b..7ab4309 100644
--- a/server/api/intZendeskConfiguration/intZendeskConfiguration.controller.js
+++ b/server/api/intZendeskConfiguration/intZendeskConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskConfiguration/intZendeskConfiguration.model.js b/server/api/intZendeskConfiguration/intZendeskConfiguration.model.js
index 1456891..d0c6300 100644
--- a/server/api/intZendeskConfiguration/intZendeskConfiguration.model.js
+++ b/server/api/intZendeskConfiguration/intZendeskConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskConfiguration/intZendeskConfiguration.rpc.js b/server/api/intZendeskConfiguration/intZendeskConfiguration.rpc.js
index b8b52bd..fccc2d1 100644
--- a/server/api/intZendeskConfiguration/intZendeskConfiguration.rpc.js
+++ b/server/api/intZendeskConfiguration/intZendeskConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskField/index.js b/server/api/intZendeskField/index.js
index 339834a..ecf812e 100644
--- a/server/api/intZendeskField/index.js
+++ b/server/api/intZendeskField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskField/intZendeskField.attributes.js b/server/api/intZendeskField/intZendeskField.attributes.js
index 57383fa..b3e9962 100644
--- a/server/api/intZendeskField/intZendeskField.attributes.js
+++ b/server/api/intZendeskField/intZendeskField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskField/intZendeskField.controller.js b/server/api/intZendeskField/intZendeskField.controller.js
index 828c55b..6568a37 100644
--- a/server/api/intZendeskField/intZendeskField.controller.js
+++ b/server/api/intZendeskField/intZendeskField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskField/intZendeskField.model.js b/server/api/intZendeskField/intZendeskField.model.js
index 0b8a0fc..dd6bf80 100644
--- a/server/api/intZendeskField/intZendeskField.model.js
+++ b/server/api/intZendeskField/intZendeskField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZendeskField/intZendeskField.rpc.js b/server/api/intZendeskField/intZendeskField.rpc.js
index f238614..838a786 100644
--- a/server/api/intZendeskField/intZendeskField.rpc.js
+++ b/server/api/intZendeskField/intZendeskField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoAccount/index.js b/server/api/intZohoAccount/index.js
index 55b4183..6300c65 100644
--- a/server/api/intZohoAccount/index.js
+++ b/server/api/intZohoAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoAccount/intZohoAccount.attributes.js b/server/api/intZohoAccount/intZohoAccount.attributes.js
index cd05a01..9a766ee 100644
--- a/server/api/intZohoAccount/intZohoAccount.attributes.js
+++ b/server/api/intZohoAccount/intZohoAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoAccount/intZohoAccount.controller.js b/server/api/intZohoAccount/intZohoAccount.controller.js
index 1167165..5b2dcf3 100644
--- a/server/api/intZohoAccount/intZohoAccount.controller.js
+++ b/server/api/intZohoAccount/intZohoAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoAccount/intZohoAccount.model.js b/server/api/intZohoAccount/intZohoAccount.model.js
index e10af3c..100226e 100644
--- a/server/api/intZohoAccount/intZohoAccount.model.js
+++ b/server/api/intZohoAccount/intZohoAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoAccount/intZohoAccount.rpc.js b/server/api/intZohoAccount/intZohoAccount.rpc.js
index a0b9670..7d9532e 100644
--- a/server/api/intZohoAccount/intZohoAccount.rpc.js
+++ b/server/api/intZohoAccount/intZohoAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoConfiguration/index.js b/server/api/intZohoConfiguration/index.js
index f2efb89..b4e312a 100644
--- a/server/api/intZohoConfiguration/index.js
+++ b/server/api/intZohoConfiguration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoConfiguration/intZohoConfiguration.attributes.js b/server/api/intZohoConfiguration/intZohoConfiguration.attributes.js
index 5d89821..5c12829 100644
--- a/server/api/intZohoConfiguration/intZohoConfiguration.attributes.js
+++ b/server/api/intZohoConfiguration/intZohoConfiguration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoConfiguration/intZohoConfiguration.controller.js b/server/api/intZohoConfiguration/intZohoConfiguration.controller.js
index 7d310ee..b63a468 100644
--- a/server/api/intZohoConfiguration/intZohoConfiguration.controller.js
+++ b/server/api/intZohoConfiguration/intZohoConfiguration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoConfiguration/intZohoConfiguration.model.js b/server/api/intZohoConfiguration/intZohoConfiguration.model.js
index ebe1b18..aa2877f 100644
--- a/server/api/intZohoConfiguration/intZohoConfiguration.model.js
+++ b/server/api/intZohoConfiguration/intZohoConfiguration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoConfiguration/intZohoConfiguration.rpc.js b/server/api/intZohoConfiguration/intZohoConfiguration.rpc.js
index 96bdac9..9ff4348 100644
--- a/server/api/intZohoConfiguration/intZohoConfiguration.rpc.js
+++ b/server/api/intZohoConfiguration/intZohoConfiguration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoField/index.js b/server/api/intZohoField/index.js
index aacdde6..5dc8f9a 100644
--- a/server/api/intZohoField/index.js
+++ b/server/api/intZohoField/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoField/intZohoField.attributes.js b/server/api/intZohoField/intZohoField.attributes.js
index e64df15..d0a8bd8 100644
--- a/server/api/intZohoField/intZohoField.attributes.js
+++ b/server/api/intZohoField/intZohoField.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoField/intZohoField.controller.js b/server/api/intZohoField/intZohoField.controller.js
index 8a7bea4..f27d412 100644
--- a/server/api/intZohoField/intZohoField.controller.js
+++ b/server/api/intZohoField/intZohoField.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoField/intZohoField.model.js b/server/api/intZohoField/intZohoField.model.js
index ccd0c95..b668249 100644
--- a/server/api/intZohoField/intZohoField.model.js
+++ b/server/api/intZohoField/intZohoField.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/intZohoField/intZohoField.rpc.js b/server/api/intZohoField/intZohoField.rpc.js
index f5f55c1..d5aabae 100644
--- a/server/api/intZohoField/intZohoField.rpc.js
+++ b/server/api/intZohoField/intZohoField.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integration/index.js b/server/api/integration/index.js
index 3de8044..9b67264 100644
--- a/server/api/integration/index.js
+++ b/server/api/integration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integration/integration.attributes.js b/server/api/integration/integration.attributes.js
index 4083465..6792d83 100644
--- a/server/api/integration/integration.attributes.js
+++ b/server/api/integration/integration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integration/integration.controller.js b/server/api/integration/integration.controller.js
index 027dfd7..496f9a2 100644
--- a/server/api/integration/integration.controller.js
+++ b/server/api/integration/integration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integration/integration.model.js b/server/api/integration/integration.model.js
index 660059f..507603c 100644
--- a/server/api/integration/integration.model.js
+++ b/server/api/integration/integration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integration/integration.rpc.js b/server/api/integration/integration.rpc.js
index 78a8f25..9a74c7d 100644
--- a/server/api/integration/integration.rpc.js
+++ b/server/api/integration/integration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integrationReport/index.js b/server/api/integrationReport/index.js
index 542381b..e4d69c0 100644
--- a/server/api/integrationReport/index.js
+++ b/server/api/integrationReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integrationReport/integrationReport.attributes.js b/server/api/integrationReport/integrationReport.attributes.js
index df1429d..790d2cc 100644
--- a/server/api/integrationReport/integrationReport.attributes.js
+++ b/server/api/integrationReport/integrationReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integrationReport/integrationReport.controller.js b/server/api/integrationReport/integrationReport.controller.js
index 5c3f723..01acb0c 100644
--- a/server/api/integrationReport/integrationReport.controller.js
+++ b/server/api/integrationReport/integrationReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integrationReport/integrationReport.model.js b/server/api/integrationReport/integrationReport.model.js
index f46dcd2..709cffe 100644
--- a/server/api/integrationReport/integrationReport.model.js
+++ b/server/api/integrationReport/integrationReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/integrationReport/integrationReport.rpc.js b/server/api/integrationReport/integrationReport.rpc.js
index 983f7d0..1046d0c 100644
--- a/server/api/integrationReport/integrationReport.rpc.js
+++ b/server/api/integrationReport/integrationReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/interval/index.js b/server/api/interval/index.js
index 0e4ab89..76a1c8d 100644
--- a/server/api/interval/index.js
+++ b/server/api/interval/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/interval/interval.attributes.js b/server/api/interval/interval.attributes.js
index 1cc4bc9..2d072a6 100644
--- a/server/api/interval/interval.attributes.js
+++ b/server/api/interval/interval.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/interval/interval.controller.js b/server/api/interval/interval.controller.js
index e7d53f0..38d9725 100644
--- a/server/api/interval/interval.controller.js
+++ b/server/api/interval/interval.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/interval/interval.model.js b/server/api/interval/interval.model.js
index 7aee18f..1dbc19c 100644
--- a/server/api/interval/interval.model.js
+++ b/server/api/interval/interval.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/interval/interval.rpc.js b/server/api/interval/interval.rpc.js
index 0ab3884..8a3a83d 100644
--- a/server/api/interval/interval.rpc.js
+++ b/server/api/interval/interval.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jira/index.js b/server/api/jira/index.js
index 5872dfc..fa3efb0 100644
--- a/server/api/jira/index.js
+++ b/server/api/jira/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jira/jira.controller.js b/server/api/jira/jira.controller.js
index 69bd5cd..88dd210 100644
--- a/server/api/jira/jira.controller.js
+++ b/server/api/jira/jira.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyAnswerReport/index.js b/server/api/jscriptyAnswerReport/index.js
index 1b01fce..978c4bc 100644
--- a/server/api/jscriptyAnswerReport/index.js
+++ b/server/api/jscriptyAnswerReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.attributes.js b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.attributes.js
index c60cc8b..2b612a1 100644
--- a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.attributes.js
+++ b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.controller.js b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.controller.js
index 01f3a69..c677285 100644
--- a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.controller.js
+++ b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.model.js b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.model.js
index fd97fbe..0d8b637 100644
--- a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.model.js
+++ b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.rpc.js b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.rpc.js
index c2542ca..3f3e4bf 100644
--- a/server/api/jscriptyAnswerReport/jscriptyAnswerReport.rpc.js
+++ b/server/api/jscriptyAnswerReport/jscriptyAnswerReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyProject/index.js b/server/api/jscriptyProject/index.js
index 3e34447..2a4b114 100644
--- a/server/api/jscriptyProject/index.js
+++ b/server/api/jscriptyProject/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyProject/jscriptyProject.attributes.js b/server/api/jscriptyProject/jscriptyProject.attributes.js
index 823a903..009aba4 100644
--- a/server/api/jscriptyProject/jscriptyProject.attributes.js
+++ b/server/api/jscriptyProject/jscriptyProject.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyProject/jscriptyProject.controller.js b/server/api/jscriptyProject/jscriptyProject.controller.js
index b09da6d..27f6594 100644
--- a/server/api/jscriptyProject/jscriptyProject.controller.js
+++ b/server/api/jscriptyProject/jscriptyProject.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyProject/jscriptyProject.model.js b/server/api/jscriptyProject/jscriptyProject.model.js
index 6483e4f..16920b4 100644
--- a/server/api/jscriptyProject/jscriptyProject.model.js
+++ b/server/api/jscriptyProject/jscriptyProject.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyProject/jscriptyProject.rpc.js b/server/api/jscriptyProject/jscriptyProject.rpc.js
index 0f4f685..3f0e7fc 100644
--- a/server/api/jscriptyProject/jscriptyProject.rpc.js
+++ b/server/api/jscriptyProject/jscriptyProject.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyQuestionReport/index.js b/server/api/jscriptyQuestionReport/index.js
index db49979..439ccb8 100644
--- a/server/api/jscriptyQuestionReport/index.js
+++ b/server/api/jscriptyQuestionReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.attributes.js b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.attributes.js
index f1aebe1..090562e 100644
--- a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.attributes.js
+++ b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.controller.js b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.controller.js
index 9a99f71..305e6d6 100644
--- a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.controller.js
+++ b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.model.js b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.model.js
index 2954143..5be697d 100644
--- a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.model.js
+++ b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.rpc.js b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.rpc.js
index 31aeec5..67f736a 100644
--- a/server/api/jscriptyQuestionReport/jscriptyQuestionReport.rpc.js
+++ b/server/api/jscriptyQuestionReport/jscriptyQuestionReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptySessionReport/index.js b/server/api/jscriptySessionReport/index.js
index 29c1d57..9cf8066 100644
--- a/server/api/jscriptySessionReport/index.js
+++ b/server/api/jscriptySessionReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptySessionReport/jscriptySessionReport.attributes.js b/server/api/jscriptySessionReport/jscriptySessionReport.attributes.js
index 73e7630..0d1c9f6 100644
--- a/server/api/jscriptySessionReport/jscriptySessionReport.attributes.js
+++ b/server/api/jscriptySessionReport/jscriptySessionReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptySessionReport/jscriptySessionReport.controller.js b/server/api/jscriptySessionReport/jscriptySessionReport.controller.js
index 884c4d6..b8ad149 100644
--- a/server/api/jscriptySessionReport/jscriptySessionReport.controller.js
+++ b/server/api/jscriptySessionReport/jscriptySessionReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptySessionReport/jscriptySessionReport.model.js b/server/api/jscriptySessionReport/jscriptySessionReport.model.js
index 424c745..a5b33be 100644
--- a/server/api/jscriptySessionReport/jscriptySessionReport.model.js
+++ b/server/api/jscriptySessionReport/jscriptySessionReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/jscriptySessionReport/jscriptySessionReport.rpc.js b/server/api/jscriptySessionReport/jscriptySessionReport.rpc.js
index ea8935e..1f3eb32 100644
--- a/server/api/jscriptySessionReport/jscriptySessionReport.rpc.js
+++ b/server/api/jscriptySessionReport/jscriptySessionReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/license/index.js b/server/api/license/index.js
index 7fe969e..8dc84b8 100644
--- a/server/api/license/index.js
+++ b/server/api/license/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/license/license.attributes.js b/server/api/license/license.attributes.js
index 3b95933..529da73 100644
--- a/server/api/license/license.attributes.js
+++ b/server/api/license/license.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/license/license.controller.js b/server/api/license/license.controller.js
index c26fd06..c9206ef 100644
--- a/server/api/license/license.controller.js
+++ b/server/api/license/license.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/license/license.model.js b/server/api/license/license.model.js
index 426041c..11ef09c 100644
--- a/server/api/license/license.model.js
+++ b/server/api/license/license.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/license/license.rpc.js b/server/api/license/license.rpc.js
index 0f74488..3467a45 100644
--- a/server/api/license/license.rpc.js
+++ b/server/api/license/license.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/index.js b/server/api/mailAccount/index.js
index 717015f..339b06c 100644
--- a/server/api/mailAccount/index.js
+++ b/server/api/mailAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.attributes.js b/server/api/mailAccount/mailAccount.attributes.js
index fcc8d29..ced63c7 100644
--- a/server/api/mailAccount/mailAccount.attributes.js
+++ b/server/api/mailAccount/mailAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.controller.js b/server/api/mailAccount/mailAccount.controller.js
index 562f77a..4e18cd0 100644
--- a/server/api/mailAccount/mailAccount.controller.js
+++ b/server/api/mailAccount/mailAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.events.js b/server/api/mailAccount/mailAccount.events.js
index c853007..de157e8 100644
--- a/server/api/mailAccount/mailAccount.events.js
+++ b/server/api/mailAccount/mailAccount.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.model.js b/server/api/mailAccount/mailAccount.model.js
index 11560d1..60b54d4 100644
--- a/server/api/mailAccount/mailAccount.model.js
+++ b/server/api/mailAccount/mailAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.rpc.js b/server/api/mailAccount/mailAccount.rpc.js
index c463705..9033265 100644
--- a/server/api/mailAccount/mailAccount.rpc.js
+++ b/server/api/mailAccount/mailAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailAccount/mailAccount.socket.js b/server/api/mailAccount/mailAccount.socket.js
index 1a0325f..287d76a 100644
--- a/server/api/mailAccount/mailAccount.socket.js
+++ b/server/api/mailAccount/mailAccount.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailApplication/index.js b/server/api/mailApplication/index.js
index 09eec18..0f22483 100644
--- a/server/api/mailApplication/index.js
+++ b/server/api/mailApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailApplication/mailApplication.attributes.js b/server/api/mailApplication/mailApplication.attributes.js
index ad8c0d3..7825b36 100644
--- a/server/api/mailApplication/mailApplication.attributes.js
+++ b/server/api/mailApplication/mailApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailApplication/mailApplication.controller.js b/server/api/mailApplication/mailApplication.controller.js
index 5394f14..221c589 100644
--- a/server/api/mailApplication/mailApplication.controller.js
+++ b/server/api/mailApplication/mailApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailApplication/mailApplication.model.js b/server/api/mailApplication/mailApplication.model.js
index e422110..786cf3a 100644
--- a/server/api/mailApplication/mailApplication.model.js
+++ b/server/api/mailApplication/mailApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailApplication/mailApplication.rpc.js b/server/api/mailApplication/mailApplication.rpc.js
index d646bfb..0c7a67e 100644
--- a/server/api/mailApplication/mailApplication.rpc.js
+++ b/server/api/mailApplication/mailApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/index.js b/server/api/mailInteraction/index.js
index 083be6f..c6800ed 100644
--- a/server/api/mailInteraction/index.js
+++ b/server/api/mailInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.attributes.js b/server/api/mailInteraction/mailInteraction.attributes.js
index f48ec0b..54ffea8 100644
--- a/server/api/mailInteraction/mailInteraction.attributes.js
+++ b/server/api/mailInteraction/mailInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.controller.js b/server/api/mailInteraction/mailInteraction.controller.js
index b25703e..ea4628f 100644
--- a/server/api/mailInteraction/mailInteraction.controller.js
+++ b/server/api/mailInteraction/mailInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.events.js b/server/api/mailInteraction/mailInteraction.events.js
index c9954d0..542bb4a 100644
--- a/server/api/mailInteraction/mailInteraction.events.js
+++ b/server/api/mailInteraction/mailInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.model.js b/server/api/mailInteraction/mailInteraction.model.js
index 7799433..401e073 100644
--- a/server/api/mailInteraction/mailInteraction.model.js
+++ b/server/api/mailInteraction/mailInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.rpc.js b/server/api/mailInteraction/mailInteraction.rpc.js
index ca2c4a4..54b867c 100644
--- a/server/api/mailInteraction/mailInteraction.rpc.js
+++ b/server/api/mailInteraction/mailInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailInteraction/mailInteraction.socket.js b/server/api/mailInteraction/mailInteraction.socket.js
index 4b76fdf..7af3ac8 100644
--- a/server/api/mailInteraction/mailInteraction.socket.js
+++ b/server/api/mailInteraction/mailInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/index.js b/server/api/mailMessage/index.js
index e82f078..011539f 100644
--- a/server/api/mailMessage/index.js
+++ b/server/api/mailMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.attributes.js b/server/api/mailMessage/mailMessage.attributes.js
index e8404d2..38cc453 100644
--- a/server/api/mailMessage/mailMessage.attributes.js
+++ b/server/api/mailMessage/mailMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.controller.js b/server/api/mailMessage/mailMessage.controller.js
index 0f0855e..fe9a3fc 100644
--- a/server/api/mailMessage/mailMessage.controller.js
+++ b/server/api/mailMessage/mailMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.events.js b/server/api/mailMessage/mailMessage.events.js
index 341ed39..c681b1f 100644
--- a/server/api/mailMessage/mailMessage.events.js
+++ b/server/api/mailMessage/mailMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.model.js b/server/api/mailMessage/mailMessage.model.js
index 621eccd..6bdaae4 100644
--- a/server/api/mailMessage/mailMessage.model.js
+++ b/server/api/mailMessage/mailMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.rpc.js b/server/api/mailMessage/mailMessage.rpc.js
index 16edd88..6961253 100644
--- a/server/api/mailMessage/mailMessage.rpc.js
+++ b/server/api/mailMessage/mailMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailMessage/mailMessage.socket.js b/server/api/mailMessage/mailMessage.socket.js
index 695a9b5..d8b5d00 100644
--- a/server/api/mailMessage/mailMessage.socket.js
+++ b/server/api/mailMessage/mailMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/index.js b/server/api/mailQueue/index.js
index b2ab437..9f74315 100644
--- a/server/api/mailQueue/index.js
+++ b/server/api/mailQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.attributes.js b/server/api/mailQueue/mailQueue.attributes.js
index cdfa3f5..9257cb3 100644
--- a/server/api/mailQueue/mailQueue.attributes.js
+++ b/server/api/mailQueue/mailQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.controller.js b/server/api/mailQueue/mailQueue.controller.js
index 97519f8..df3459a 100644
--- a/server/api/mailQueue/mailQueue.controller.js
+++ b/server/api/mailQueue/mailQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.events.js b/server/api/mailQueue/mailQueue.events.js
index a627adf..028dab3 100644
--- a/server/api/mailQueue/mailQueue.events.js
+++ b/server/api/mailQueue/mailQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.model.js b/server/api/mailQueue/mailQueue.model.js
index 47ddbe9..7bbb91f 100644
--- a/server/api/mailQueue/mailQueue.model.js
+++ b/server/api/mailQueue/mailQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.rpc.js b/server/api/mailQueue/mailQueue.rpc.js
index d698a19..7e1699c 100644
--- a/server/api/mailQueue/mailQueue.rpc.js
+++ b/server/api/mailQueue/mailQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueue/mailQueue.socket.js b/server/api/mailQueue/mailQueue.socket.js
index ac02201..9e90bc7 100644
--- a/server/api/mailQueue/mailQueue.socket.js
+++ b/server/api/mailQueue/mailQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueueReport/index.js b/server/api/mailQueueReport/index.js
index e449878..9d8b6a2 100644
--- a/server/api/mailQueueReport/index.js
+++ b/server/api/mailQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueueReport/mailQueueReport.attributes.js b/server/api/mailQueueReport/mailQueueReport.attributes.js
index 5532c63..511dbb3 100644
--- a/server/api/mailQueueReport/mailQueueReport.attributes.js
+++ b/server/api/mailQueueReport/mailQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueueReport/mailQueueReport.controller.js b/server/api/mailQueueReport/mailQueueReport.controller.js
index 06d2943..0ee8227 100644
--- a/server/api/mailQueueReport/mailQueueReport.controller.js
+++ b/server/api/mailQueueReport/mailQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueueReport/mailQueueReport.model.js b/server/api/mailQueueReport/mailQueueReport.model.js
index 7ee95aa..b070470 100644
--- a/server/api/mailQueueReport/mailQueueReport.model.js
+++ b/server/api/mailQueueReport/mailQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailQueueReport/mailQueueReport.rpc.js b/server/api/mailQueueReport/mailQueueReport.rpc.js
index a1095c6..60eff58 100644
--- a/server/api/mailQueueReport/mailQueueReport.rpc.js
+++ b/server/api/mailQueueReport/mailQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerIn/index.js b/server/api/mailServerIn/index.js
index b2cf4b6..3bfab3f 100644
--- a/server/api/mailServerIn/index.js
+++ b/server/api/mailServerIn/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerIn/mailServerIn.attributes.js b/server/api/mailServerIn/mailServerIn.attributes.js
index 7f9b0ec..df2d683 100644
--- a/server/api/mailServerIn/mailServerIn.attributes.js
+++ b/server/api/mailServerIn/mailServerIn.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerIn/mailServerIn.model.js b/server/api/mailServerIn/mailServerIn.model.js
index 5efbab5..58580e0 100644
--- a/server/api/mailServerIn/mailServerIn.model.js
+++ b/server/api/mailServerIn/mailServerIn.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerIn/mailServerIn.rpc.js b/server/api/mailServerIn/mailServerIn.rpc.js
index dc996af..e1e555b 100644
--- a/server/api/mailServerIn/mailServerIn.rpc.js
+++ b/server/api/mailServerIn/mailServerIn.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerOut/index.js b/server/api/mailServerOut/index.js
index 0a136ad..d417061 100644
--- a/server/api/mailServerOut/index.js
+++ b/server/api/mailServerOut/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerOut/mailServerOut.attributes.js b/server/api/mailServerOut/mailServerOut.attributes.js
index c5f9b8f..43167aa 100644
--- a/server/api/mailServerOut/mailServerOut.attributes.js
+++ b/server/api/mailServerOut/mailServerOut.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerOut/mailServerOut.controller.js b/server/api/mailServerOut/mailServerOut.controller.js
index 8db108f..8ad2a97 100644
--- a/server/api/mailServerOut/mailServerOut.controller.js
+++ b/server/api/mailServerOut/mailServerOut.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerOut/mailServerOut.model.js b/server/api/mailServerOut/mailServerOut.model.js
index 83abee7..03fc23a 100644
--- a/server/api/mailServerOut/mailServerOut.model.js
+++ b/server/api/mailServerOut/mailServerOut.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailServerOut/mailServerOut.rpc.js b/server/api/mailServerOut/mailServerOut.rpc.js
index 99bcb05..1a7c674 100644
--- a/server/api/mailServerOut/mailServerOut.rpc.js
+++ b/server/api/mailServerOut/mailServerOut.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailSubstatus/index.js b/server/api/mailSubstatus/index.js
index e9f0d3d..00d2acb 100644
--- a/server/api/mailSubstatus/index.js
+++ b/server/api/mailSubstatus/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailSubstatus/mailSubstatus.attributes.js b/server/api/mailSubstatus/mailSubstatus.attributes.js
index 19afcd3..6743623 100644
--- a/server/api/mailSubstatus/mailSubstatus.attributes.js
+++ b/server/api/mailSubstatus/mailSubstatus.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailSubstatus/mailSubstatus.controller.js b/server/api/mailSubstatus/mailSubstatus.controller.js
index b22a7d8..d1d37d9 100644
--- a/server/api/mailSubstatus/mailSubstatus.controller.js
+++ b/server/api/mailSubstatus/mailSubstatus.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.model.js b/server/api/mailSubstatus/mailSubstatus.events.js
similarity index 56%
rename from server/api/cmContactHasItem/cmContactHasItem.model.js
rename to server/api/mailSubstatus/mailSubstatus.events.js
index 50bbca7..3d7474a 100644
--- a/server/api/cmContactHasItem/cmContactHasItem.model.js
+++ b/server/api/mailSubstatus/mailSubstatus.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailSubstatus/mailSubstatus.model.js b/server/api/mailSubstatus/mailSubstatus.model.js
index bf39509..336e5d5 100644
--- a/server/api/mailSubstatus/mailSubstatus.model.js
+++ b/server/api/mailSubstatus/mailSubstatus.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailSubstatus/mailSubstatus.rpc.js b/server/api/mailSubstatus/mailSubstatus.rpc.js
index 5dc3bb1..2b6ae7f 100644
--- a/server/api/mailSubstatus/mailSubstatus.rpc.js
+++ b/server/api/mailSubstatus/mailSubstatus.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailTransferReport/index.js b/server/api/mailTransferReport/index.js
index 919cac7..aeff13a 100644
--- a/server/api/mailTransferReport/index.js
+++ b/server/api/mailTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailTransferReport/mailTransferReport.attributes.js b/server/api/mailTransferReport/mailTransferReport.attributes.js
index af020cf..93039c1 100644
--- a/server/api/mailTransferReport/mailTransferReport.attributes.js
+++ b/server/api/mailTransferReport/mailTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailTransferReport/mailTransferReport.controller.js b/server/api/mailTransferReport/mailTransferReport.controller.js
index 2c01935..17b2005 100644
--- a/server/api/mailTransferReport/mailTransferReport.controller.js
+++ b/server/api/mailTransferReport/mailTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailTransferReport/mailTransferReport.model.js b/server/api/mailTransferReport/mailTransferReport.model.js
index 9f5eab7..208785d 100644
--- a/server/api/mailTransferReport/mailTransferReport.model.js
+++ b/server/api/mailTransferReport/mailTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/mailTransferReport/mailTransferReport.rpc.js b/server/api/mailTransferReport/mailTransferReport.rpc.js
index d370e2f..1e26078 100644
--- a/server/api/mailTransferReport/mailTransferReport.rpc.js
+++ b/server/api/mailTransferReport/mailTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/memberReport/index.js b/server/api/memberReport/index.js
index e263d23..08ad7c9 100644
--- a/server/api/memberReport/index.js
+++ b/server/api/memberReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/memberReport/memberReport.attributes.js b/server/api/memberReport/memberReport.attributes.js
index 4459f80..ee13a06 100644
--- a/server/api/memberReport/memberReport.attributes.js
+++ b/server/api/memberReport/memberReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/memberReport/memberReport.controller.js b/server/api/memberReport/memberReport.controller.js
index f03cd0b..7f6d926 100644
--- a/server/api/memberReport/memberReport.controller.js
+++ b/server/api/memberReport/memberReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/memberReport/memberReport.model.js b/server/api/memberReport/memberReport.model.js
index db71b2e..caf0114 100644
--- a/server/api/memberReport/memberReport.model.js
+++ b/server/api/memberReport/memberReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/memberReport/memberReport.rpc.js b/server/api/memberReport/memberReport.rpc.js
index be0086d..49a8655 100644
--- a/server/api/memberReport/memberReport.rpc.js
+++ b/server/api/memberReport/memberReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/migration/index.js b/server/api/migration/index.js
index 79ffb43..fb98471 100644
--- a/server/api/migration/index.js
+++ b/server/api/migration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/migration/migration.attributes.js b/server/api/migration/migration.attributes.js
index 3dc5156..741cda7 100644
--- a/server/api/migration/migration.attributes.js
+++ b/server/api/migration/migration.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x2de8=['sequelize','STRING','version'];(function(_0x2fb800,_0x28c837){var _0xb2116e=function(_0x5cfec0){while(--_0x5cfec0){_0x2fb800['push'](_0x2fb800['shift']());}};_0xb2116e(++_0x28c837);}(_0x2de8,0x105));var _0x82de=function(_0x1cee06,_0x16b02f){_0x1cee06=_0x1cee06-0x0;var _0x42193b=_0x2de8[_0x1cee06];return _0x42193b;};'use strict';var Sequelize=require(_0x82de('0x0'));module['exports']={'version':{'type':Sequelize[_0x82de('0x1')],'unique':_0x82de('0x2')}};
\ No newline at end of file
+var _0x28d7=['STRING','sequelize'];(function(_0x2ca2d3,_0x68a055){var _0x59f2fe=function(_0x2eb9a9){while(--_0x2eb9a9){_0x2ca2d3['push'](_0x2ca2d3['shift']());}};_0x59f2fe(++_0x68a055);}(_0x28d7,0xd7));var _0x728d=function(_0x3dd15e,_0x1f0015){_0x3dd15e=_0x3dd15e-0x0;var _0x231fd0=_0x28d7[_0x3dd15e];return _0x231fd0;};'use strict';var Sequelize=require(_0x728d('0x0'));module['exports']={'version':{'type':Sequelize[_0x728d('0x1')],'unique':'version'}};
\ No newline at end of file
diff --git a/server/api/migration/migration.controller.js b/server/api/migration/migration.controller.js
index 75df6ac..a15efb7 100644
--- a/server/api/migration/migration.controller.js
+++ b/server/api/migration/migration.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/migration/migration.model.js b/server/api/migration/migration.model.js
index 83654e4..21b36da 100644
--- a/server/api/migration/migration.model.js
+++ b/server/api/migration/migration.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/migration/migration.rpc.js b/server/api/migration/migration.rpc.js
index 0ab7cfb..5800605 100644
--- a/server/api/migration/migration.rpc.js
+++ b/server/api/migration/migration.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/network/index.js b/server/api/network/index.js
index 65c8be2..3787c31 100644
--- a/server/api/network/index.js
+++ b/server/api/network/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/network/network.attributes.js b/server/api/network/network.attributes.js
index da1f35b..d90703f 100644
--- a/server/api/network/network.attributes.js
+++ b/server/api/network/network.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/network/network.controller.js b/server/api/network/network.controller.js
index 2607b68..bbd3c60 100644
--- a/server/api/network/network.controller.js
+++ b/server/api/network/network.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/network/network.model.js b/server/api/network/network.model.js
index 06747d3..56b30d4 100644
--- a/server/api/network/network.model.js
+++ b/server/api/network/network.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/network/network.rpc.js b/server/api/network/network.rpc.js
index 0f290ac..bd7a628 100644
--- a/server/api/network/network.rpc.js
+++ b/server/api/network/network.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/index.js b/server/api/openchannelAccount/index.js
index abf3ec5..0f24e0a 100644
--- a/server/api/openchannelAccount/index.js
+++ b/server/api/openchannelAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.attributes.js b/server/api/openchannelAccount/openchannelAccount.attributes.js
index e8f5f8b..0ff5140 100644
--- a/server/api/openchannelAccount/openchannelAccount.attributes.js
+++ b/server/api/openchannelAccount/openchannelAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.controller.js b/server/api/openchannelAccount/openchannelAccount.controller.js
index 03c8973..cf7c184 100644
--- a/server/api/openchannelAccount/openchannelAccount.controller.js
+++ b/server/api/openchannelAccount/openchannelAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.events.js b/server/api/openchannelAccount/openchannelAccount.events.js
index c5cd1e1..b762a4b 100644
--- a/server/api/openchannelAccount/openchannelAccount.events.js
+++ b/server/api/openchannelAccount/openchannelAccount.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.model.js b/server/api/openchannelAccount/openchannelAccount.model.js
index 88b967b..d39eaa9 100644
--- a/server/api/openchannelAccount/openchannelAccount.model.js
+++ b/server/api/openchannelAccount/openchannelAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.rpc.js b/server/api/openchannelAccount/openchannelAccount.rpc.js
index ec388a6..df32a20 100644
--- a/server/api/openchannelAccount/openchannelAccount.rpc.js
+++ b/server/api/openchannelAccount/openchannelAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelAccount/openchannelAccount.socket.js b/server/api/openchannelAccount/openchannelAccount.socket.js
index 2d91042..a0f3adc 100644
--- a/server/api/openchannelAccount/openchannelAccount.socket.js
+++ b/server/api/openchannelAccount/openchannelAccount.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelApplication/index.js b/server/api/openchannelApplication/index.js
index 0c2e022..11add73 100644
--- a/server/api/openchannelApplication/index.js
+++ b/server/api/openchannelApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelApplication/openchannelApplication.attributes.js b/server/api/openchannelApplication/openchannelApplication.attributes.js
index 2781ea7..844787a 100644
--- a/server/api/openchannelApplication/openchannelApplication.attributes.js
+++ b/server/api/openchannelApplication/openchannelApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelApplication/openchannelApplication.controller.js b/server/api/openchannelApplication/openchannelApplication.controller.js
index e59be29..2725e8d 100644
--- a/server/api/openchannelApplication/openchannelApplication.controller.js
+++ b/server/api/openchannelApplication/openchannelApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelApplication/openchannelApplication.model.js b/server/api/openchannelApplication/openchannelApplication.model.js
index 64e4c17..25b827d 100644
--- a/server/api/openchannelApplication/openchannelApplication.model.js
+++ b/server/api/openchannelApplication/openchannelApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelApplication/openchannelApplication.rpc.js b/server/api/openchannelApplication/openchannelApplication.rpc.js
index 18c6878..346eda8 100644
--- a/server/api/openchannelApplication/openchannelApplication.rpc.js
+++ b/server/api/openchannelApplication/openchannelApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/index.js b/server/api/openchannelInteraction/index.js
index 677b72b..0b0b891 100644
--- a/server/api/openchannelInteraction/index.js
+++ b/server/api/openchannelInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.attributes.js b/server/api/openchannelInteraction/openchannelInteraction.attributes.js
index dafc8ed..db7141a 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.attributes.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.controller.js b/server/api/openchannelInteraction/openchannelInteraction.controller.js
index 2fbf05a..81915c8 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.controller.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.events.js b/server/api/openchannelInteraction/openchannelInteraction.events.js
index 6618a15..1c65521 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.events.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.model.js b/server/api/openchannelInteraction/openchannelInteraction.model.js
index e0f2c1b..1d32367 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.model.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.rpc.js b/server/api/openchannelInteraction/openchannelInteraction.rpc.js
index 2e42078..f36f638 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.rpc.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelInteraction/openchannelInteraction.socket.js b/server/api/openchannelInteraction/openchannelInteraction.socket.js
index 59d84ae..c59cc8f 100644
--- a/server/api/openchannelInteraction/openchannelInteraction.socket.js
+++ b/server/api/openchannelInteraction/openchannelInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/index.js b/server/api/openchannelMessage/index.js
index a67b4a5..1837823 100644
--- a/server/api/openchannelMessage/index.js
+++ b/server/api/openchannelMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.attributes.js b/server/api/openchannelMessage/openchannelMessage.attributes.js
index e233c9f..34d38fc 100644
--- a/server/api/openchannelMessage/openchannelMessage.attributes.js
+++ b/server/api/openchannelMessage/openchannelMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.controller.js b/server/api/openchannelMessage/openchannelMessage.controller.js
index 723e2d5..d0ac027 100644
--- a/server/api/openchannelMessage/openchannelMessage.controller.js
+++ b/server/api/openchannelMessage/openchannelMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.events.js b/server/api/openchannelMessage/openchannelMessage.events.js
index 3208d0c..2bc3b37 100644
--- a/server/api/openchannelMessage/openchannelMessage.events.js
+++ b/server/api/openchannelMessage/openchannelMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.model.js b/server/api/openchannelMessage/openchannelMessage.model.js
index d8a0756..dd8666e 100644
--- a/server/api/openchannelMessage/openchannelMessage.model.js
+++ b/server/api/openchannelMessage/openchannelMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.rpc.js b/server/api/openchannelMessage/openchannelMessage.rpc.js
index fd33da7..e26b330 100644
--- a/server/api/openchannelMessage/openchannelMessage.rpc.js
+++ b/server/api/openchannelMessage/openchannelMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelMessage/openchannelMessage.socket.js b/server/api/openchannelMessage/openchannelMessage.socket.js
index d4526b2..078e2b4 100644
--- a/server/api/openchannelMessage/openchannelMessage.socket.js
+++ b/server/api/openchannelMessage/openchannelMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/index.js b/server/api/openchannelQueue/index.js
index c6da360..7b38b00 100644
--- a/server/api/openchannelQueue/index.js
+++ b/server/api/openchannelQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.attributes.js b/server/api/openchannelQueue/openchannelQueue.attributes.js
index 926bf03..f4a5bfd 100644
--- a/server/api/openchannelQueue/openchannelQueue.attributes.js
+++ b/server/api/openchannelQueue/openchannelQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.controller.js b/server/api/openchannelQueue/openchannelQueue.controller.js
index b6a7b34..52b2ad8 100644
--- a/server/api/openchannelQueue/openchannelQueue.controller.js
+++ b/server/api/openchannelQueue/openchannelQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.events.js b/server/api/openchannelQueue/openchannelQueue.events.js
index 7d076f0..fb28035 100644
--- a/server/api/openchannelQueue/openchannelQueue.events.js
+++ b/server/api/openchannelQueue/openchannelQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.model.js b/server/api/openchannelQueue/openchannelQueue.model.js
index 13a83bd..94972fa 100644
--- a/server/api/openchannelQueue/openchannelQueue.model.js
+++ b/server/api/openchannelQueue/openchannelQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.rpc.js b/server/api/openchannelQueue/openchannelQueue.rpc.js
index 4d8f9b1..6452ce7 100644
--- a/server/api/openchannelQueue/openchannelQueue.rpc.js
+++ b/server/api/openchannelQueue/openchannelQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueue/openchannelQueue.socket.js b/server/api/openchannelQueue/openchannelQueue.socket.js
index 60da7ec..28c614a 100644
--- a/server/api/openchannelQueue/openchannelQueue.socket.js
+++ b/server/api/openchannelQueue/openchannelQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueueReport/index.js b/server/api/openchannelQueueReport/index.js
index e0d0489..1252615 100644
--- a/server/api/openchannelQueueReport/index.js
+++ b/server/api/openchannelQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueueReport/openchannelQueueReport.attributes.js b/server/api/openchannelQueueReport/openchannelQueueReport.attributes.js
index 755da12..97881d7 100644
--- a/server/api/openchannelQueueReport/openchannelQueueReport.attributes.js
+++ b/server/api/openchannelQueueReport/openchannelQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueueReport/openchannelQueueReport.controller.js b/server/api/openchannelQueueReport/openchannelQueueReport.controller.js
index 2d84b0f..b35f02c 100644
--- a/server/api/openchannelQueueReport/openchannelQueueReport.controller.js
+++ b/server/api/openchannelQueueReport/openchannelQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueueReport/openchannelQueueReport.model.js b/server/api/openchannelQueueReport/openchannelQueueReport.model.js
index 0283f3c..75fd118 100644
--- a/server/api/openchannelQueueReport/openchannelQueueReport.model.js
+++ b/server/api/openchannelQueueReport/openchannelQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelQueueReport/openchannelQueueReport.rpc.js b/server/api/openchannelQueueReport/openchannelQueueReport.rpc.js
index 824b3b4..8c1e5c6 100644
--- a/server/api/openchannelQueueReport/openchannelQueueReport.rpc.js
+++ b/server/api/openchannelQueueReport/openchannelQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelTransferReport/index.js b/server/api/openchannelTransferReport/index.js
index c175e64..501c956 100644
--- a/server/api/openchannelTransferReport/index.js
+++ b/server/api/openchannelTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelTransferReport/openchannelTransferReport.attributes.js b/server/api/openchannelTransferReport/openchannelTransferReport.attributes.js
index 08413f2..50b2fa3 100644
--- a/server/api/openchannelTransferReport/openchannelTransferReport.attributes.js
+++ b/server/api/openchannelTransferReport/openchannelTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelTransferReport/openchannelTransferReport.controller.js b/server/api/openchannelTransferReport/openchannelTransferReport.controller.js
index a6d043c..cddf1a4 100644
--- a/server/api/openchannelTransferReport/openchannelTransferReport.controller.js
+++ b/server/api/openchannelTransferReport/openchannelTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelTransferReport/openchannelTransferReport.model.js b/server/api/openchannelTransferReport/openchannelTransferReport.model.js
index 57aa0ff..60f1a3e 100644
--- a/server/api/openchannelTransferReport/openchannelTransferReport.model.js
+++ b/server/api/openchannelTransferReport/openchannelTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/openchannelTransferReport/openchannelTransferReport.rpc.js b/server/api/openchannelTransferReport/openchannelTransferReport.rpc.js
index a34e2dd..3dc2cdd 100644
--- a/server/api/openchannelTransferReport/openchannelTransferReport.rpc.js
+++ b/server/api/openchannelTransferReport/openchannelTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pause/index.js b/server/api/pause/index.js
index e943075..dd9e4cf 100644
--- a/server/api/pause/index.js
+++ b/server/api/pause/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pause/pause.attributes.js b/server/api/pause/pause.attributes.js
index d467254..d2538b8 100644
--- a/server/api/pause/pause.attributes.js
+++ b/server/api/pause/pause.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pause/pause.controller.js b/server/api/pause/pause.controller.js
index 81e70a8..67316e6 100644
--- a/server/api/pause/pause.controller.js
+++ b/server/api/pause/pause.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pause/pause.model.js b/server/api/pause/pause.model.js
index 2b0d091..bc2d6a7 100644
--- a/server/api/pause/pause.model.js
+++ b/server/api/pause/pause.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pause/pause.rpc.js b/server/api/pause/pause.rpc.js
index 29b87c7..6f90597 100644
--- a/server/api/pause/pause.rpc.js
+++ b/server/api/pause/pause.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/index.js b/server/api/plugin/index.js
index 5947c90..3b0a33c 100644
--- a/server/api/plugin/index.js
+++ b/server/api/plugin/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.attributes.js b/server/api/plugin/plugin.attributes.js
index 20b059b..8ff5434 100644
--- a/server/api/plugin/plugin.attributes.js
+++ b/server/api/plugin/plugin.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.controller.js b/server/api/plugin/plugin.controller.js
index 6c6ae73..3398028 100644
--- a/server/api/plugin/plugin.controller.js
+++ b/server/api/plugin/plugin.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.events.js b/server/api/plugin/plugin.events.js
index 1f76315..b43b697 100644
--- a/server/api/plugin/plugin.events.js
+++ b/server/api/plugin/plugin.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.model.js b/server/api/plugin/plugin.model.js
index b6bbf11..d1a6bef 100644
--- a/server/api/plugin/plugin.model.js
+++ b/server/api/plugin/plugin.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.rpc.js b/server/api/plugin/plugin.rpc.js
index a1ab7b5..56a5384 100644
--- a/server/api/plugin/plugin.rpc.js
+++ b/server/api/plugin/plugin.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/plugin/plugin.socket.js b/server/api/plugin/plugin.socket.js
index 004e34e..e2f98c4 100644
--- a/server/api/plugin/plugin.socket.js
+++ b/server/api/plugin/plugin.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pm2/index.js b/server/api/pm2/index.js
index 39655a7..3e589dd 100644
--- a/server/api/pm2/index.js
+++ b/server/api/pm2/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/pm2/pm2.controller.js b/server/api/pm2/pm2.controller.js
index 6a11e15..6416317 100644
--- a/server/api/pm2/pm2.controller.js
+++ b/server/api/pm2/pm2.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/realtime/index.js b/server/api/realtime/index.js
index 2d81d22..95c6c91 100644
--- a/server/api/realtime/index.js
+++ b/server/api/realtime/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/realtime/realtime.controller.js b/server/api/realtime/realtime.controller.js
index cd43dae..91617cd 100644
--- a/server/api/realtime/realtime.controller.js
+++ b/server/api/realtime/realtime.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/reportAgentPreview/index.js b/server/api/reportAgentPreview/index.js
index d072ec6..3b5e546 100644
--- a/server/api/reportAgentPreview/index.js
+++ b/server/api/reportAgentPreview/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/reportAgentPreview/reportAgentPreview.attributes.js b/server/api/reportAgentPreview/reportAgentPreview.attributes.js
index 8ef2e86..201f648 100644
--- a/server/api/reportAgentPreview/reportAgentPreview.attributes.js
+++ b/server/api/reportAgentPreview/reportAgentPreview.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/reportAgentPreview/reportAgentPreview.model.js b/server/api/reportAgentPreview/reportAgentPreview.model.js
index 69e04e8..9b636fe 100644
--- a/server/api/reportAgentPreview/reportAgentPreview.model.js
+++ b/server/api/reportAgentPreview/reportAgentPreview.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/reportAgentPreview/reportAgentPreview.rpc.js b/server/api/reportAgentPreview/reportAgentPreview.rpc.js
index 4312091..7b7960c 100644
--- a/server/api/reportAgentPreview/reportAgentPreview.rpc.js
+++ b/server/api/reportAgentPreview/reportAgentPreview.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/rpc/index.js b/server/api/rpc/index.js
index f7602f2..7e6977f 100644
--- a/server/api/rpc/index.js
+++ b/server/api/rpc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/rpc/rpc.controller.js b/server/api/rpc/rpc.controller.js
index 11451b7..beb753a 100644
--- a/server/api/rpc/rpc.controller.js
+++ b/server/api/rpc/rpc.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/schedule/index.js b/server/api/schedule/index.js
index f52ebfc..840d2f3 100644
--- a/server/api/schedule/index.js
+++ b/server/api/schedule/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/schedule/schedule.attributes.js b/server/api/schedule/schedule.attributes.js
index 54ec8d9..4ae619c 100644
--- a/server/api/schedule/schedule.attributes.js
+++ b/server/api/schedule/schedule.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/schedule/schedule.controller.js b/server/api/schedule/schedule.controller.js
index d9d7082..126befb 100644
--- a/server/api/schedule/schedule.controller.js
+++ b/server/api/schedule/schedule.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/schedule/schedule.model.js b/server/api/schedule/schedule.model.js
index 9f6c54d..ca297e2 100644
--- a/server/api/schedule/schedule.model.js
+++ b/server/api/schedule/schedule.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/schedule/schedule.rpc.js b/server/api/schedule/schedule.rpc.js
index 8108fff..f736b39 100644
--- a/server/api/schedule/schedule.rpc.js
+++ b/server/api/schedule/schedule.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/screenRecording/index.js b/server/api/screenRecording/index.js
index 1e464be..1deca01 100644
--- a/server/api/screenRecording/index.js
+++ b/server/api/screenRecording/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/screenRecording/screenRecording.attributes.js b/server/api/screenRecording/screenRecording.attributes.js
index e6312a2..6302b31 100644
--- a/server/api/screenRecording/screenRecording.attributes.js
+++ b/server/api/screenRecording/screenRecording.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/screenRecording/screenRecording.controller.js b/server/api/screenRecording/screenRecording.controller.js
index 75bb892..69dbdf3 100644
--- a/server/api/screenRecording/screenRecording.controller.js
+++ b/server/api/screenRecording/screenRecording.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/screenRecording/screenRecording.model.js b/server/api/screenRecording/screenRecording.model.js
index b40a036..536b60b 100644
--- a/server/api/screenRecording/screenRecording.model.js
+++ b/server/api/screenRecording/screenRecording.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/screenRecording/screenRecording.rpc.js b/server/api/screenRecording/screenRecording.rpc.js
index c1c06cd..8dbd044 100644
--- a/server/api/screenRecording/screenRecording.rpc.js
+++ b/server/api/screenRecording/screenRecording.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/setting/index.js b/server/api/setting/index.js
index db04025..7706cfa 100644
--- a/server/api/setting/index.js
+++ b/server/api/setting/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/setting/setting.attributes.js b/server/api/setting/setting.attributes.js
index c4bd029..bd6c15f 100644
--- a/server/api/setting/setting.attributes.js
+++ b/server/api/setting/setting.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/setting/setting.controller.js b/server/api/setting/setting.controller.js
index 9a69c36..ad1d854 100644
--- a/server/api/setting/setting.controller.js
+++ b/server/api/setting/setting.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/setting/setting.model.js b/server/api/setting/setting.model.js
index a5dc173..b384ac1 100644
--- a/server/api/setting/setting.model.js
+++ b/server/api/setting/setting.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/setting/setting.rpc.js b/server/api/setting/setting.rpc.js
index 4661c6d..5e629fd 100644
--- a/server/api/setting/setting.rpc.js
+++ b/server/api/setting/setting.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/index.js b/server/api/smsAccount/index.js
index 28b83d6..2d7d4b7 100644
--- a/server/api/smsAccount/index.js
+++ b/server/api/smsAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.attributes.js b/server/api/smsAccount/smsAccount.attributes.js
index 175f4c7..ad86af8 100644
--- a/server/api/smsAccount/smsAccount.attributes.js
+++ b/server/api/smsAccount/smsAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.controller.js b/server/api/smsAccount/smsAccount.controller.js
index 28d6a26..2d254c8 100644
--- a/server/api/smsAccount/smsAccount.controller.js
+++ b/server/api/smsAccount/smsAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.events.js b/server/api/smsAccount/smsAccount.events.js
index 7745eaf..3157b1c 100644
--- a/server/api/smsAccount/smsAccount.events.js
+++ b/server/api/smsAccount/smsAccount.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.model.js b/server/api/smsAccount/smsAccount.model.js
index e48281b..f2cf2e7 100644
--- a/server/api/smsAccount/smsAccount.model.js
+++ b/server/api/smsAccount/smsAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.rpc.js b/server/api/smsAccount/smsAccount.rpc.js
index 6ee2c2b..bd7ecc3 100644
--- a/server/api/smsAccount/smsAccount.rpc.js
+++ b/server/api/smsAccount/smsAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsAccount/smsAccount.socket.js b/server/api/smsAccount/smsAccount.socket.js
index d30ecbb..85ccc6c 100644
--- a/server/api/smsAccount/smsAccount.socket.js
+++ b/server/api/smsAccount/smsAccount.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsApplication/index.js b/server/api/smsApplication/index.js
index ce80b6c..850bef2 100644
--- a/server/api/smsApplication/index.js
+++ b/server/api/smsApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsApplication/smsApplication.attributes.js b/server/api/smsApplication/smsApplication.attributes.js
index f05fc78..d5862fb 100644
--- a/server/api/smsApplication/smsApplication.attributes.js
+++ b/server/api/smsApplication/smsApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsApplication/smsApplication.controller.js b/server/api/smsApplication/smsApplication.controller.js
index dd1211c..51f477d 100644
--- a/server/api/smsApplication/smsApplication.controller.js
+++ b/server/api/smsApplication/smsApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsApplication/smsApplication.model.js b/server/api/smsApplication/smsApplication.model.js
index ebf1eda..0e5869a 100644
--- a/server/api/smsApplication/smsApplication.model.js
+++ b/server/api/smsApplication/smsApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsApplication/smsApplication.rpc.js b/server/api/smsApplication/smsApplication.rpc.js
index 6cdf7f3..d567264 100644
--- a/server/api/smsApplication/smsApplication.rpc.js
+++ b/server/api/smsApplication/smsApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/index.js b/server/api/smsInteraction/index.js
index b7156f0..661a00b 100644
--- a/server/api/smsInteraction/index.js
+++ b/server/api/smsInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.attributes.js b/server/api/smsInteraction/smsInteraction.attributes.js
index 5b86172..9ca9bbe 100644
--- a/server/api/smsInteraction/smsInteraction.attributes.js
+++ b/server/api/smsInteraction/smsInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.controller.js b/server/api/smsInteraction/smsInteraction.controller.js
index 2ae16d0..34102ee 100644
--- a/server/api/smsInteraction/smsInteraction.controller.js
+++ b/server/api/smsInteraction/smsInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.events.js b/server/api/smsInteraction/smsInteraction.events.js
index 6763215..2487a9e 100644
--- a/server/api/smsInteraction/smsInteraction.events.js
+++ b/server/api/smsInteraction/smsInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.model.js b/server/api/smsInteraction/smsInteraction.model.js
index 8e24640..fb7dc99 100644
--- a/server/api/smsInteraction/smsInteraction.model.js
+++ b/server/api/smsInteraction/smsInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.rpc.js b/server/api/smsInteraction/smsInteraction.rpc.js
index 135eb98..72ee314 100644
--- a/server/api/smsInteraction/smsInteraction.rpc.js
+++ b/server/api/smsInteraction/smsInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsInteraction/smsInteraction.socket.js b/server/api/smsInteraction/smsInteraction.socket.js
index c633ab7..23bc078 100644
--- a/server/api/smsInteraction/smsInteraction.socket.js
+++ b/server/api/smsInteraction/smsInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/index.js b/server/api/smsMessage/index.js
index a98f62d..d0307f9 100644
--- a/server/api/smsMessage/index.js
+++ b/server/api/smsMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.attributes.js b/server/api/smsMessage/smsMessage.attributes.js
index 54c5696..a7a972c 100644
--- a/server/api/smsMessage/smsMessage.attributes.js
+++ b/server/api/smsMessage/smsMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.controller.js b/server/api/smsMessage/smsMessage.controller.js
index 8b4357b..536c48f 100644
--- a/server/api/smsMessage/smsMessage.controller.js
+++ b/server/api/smsMessage/smsMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.events.js b/server/api/smsMessage/smsMessage.events.js
index 5bbb954..59382e4 100644
--- a/server/api/smsMessage/smsMessage.events.js
+++ b/server/api/smsMessage/smsMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.model.js b/server/api/smsMessage/smsMessage.model.js
index 535410e..cd76ffc 100644
--- a/server/api/smsMessage/smsMessage.model.js
+++ b/server/api/smsMessage/smsMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.rpc.js b/server/api/smsMessage/smsMessage.rpc.js
index aaf739f..7df1152 100644
--- a/server/api/smsMessage/smsMessage.rpc.js
+++ b/server/api/smsMessage/smsMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsMessage/smsMessage.socket.js b/server/api/smsMessage/smsMessage.socket.js
index 0f39982..d4b1d25 100644
--- a/server/api/smsMessage/smsMessage.socket.js
+++ b/server/api/smsMessage/smsMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/index.js b/server/api/smsQueue/index.js
index 2541568..f310a17 100644
--- a/server/api/smsQueue/index.js
+++ b/server/api/smsQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.attributes.js b/server/api/smsQueue/smsQueue.attributes.js
index 81e191f..1ebebff 100644
--- a/server/api/smsQueue/smsQueue.attributes.js
+++ b/server/api/smsQueue/smsQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.controller.js b/server/api/smsQueue/smsQueue.controller.js
index efa23e7..5a6d0b0 100644
--- a/server/api/smsQueue/smsQueue.controller.js
+++ b/server/api/smsQueue/smsQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.events.js b/server/api/smsQueue/smsQueue.events.js
index aa24e28..82fde0f 100644
--- a/server/api/smsQueue/smsQueue.events.js
+++ b/server/api/smsQueue/smsQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.model.js b/server/api/smsQueue/smsQueue.model.js
index b9a9d24..04ad311 100644
--- a/server/api/smsQueue/smsQueue.model.js
+++ b/server/api/smsQueue/smsQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.rpc.js b/server/api/smsQueue/smsQueue.rpc.js
index 603a3b3..5d6fc39 100644
--- a/server/api/smsQueue/smsQueue.rpc.js
+++ b/server/api/smsQueue/smsQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueue/smsQueue.socket.js b/server/api/smsQueue/smsQueue.socket.js
index 1e13e12..bc52675 100644
--- a/server/api/smsQueue/smsQueue.socket.js
+++ b/server/api/smsQueue/smsQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueueReport/index.js b/server/api/smsQueueReport/index.js
index e12ab97..44a7ff5 100644
--- a/server/api/smsQueueReport/index.js
+++ b/server/api/smsQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueueReport/smsQueueReport.attributes.js b/server/api/smsQueueReport/smsQueueReport.attributes.js
index 3db4d80..c57b673 100644
--- a/server/api/smsQueueReport/smsQueueReport.attributes.js
+++ b/server/api/smsQueueReport/smsQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueueReport/smsQueueReport.controller.js b/server/api/smsQueueReport/smsQueueReport.controller.js
index 0bb6093..f88109d 100644
--- a/server/api/smsQueueReport/smsQueueReport.controller.js
+++ b/server/api/smsQueueReport/smsQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueueReport/smsQueueReport.model.js b/server/api/smsQueueReport/smsQueueReport.model.js
index 68058c0..73e1046 100644
--- a/server/api/smsQueueReport/smsQueueReport.model.js
+++ b/server/api/smsQueueReport/smsQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsQueueReport/smsQueueReport.rpc.js b/server/api/smsQueueReport/smsQueueReport.rpc.js
index 2d143ee..287620a 100644
--- a/server/api/smsQueueReport/smsQueueReport.rpc.js
+++ b/server/api/smsQueueReport/smsQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsTransferReport/index.js b/server/api/smsTransferReport/index.js
index 2a616b0..987881d 100644
--- a/server/api/smsTransferReport/index.js
+++ b/server/api/smsTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsTransferReport/smsTransferReport.attributes.js b/server/api/smsTransferReport/smsTransferReport.attributes.js
index 7ee6e23..bedbf77 100644
--- a/server/api/smsTransferReport/smsTransferReport.attributes.js
+++ b/server/api/smsTransferReport/smsTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsTransferReport/smsTransferReport.controller.js b/server/api/smsTransferReport/smsTransferReport.controller.js
index 8539948..f16dcc2 100644
--- a/server/api/smsTransferReport/smsTransferReport.controller.js
+++ b/server/api/smsTransferReport/smsTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsTransferReport/smsTransferReport.model.js b/server/api/smsTransferReport/smsTransferReport.model.js
index 2d37920..474f432 100644
--- a/server/api/smsTransferReport/smsTransferReport.model.js
+++ b/server/api/smsTransferReport/smsTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/smsTransferReport/smsTransferReport.rpc.js b/server/api/smsTransferReport/smsTransferReport.rpc.js
index 3c17ca1..e613236 100644
--- a/server/api/smsTransferReport/smsTransferReport.rpc.js
+++ b/server/api/smsTransferReport/smsTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/sound/index.js b/server/api/sound/index.js
index f23a04e..90c0e78 100644
--- a/server/api/sound/index.js
+++ b/server/api/sound/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/sound/sound.attributes.js b/server/api/sound/sound.attributes.js
index 74865e5..7510e50 100644
--- a/server/api/sound/sound.attributes.js
+++ b/server/api/sound/sound.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/sound/sound.controller.js b/server/api/sound/sound.controller.js
index 29f8375..810010b 100644
--- a/server/api/sound/sound.controller.js
+++ b/server/api/sound/sound.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/sound/sound.model.js b/server/api/sound/sound.model.js
index 6ead7c5..3d3d258 100644
--- a/server/api/sound/sound.model.js
+++ b/server/api/sound/sound.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/sound/sound.rpc.js b/server/api/sound/sound.rpc.js
index f9dd792..412bb55 100644
--- a/server/api/sound/sound.rpc.js
+++ b/server/api/sound/sound.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareMessage/index.js b/server/api/squareMessage/index.js
index c65972f..70bfee2 100644
--- a/server/api/squareMessage/index.js
+++ b/server/api/squareMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareMessage/squareMessage.attributes.js b/server/api/squareMessage/squareMessage.attributes.js
index 8587792..a45ca7a 100644
--- a/server/api/squareMessage/squareMessage.attributes.js
+++ b/server/api/squareMessage/squareMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareMessage/squareMessage.controller.js b/server/api/squareMessage/squareMessage.controller.js
index 2d6d88f..11cf353 100644
--- a/server/api/squareMessage/squareMessage.controller.js
+++ b/server/api/squareMessage/squareMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareMessage/squareMessage.model.js b/server/api/squareMessage/squareMessage.model.js
index af81c14..0ec0b7e 100644
--- a/server/api/squareMessage/squareMessage.model.js
+++ b/server/api/squareMessage/squareMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareMessage/squareMessage.rpc.js b/server/api/squareMessage/squareMessage.rpc.js
index e00c5b9..292aa38 100644
--- a/server/api/squareMessage/squareMessage.rpc.js
+++ b/server/api/squareMessage/squareMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareOdbc/index.js b/server/api/squareOdbc/index.js
index 6e56a65..d8ea186 100644
--- a/server/api/squareOdbc/index.js
+++ b/server/api/squareOdbc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareOdbc/squareOdbc.attributes.js b/server/api/squareOdbc/squareOdbc.attributes.js
index 528a30b..5ea4e11 100644
--- a/server/api/squareOdbc/squareOdbc.attributes.js
+++ b/server/api/squareOdbc/squareOdbc.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareOdbc/squareOdbc.controller.js b/server/api/squareOdbc/squareOdbc.controller.js
index 28b2e32..aa9ef02 100644
--- a/server/api/squareOdbc/squareOdbc.controller.js
+++ b/server/api/squareOdbc/squareOdbc.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareOdbc/squareOdbc.model.js b/server/api/squareOdbc/squareOdbc.model.js
index 94044bb..d7ca1f2 100644
--- a/server/api/squareOdbc/squareOdbc.model.js
+++ b/server/api/squareOdbc/squareOdbc.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareOdbc/squareOdbc.rpc.js b/server/api/squareOdbc/squareOdbc.rpc.js
index aac1dc4..02a5325 100644
--- a/server/api/squareOdbc/squareOdbc.rpc.js
+++ b/server/api/squareOdbc/squareOdbc.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/index.js b/server/api/squareProject/index.js
index fcbade0..163c114 100644
--- a/server/api/squareProject/index.js
+++ b/server/api/squareProject/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.attributes.js b/server/api/squareProject/squareProject.attributes.js
index 91fd6ea..b6c8b46 100644
--- a/server/api/squareProject/squareProject.attributes.js
+++ b/server/api/squareProject/squareProject.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.controller.js b/server/api/squareProject/squareProject.controller.js
index e24fef3..b861d5e 100644
--- a/server/api/squareProject/squareProject.controller.js
+++ b/server/api/squareProject/squareProject.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.events.js b/server/api/squareProject/squareProject.events.js
index 7fa24f1..51a506f 100644
--- a/server/api/squareProject/squareProject.events.js
+++ b/server/api/squareProject/squareProject.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.model.js b/server/api/squareProject/squareProject.model.js
index 16d60b5..30e88dd 100644
--- a/server/api/squareProject/squareProject.model.js
+++ b/server/api/squareProject/squareProject.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.rpc.js b/server/api/squareProject/squareProject.rpc.js
index 39fd441..038245b 100644
--- a/server/api/squareProject/squareProject.rpc.js
+++ b/server/api/squareProject/squareProject.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareProject/squareProject.socket.js b/server/api/squareProject/squareProject.socket.js
index 853b455..9e1bf2d 100644
--- a/server/api/squareProject/squareProject.socket.js
+++ b/server/api/squareProject/squareProject.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareRecording/index.js b/server/api/squareRecording/index.js
index b8306fa..ed4b8fc 100644
--- a/server/api/squareRecording/index.js
+++ b/server/api/squareRecording/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareRecording/squareRecording.attributes.js b/server/api/squareRecording/squareRecording.attributes.js
index 5a5de41..3ec6118 100644
--- a/server/api/squareRecording/squareRecording.attributes.js
+++ b/server/api/squareRecording/squareRecording.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareRecording/squareRecording.controller.js b/server/api/squareRecording/squareRecording.controller.js
index 5b90f79..30f38a3 100644
--- a/server/api/squareRecording/squareRecording.controller.js
+++ b/server/api/squareRecording/squareRecording.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareRecording/squareRecording.model.js b/server/api/squareRecording/squareRecording.model.js
index 55c58d5..fe88d6e 100644
--- a/server/api/squareRecording/squareRecording.model.js
+++ b/server/api/squareRecording/squareRecording.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareRecording/squareRecording.rpc.js b/server/api/squareRecording/squareRecording.rpc.js
index 69eabb0..4e465a6 100644
--- a/server/api/squareRecording/squareRecording.rpc.js
+++ b/server/api/squareRecording/squareRecording.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReport/index.js b/server/api/squareReport/index.js
index 2bd4f1d..e242738 100644
--- a/server/api/squareReport/index.js
+++ b/server/api/squareReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReport/squareReport.attributes.js b/server/api/squareReport/squareReport.attributes.js
index a0c8482..ea54e6d 100644
--- a/server/api/squareReport/squareReport.attributes.js
+++ b/server/api/squareReport/squareReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReport/squareReport.controller.js b/server/api/squareReport/squareReport.controller.js
index ab6e9cc..72f4207 100644
--- a/server/api/squareReport/squareReport.controller.js
+++ b/server/api/squareReport/squareReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReport/squareReport.model.js b/server/api/squareReport/squareReport.model.js
index 6d53db6..840d2bc 100644
--- a/server/api/squareReport/squareReport.model.js
+++ b/server/api/squareReport/squareReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReport/squareReport.rpc.js b/server/api/squareReport/squareReport.rpc.js
index 88277c7..1b87823 100644
--- a/server/api/squareReport/squareReport.rpc.js
+++ b/server/api/squareReport/squareReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReportDetail/index.js b/server/api/squareReportDetail/index.js
index a20f82b..b846e28 100644
--- a/server/api/squareReportDetail/index.js
+++ b/server/api/squareReportDetail/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReportDetail/squareReportDetail.attributes.js b/server/api/squareReportDetail/squareReportDetail.attributes.js
index 66948d7..1e7582b 100644
--- a/server/api/squareReportDetail/squareReportDetail.attributes.js
+++ b/server/api/squareReportDetail/squareReportDetail.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReportDetail/squareReportDetail.controller.js b/server/api/squareReportDetail/squareReportDetail.controller.js
index c12313f..84ead7b 100644
--- a/server/api/squareReportDetail/squareReportDetail.controller.js
+++ b/server/api/squareReportDetail/squareReportDetail.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReportDetail/squareReportDetail.model.js b/server/api/squareReportDetail/squareReportDetail.model.js
index c689153..301102a 100644
--- a/server/api/squareReportDetail/squareReportDetail.model.js
+++ b/server/api/squareReportDetail/squareReportDetail.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/squareReportDetail/squareReportDetail.rpc.js b/server/api/squareReportDetail/squareReportDetail.rpc.js
index f05013b..ffc4db9 100644
--- a/server/api/squareReportDetail/squareReportDetail.rpc.js
+++ b/server/api/squareReportDetail/squareReportDetail.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/system/index.js b/server/api/system/index.js
index 54d99ae..892110b 100644
--- a/server/api/system/index.js
+++ b/server/api/system/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/system/system.controller.js b/server/api/system/system.controller.js
index 5d0dd2d..ae62a15 100644
--- a/server/api/system/system.controller.js
+++ b/server/api/system/system.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/tag/index.js b/server/api/tag/index.js
index dd6bc2f..08211e9 100644
--- a/server/api/tag/index.js
+++ b/server/api/tag/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/tag/tag.attributes.js b/server/api/tag/tag.attributes.js
index 32de70a..31e11eb 100644
--- a/server/api/tag/tag.attributes.js
+++ b/server/api/tag/tag.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/tag/tag.controller.js b/server/api/tag/tag.controller.js
index 10a13a3..30a2627 100644
--- a/server/api/tag/tag.controller.js
+++ b/server/api/tag/tag.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/tag/tag.model.js b/server/api/tag/tag.model.js
index d4b8dca..e81cbf3 100644
--- a/server/api/tag/tag.model.js
+++ b/server/api/tag/tag.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/tag/tag.rpc.js b/server/api/tag/tag.rpc.js
index 5966976..a6b3faf 100644
--- a/server/api/tag/tag.rpc.js
+++ b/server/api/tag/tag.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/index.js b/server/api/team/index.js
index 96b3598..7a9d23e 100644
--- a/server/api/team/index.js
+++ b/server/api/team/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.attributes.js b/server/api/team/team.attributes.js
index 3476aab..21ed69b 100644
--- a/server/api/team/team.attributes.js
+++ b/server/api/team/team.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.controller.js b/server/api/team/team.controller.js
index d8ecf32..e45c6a0 100644
--- a/server/api/team/team.controller.js
+++ b/server/api/team/team.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.events.js b/server/api/team/team.events.js
index 91f3ba8..0d7d403 100644
--- a/server/api/team/team.events.js
+++ b/server/api/team/team.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.model.js b/server/api/team/team.model.js
index 61e9018..23d9250 100644
--- a/server/api/team/team.model.js
+++ b/server/api/team/team.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.rpc.js b/server/api/team/team.rpc.js
index e7b2f2c..bcdcbfc 100644
--- a/server/api/team/team.rpc.js
+++ b/server/api/team/team.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/team/team.socket.js b/server/api/team/team.socket.js
index 7807e0a..dc9d071 100644
--- a/server/api/team/team.socket.js
+++ b/server/api/team/team.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.attributes.js b/server/api/teamVoicePrefix/teamVoicePrefix.attributes.js
similarity index 61%
copy from server/api/cmContactHasItem/cmContactHasItem.attributes.js
copy to server/api/teamVoicePrefix/teamVoicePrefix.attributes.js
index e5703c5..e90d456 100644
--- a/server/api/cmContactHasItem/cmContactHasItem.attributes.js
+++ b/server/api/teamVoicePrefix/teamVoicePrefix.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.attributes.js b/server/api/teamVoicePrefix/teamVoicePrefix.model.js
similarity index 54%
copy from server/api/cmContactHasItem/cmContactHasItem.attributes.js
copy to server/api/teamVoicePrefix/teamVoicePrefix.model.js
index e5703c5..df0a51b 100644
--- a/server/api/cmContactHasItem/cmContactHasItem.attributes.js
+++ b/server/api/teamVoicePrefix/teamVoicePrefix.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/teamVoiceQueue/index.js b/server/api/teamVoiceQueue/index.js
index cb1a028..bf2392b 100644
--- a/server/api/teamVoiceQueue/index.js
+++ b/server/api/teamVoiceQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/teamVoiceQueue/teamVoiceQueue.attributes.js b/server/api/teamVoiceQueue/teamVoiceQueue.attributes.js
index f4ca58d..8390f0d 100644
--- a/server/api/teamVoiceQueue/teamVoiceQueue.attributes.js
+++ b/server/api/teamVoiceQueue/teamVoiceQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x6471=['sequelize','INTEGER'];(function(_0x3a8b4e,_0x3e13ae){var _0x580760=function(_0x5c0bc7){while(--_0x5c0bc7){_0x3a8b4e['push'](_0x3a8b4e['shift']());}};_0x580760(++_0x3e13ae);}(_0x6471,0x1ee));var _0x1647=function(_0x229f5e,_0x433f0f){_0x229f5e=_0x229f5e-0x0;var _0x2d62ff=_0x6471[_0x229f5e];return _0x2d62ff;};'use strict';var Sequelize=require(_0x1647('0x0'));module['exports']={'penalty':{'type':Sequelize[_0x1647('0x1')],'defaultValue':0x0}};
\ No newline at end of file
+var _0x008e=['exports','sequelize'];(function(_0xa464c9,_0x7c86d8){var _0x3d73c4=function(_0x5c2056){while(--_0x5c2056){_0xa464c9['push'](_0xa464c9['shift']());}};_0x3d73c4(++_0x7c86d8);}(_0x008e,0x103));var _0xe008=function(_0x9af5bc,_0x9132f4){_0x9af5bc=_0x9af5bc-0x0;var _0x15ecd7=_0x008e[_0x9af5bc];return _0x15ecd7;};'use strict';var Sequelize=require(_0xe008('0x0'));module[_0xe008('0x1')]={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/teamVoiceQueue/teamVoiceQueue.model.js b/server/api/teamVoiceQueue/teamVoiceQueue.model.js
index 8363d01..4cbb343 100644
--- a/server/api/teamVoiceQueue/teamVoiceQueue.model.js
+++ b/server/api/teamVoiceQueue/teamVoiceQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/teamVoiceQueue/teamVoiceQueue.rpc.js b/server/api/teamVoiceQueue/teamVoiceQueue.rpc.js
index 30d7a18..7b638bb 100644
--- a/server/api/teamVoiceQueue/teamVoiceQueue.rpc.js
+++ b/server/api/teamVoiceQueue/teamVoiceQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/template/index.js b/server/api/template/index.js
index 3c24453..9c37e10 100644
--- a/server/api/template/index.js
+++ b/server/api/template/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/template/template.attributes.js b/server/api/template/template.attributes.js
index aaf8256..7153ebc 100644
--- a/server/api/template/template.attributes.js
+++ b/server/api/template/template.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/template/template.controller.js b/server/api/template/template.controller.js
index 717a375..e0d9702 100644
--- a/server/api/template/template.controller.js
+++ b/server/api/template/template.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/template/template.model.js b/server/api/template/template.model.js
index edc6deb..3c5b5e5 100644
--- a/server/api/template/template.model.js
+++ b/server/api/template/template.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/template/template.rpc.js b/server/api/template/template.rpc.js
index 5711d3b..087674e 100644
--- a/server/api/template/template.rpc.js
+++ b/server/api/template/template.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trigger/index.js b/server/api/trigger/index.js
index 37ee843..dd36ff8 100644
--- a/server/api/trigger/index.js
+++ b/server/api/trigger/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trigger/trigger.attributes.js b/server/api/trigger/trigger.attributes.js
index 66d3fe7..49548a1 100644
--- a/server/api/trigger/trigger.attributes.js
+++ b/server/api/trigger/trigger.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trigger/trigger.controller.js b/server/api/trigger/trigger.controller.js
index 53385bc..b3be2db 100644
--- a/server/api/trigger/trigger.controller.js
+++ b/server/api/trigger/trigger.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trigger/trigger.model.js b/server/api/trigger/trigger.model.js
index e79a340..71ff383 100644
--- a/server/api/trigger/trigger.model.js
+++ b/server/api/trigger/trigger.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trigger/trigger.rpc.js b/server/api/trigger/trigger.rpc.js
index 91cbe09..e7cdcdf 100644
--- a/server/api/trigger/trigger.rpc.js
+++ b/server/api/trigger/trigger.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trunk/index.js b/server/api/trunk/index.js
index 3e865a5..fdfe74a 100644
--- a/server/api/trunk/index.js
+++ b/server/api/trunk/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trunk/trunk.attributes.js b/server/api/trunk/trunk.attributes.js
index b93b994..066c5d9 100644
--- a/server/api/trunk/trunk.attributes.js
+++ b/server/api/trunk/trunk.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trunk/trunk.controller.js b/server/api/trunk/trunk.controller.js
index 13d7823..1710e12 100644
--- a/server/api/trunk/trunk.controller.js
+++ b/server/api/trunk/trunk.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trunk/trunk.model.js b/server/api/trunk/trunk.model.js
index 1aa5e7b..0eba9a3 100644
--- a/server/api/trunk/trunk.model.js
+++ b/server/api/trunk/trunk.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/trunk/trunk.rpc.js b/server/api/trunk/trunk.rpc.js
index f7392dc..c3797f5 100644
--- a/server/api/trunk/trunk.rpc.js
+++ b/server/api/trunk/trunk.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/index.js b/server/api/user/index.js
index 280f250..9f8894d 100644
--- a/server/api/user/index.js
+++ b/server/api/user/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.attributes.js b/server/api/user/user.attributes.js
index 7aceb89..091d251 100644
--- a/server/api/user/user.attributes.js
+++ b/server/api/user/user.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.controller.js b/server/api/user/user.controller.js
index 60c2fe8..8a5e889 100644
--- a/server/api/user/user.controller.js
+++ b/server/api/user/user.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.events.js b/server/api/user/user.events.js
index 67c89b1..b84656b 100644
--- a/server/api/user/user.events.js
+++ b/server/api/user/user.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.model.js b/server/api/user/user.model.js
index 0be2bdd..f373ee3 100644
--- a/server/api/user/user.model.js
+++ b/server/api/user/user.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.rpc.js b/server/api/user/user.rpc.js
index 074882e..4981631 100644
--- a/server/api/user/user.rpc.js
+++ b/server/api/user/user.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user/user.socket.js b/server/api/user/user.socket.js
index 61a8394..f4dfb9b 100644
--- a/server/api/user/user.socket.js
+++ b/server/api/user/user.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userChatQueue/index.js b/server/api/userChatQueue/index.js
index 767644f..053a288 100644
--- a/server/api/userChatQueue/index.js
+++ b/server/api/userChatQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userChatQueue/userChatQueue.attributes.js b/server/api/userChatQueue/userChatQueue.attributes.js
index e92fdef..e3edbb8 100644
--- a/server/api/userChatQueue/userChatQueue.attributes.js
+++ b/server/api/userChatQueue/userChatQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xcc18=['INTEGER','sequelize','exports'];(function(_0x21549c,_0x6d64d1){var _0x426cbd=function(_0x323f5b){while(--_0x323f5b){_0x21549c['push'](_0x21549c['shift']());}};_0x426cbd(++_0x6d64d1);}(_0xcc18,0x6a));var _0x8cc1=function(_0x58e469,_0x95ee3e){_0x58e469=_0x58e469-0x0;var _0x4c01c5=_0xcc18[_0x58e469];return _0x4c01c5;};'use strict';var Sequelize=require(_0x8cc1('0x0'));module[_0x8cc1('0x1')]={'penalty':{'type':Sequelize[_0x8cc1('0x2')],'defaultValue':0x0}};
\ No newline at end of file
+var _0x1879=['sequelize'];(function(_0xfae23b,_0x2be4ba){var _0x200640=function(_0x4ae258){while(--_0x4ae258){_0xfae23b['push'](_0xfae23b['shift']());}};_0x200640(++_0x2be4ba);}(_0x1879,0x1ad));var _0x9187=function(_0x15d18f,_0x126b0e){_0x15d18f=_0x15d18f-0x0;var _0xd12bf7=_0x1879[_0x15d18f];return _0xd12bf7;};'use strict';var Sequelize=require(_0x9187('0x0'));module['exports']={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userChatQueue/userChatQueue.model.js b/server/api/userChatQueue/userChatQueue.model.js
index 63566a6..ceb45e2 100644
--- a/server/api/userChatQueue/userChatQueue.model.js
+++ b/server/api/userChatQueue/userChatQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userChatQueue/userChatQueue.rpc.js b/server/api/userChatQueue/userChatQueue.rpc.js
index 4d6bc21..5caff73 100644
--- a/server/api/userChatQueue/userChatQueue.rpc.js
+++ b/server/api/userChatQueue/userChatQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userFaxQueue/index.js b/server/api/userFaxQueue/index.js
index d48bc34..d577d1f 100644
--- a/server/api/userFaxQueue/index.js
+++ b/server/api/userFaxQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userFaxQueue/userFaxQueue.attributes.js b/server/api/userFaxQueue/userFaxQueue.attributes.js
index d6d6142..2fdce19 100644
--- a/server/api/userFaxQueue/userFaxQueue.attributes.js
+++ b/server/api/userFaxQueue/userFaxQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userFaxQueue/userFaxQueue.model.js b/server/api/userFaxQueue/userFaxQueue.model.js
index 03ca6a3..3a7dad1 100644
--- a/server/api/userFaxQueue/userFaxQueue.model.js
+++ b/server/api/userFaxQueue/userFaxQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userFaxQueue/userFaxQueue.rpc.js b/server/api/userFaxQueue/userFaxQueue.rpc.js
index 061e963..0dffd8c 100644
--- a/server/api/userFaxQueue/userFaxQueue.rpc.js
+++ b/server/api/userFaxQueue/userFaxQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userMailQueue/index.js b/server/api/userMailQueue/index.js
index e23f5a4..8ff4e4f 100644
--- a/server/api/userMailQueue/index.js
+++ b/server/api/userMailQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userMailQueue/userMailQueue.attributes.js b/server/api/userMailQueue/userMailQueue.attributes.js
index ec4771e..bffad4b 100644
--- a/server/api/userMailQueue/userMailQueue.attributes.js
+++ b/server/api/userMailQueue/userMailQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x5e17=['sequelize'];(function(_0xfae23b,_0x2be4ba){var _0x200640=function(_0x4ae258){while(--_0x4ae258){_0xfae23b['push'](_0xfae23b['shift']());}};_0x200640(++_0x2be4ba);}(_0x5e17,0x17a));var _0x75e1=function(_0x3bf5b9,_0x580838){_0x3bf5b9=_0x3bf5b9-0x0;var _0x672ee8=_0x5e17[_0x3bf5b9];return _0x672ee8;};'use strict';var Sequelize=require(_0x75e1('0x0'));module['exports']={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
+var _0x9f9a=['sequelize','exports','INTEGER'];(function(_0x144c0c,_0x113cfe){var _0x436221=function(_0x231dd7){while(--_0x231dd7){_0x144c0c['push'](_0x144c0c['shift']());}};_0x436221(++_0x113cfe);}(_0x9f9a,0x12c));var _0xa9f9=function(_0x5ff517,_0x3e4ee0){_0x5ff517=_0x5ff517-0x0;var _0x19a245=_0x9f9a[_0x5ff517];return _0x19a245;};'use strict';var Sequelize=require(_0xa9f9('0x0'));module[_0xa9f9('0x1')]={'penalty':{'type':Sequelize[_0xa9f9('0x2')],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userMailQueue/userMailQueue.model.js b/server/api/userMailQueue/userMailQueue.model.js
index b8f4948..6b44f11 100644
--- a/server/api/userMailQueue/userMailQueue.model.js
+++ b/server/api/userMailQueue/userMailQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userMailQueue/userMailQueue.rpc.js b/server/api/userMailQueue/userMailQueue.rpc.js
index 56fbfcb..c50baf9 100644
--- a/server/api/userMailQueue/userMailQueue.rpc.js
+++ b/server/api/userMailQueue/userMailQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/index.js b/server/api/userNotification/index.js
index cce2ec9..9234398 100644
--- a/server/api/userNotification/index.js
+++ b/server/api/userNotification/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.attributes.js b/server/api/userNotification/userNotification.attributes.js
index a2df455..cffceba 100644
--- a/server/api/userNotification/userNotification.attributes.js
+++ b/server/api/userNotification/userNotification.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.controller.js b/server/api/userNotification/userNotification.controller.js
index b4fcdaf..76f8aba 100644
--- a/server/api/userNotification/userNotification.controller.js
+++ b/server/api/userNotification/userNotification.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.events.js b/server/api/userNotification/userNotification.events.js
index 38561ec..2871911 100644
--- a/server/api/userNotification/userNotification.events.js
+++ b/server/api/userNotification/userNotification.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.model.js b/server/api/userNotification/userNotification.model.js
index d1ac141..69d571e 100644
--- a/server/api/userNotification/userNotification.model.js
+++ b/server/api/userNotification/userNotification.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.rpc.js b/server/api/userNotification/userNotification.rpc.js
index 5fde549..b18dfe1 100644
--- a/server/api/userNotification/userNotification.rpc.js
+++ b/server/api/userNotification/userNotification.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userNotification/userNotification.socket.js b/server/api/userNotification/userNotification.socket.js
index eed7f8c..e82b931 100644
--- a/server/api/userNotification/userNotification.socket.js
+++ b/server/api/userNotification/userNotification.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userOpenchannelQueue/index.js b/server/api/userOpenchannelQueue/index.js
index d635ba0..e716ca2 100644
--- a/server/api/userOpenchannelQueue/index.js
+++ b/server/api/userOpenchannelQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userOpenchannelQueue/userOpenchannelQueue.attributes.js b/server/api/userOpenchannelQueue/userOpenchannelQueue.attributes.js
index ff75b3f..c1b0301 100644
--- a/server/api/userOpenchannelQueue/userOpenchannelQueue.attributes.js
+++ b/server/api/userOpenchannelQueue/userOpenchannelQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xbad4=['exports','sequelize'];(function(_0x2d6608,_0x5c1342){var _0x1d3605=function(_0x2e9a60){while(--_0x2e9a60){_0x2d6608['push'](_0x2d6608['shift']());}};_0x1d3605(++_0x5c1342);}(_0xbad4,0x19d));var _0x4bad=function(_0x1d09cd,_0x41e7ba){_0x1d09cd=_0x1d09cd-0x0;var _0x6f0562=_0xbad4[_0x1d09cd];return _0x6f0562;};'use strict';var Sequelize=require(_0x4bad('0x0'));module[_0x4bad('0x1')]={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
+var _0xedb4=['exports','sequelize'];(function(_0x2763f2,_0x416af8){var _0x3ef471=function(_0x288aa2){while(--_0x288aa2){_0x2763f2['push'](_0x2763f2['shift']());}};_0x3ef471(++_0x416af8);}(_0xedb4,0x15b));var _0x4edb=function(_0x3a60b8,_0x47caab){_0x3a60b8=_0x3a60b8-0x0;var _0x4eb583=_0xedb4[_0x3a60b8];return _0x4eb583;};'use strict';var Sequelize=require(_0x4edb('0x0'));module[_0x4edb('0x1')]={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userOpenchannelQueue/userOpenchannelQueue.model.js b/server/api/userOpenchannelQueue/userOpenchannelQueue.model.js
index c76365c..faabfe0 100644
--- a/server/api/userOpenchannelQueue/userOpenchannelQueue.model.js
+++ b/server/api/userOpenchannelQueue/userOpenchannelQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userOpenchannelQueue/userOpenchannelQueue.rpc.js b/server/api/userOpenchannelQueue/userOpenchannelQueue.rpc.js
index b5cdfd5..636177e 100644
--- a/server/api/userOpenchannelQueue/userOpenchannelQueue.rpc.js
+++ b/server/api/userOpenchannelQueue/userOpenchannelQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/index.js b/server/api/userProfile/index.js
index f35e95b..d761c0e 100644
--- a/server/api/userProfile/index.js
+++ b/server/api/userProfile/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.attributes.js b/server/api/userProfile/userProfile.attributes.js
index a2e9011..e686337 100644
--- a/server/api/userProfile/userProfile.attributes.js
+++ b/server/api/userProfile/userProfile.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.controller.js b/server/api/userProfile/userProfile.controller.js
index a2dc8ce..d056bb5 100644
--- a/server/api/userProfile/userProfile.controller.js
+++ b/server/api/userProfile/userProfile.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.events.js b/server/api/userProfile/userProfile.events.js
index 68c4285..38f95a3 100644
--- a/server/api/userProfile/userProfile.events.js
+++ b/server/api/userProfile/userProfile.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.model.js b/server/api/userProfile/userProfile.model.js
index b069a74..bbcb314 100644
--- a/server/api/userProfile/userProfile.model.js
+++ b/server/api/userProfile/userProfile.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.rpc.js b/server/api/userProfile/userProfile.rpc.js
index 72e1c1f..ebc7646 100644
--- a/server/api/userProfile/userProfile.rpc.js
+++ b/server/api/userProfile/userProfile.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfile/userProfile.socket.js b/server/api/userProfile/userProfile.socket.js
index 5a726d0..dbf8468 100644
--- a/server/api/userProfile/userProfile.socket.js
+++ b/server/api/userProfile/userProfile.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileResource/index.js b/server/api/userProfileResource/index.js
index 43a15cd..95b7b56 100644
--- a/server/api/userProfileResource/index.js
+++ b/server/api/userProfileResource/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileResource/userProfileResource.attributes.js b/server/api/userProfileResource/userProfileResource.attributes.js
index d87d541..8fc765f 100644
--- a/server/api/userProfileResource/userProfileResource.attributes.js
+++ b/server/api/userProfileResource/userProfileResource.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileResource/userProfileResource.controller.js b/server/api/userProfileResource/userProfileResource.controller.js
index 65f5e2e..8554732 100644
--- a/server/api/userProfileResource/userProfileResource.controller.js
+++ b/server/api/userProfileResource/userProfileResource.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileResource/userProfileResource.model.js b/server/api/userProfileResource/userProfileResource.model.js
index c11961f..691e113 100644
--- a/server/api/userProfileResource/userProfileResource.model.js
+++ b/server/api/userProfileResource/userProfileResource.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileResource/userProfileResource.rpc.js b/server/api/userProfileResource/userProfileResource.rpc.js
index fe124dc..9f7226b 100644
--- a/server/api/userProfileResource/userProfileResource.rpc.js
+++ b/server/api/userProfileResource/userProfileResource.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileSection/index.js b/server/api/userProfileSection/index.js
index 89cf930..f4ccda2 100644
--- a/server/api/userProfileSection/index.js
+++ b/server/api/userProfileSection/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileSection/userProfileSection.attributes.js b/server/api/userProfileSection/userProfileSection.attributes.js
index c289b8d..711cf87 100644
--- a/server/api/userProfileSection/userProfileSection.attributes.js
+++ b/server/api/userProfileSection/userProfileSection.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileSection/userProfileSection.controller.js b/server/api/userProfileSection/userProfileSection.controller.js
index 51cc589..d74819f 100644
--- a/server/api/userProfileSection/userProfileSection.controller.js
+++ b/server/api/userProfileSection/userProfileSection.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileSection/userProfileSection.model.js b/server/api/userProfileSection/userProfileSection.model.js
index d08520e..59c2fd1 100644
--- a/server/api/userProfileSection/userProfileSection.model.js
+++ b/server/api/userProfileSection/userProfileSection.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userProfileSection/userProfileSection.rpc.js b/server/api/userProfileSection/userProfileSection.rpc.js
index 2016949..e64be7e 100644
--- a/server/api/userProfileSection/userProfileSection.rpc.js
+++ b/server/api/userProfileSection/userProfileSection.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userSmsQueue/index.js b/server/api/userSmsQueue/index.js
index 383ad2d..1ee32c4 100644
--- a/server/api/userSmsQueue/index.js
+++ b/server/api/userSmsQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userSmsQueue/userSmsQueue.attributes.js b/server/api/userSmsQueue/userSmsQueue.attributes.js
index e61a66a..9006424 100644
--- a/server/api/userSmsQueue/userSmsQueue.attributes.js
+++ b/server/api/userSmsQueue/userSmsQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x81a2=['exports','INTEGER','sequelize'];(function(_0x4aec89,_0x2b8ca5){var _0x1e59d1=function(_0x556568){while(--_0x556568){_0x4aec89['push'](_0x4aec89['shift']());}};_0x1e59d1(++_0x2b8ca5);}(_0x81a2,0x13a));var _0x281a=function(_0x1da8c2,_0x40d524){_0x1da8c2=_0x1da8c2-0x0;var _0x242cbf=_0x81a2[_0x1da8c2];return _0x242cbf;};'use strict';var Sequelize=require(_0x281a('0x0'));module[_0x281a('0x1')]={'penalty':{'type':Sequelize[_0x281a('0x2')],'defaultValue':0x0}};
\ No newline at end of file
+'use strict';var Sequelize=require('sequelize');module['exports']={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userSmsQueue/userSmsQueue.model.js b/server/api/userSmsQueue/userSmsQueue.model.js
index 6333ccd..7843d0e 100644
--- a/server/api/userSmsQueue/userSmsQueue.model.js
+++ b/server/api/userSmsQueue/userSmsQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userSmsQueue/userSmsQueue.rpc.js b/server/api/userSmsQueue/userSmsQueue.rpc.js
index ed7e9c3..597823e 100644
--- a/server/api/userSmsQueue/userSmsQueue.rpc.js
+++ b/server/api/userSmsQueue/userSmsQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/realtime/realtime.model.js b/server/api/userVoicePrefix/userVoicePrefix.attributes.js
similarity index 60%
rename from server/api/realtime/realtime.model.js
rename to server/api/userVoicePrefix/userVoicePrefix.attributes.js
index 5b2a371..b7753d2 100644
--- a/server/api/realtime/realtime.model.js
+++ b/server/api/userVoicePrefix/userVoicePrefix.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
+var _0xbb35=['INTEGER','sequelize'];(function(_0x48180c,_0x4557c6){var _0x1825a9=function(_0x4833b2){while(--_0x4833b2){_0x48180c['push'](_0x48180c['shift']());}};_0x1825a9(++_0x4557c6);}(_0xbb35,0x67));var _0x5bb3=function(_0x8b24b4,_0x18b40e){_0x8b24b4=_0x8b24b4-0x0;var _0x32297f=_0xbb35[_0x8b24b4];return _0x32297f;};'use strict';var Sequelize=require(_0x5bb3('0x0'));module['exports']={'UserId':{'type':Sequelize[_0x5bb3('0x1')]},'VoicePrefixId':{'type':Sequelize['INTEGER']}};
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.model.js b/server/api/userVoicePrefix/userVoicePrefix.model.js
similarity index 55%
rename from server/api/contactItemType/contactItemType.model.js
rename to server/api/userVoicePrefix/userVoicePrefix.model.js
index 0df1231..f9fab30 100644
--- a/server/api/contactItemType/contactItemType.model.js
+++ b/server/api/userVoicePrefix/userVoicePrefix.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueue/index.js b/server/api/userVoiceQueue/index.js
index aae150e..1f44a0b 100644
--- a/server/api/userVoiceQueue/index.js
+++ b/server/api/userVoiceQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueue/userVoiceQueue.attributes.js b/server/api/userVoiceQueue/userVoiceQueue.attributes.js
index eb82321..87361dd 100644
--- a/server/api/userVoiceQueue/userVoiceQueue.attributes.js
+++ b/server/api/userVoiceQueue/userVoiceQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x8033=['exports'];(function(_0x20b460,_0x405fd7){var _0x2eb0c3=function(_0x5b2441){while(--_0x5b2441){_0x20b460['push'](_0x20b460['shift']());}};_0x2eb0c3(++_0x405fd7);}(_0x8033,0x1d1));var _0x3803=function(_0x20db55,_0x4a484c){_0x20db55=_0x20db55-0x0;var _0x33bc37=_0x8033[_0x20db55];return _0x33bc37;};'use strict';var Sequelize=require('sequelize');module[_0x3803('0x0')]={'penalty':{'type':Sequelize['INTEGER'],'defaultValue':0x0}};
\ No newline at end of file
+var _0x970d=['INTEGER','sequelize','exports'];(function(_0x475fd9,_0x4d7306){var _0x1b6ebc=function(_0x26a5a8){while(--_0x26a5a8){_0x475fd9['push'](_0x475fd9['shift']());}};_0x1b6ebc(++_0x4d7306);}(_0x970d,0x14e));var _0xd970=function(_0x417955,_0x4ed8c8){_0x417955=_0x417955-0x0;var _0x3a94ef=_0x970d[_0x417955];return _0x3a94ef;};'use strict';var Sequelize=require(_0xd970('0x0'));module[_0xd970('0x1')]={'penalty':{'type':Sequelize[_0xd970('0x2')],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userVoiceQueue/userVoiceQueue.model.js b/server/api/userVoiceQueue/userVoiceQueue.model.js
index 0f312d6..b3d71a4 100644
--- a/server/api/userVoiceQueue/userVoiceQueue.model.js
+++ b/server/api/userVoiceQueue/userVoiceQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueue/userVoiceQueue.rpc.js b/server/api/userVoiceQueue/userVoiceQueue.rpc.js
index 77a944b..deaacc3 100644
--- a/server/api/userVoiceQueue/userVoiceQueue.rpc.js
+++ b/server/api/userVoiceQueue/userVoiceQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/index.js b/server/api/userVoiceQueueRt/index.js
index 062cdd2..42d5dfa 100644
--- a/server/api/userVoiceQueueRt/index.js
+++ b/server/api/userVoiceQueueRt/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/userVoiceQueueRt.attributes.js b/server/api/userVoiceQueueRt/userVoiceQueueRt.attributes.js
index 4f76207..46341c1 100644
--- a/server/api/userVoiceQueueRt/userVoiceQueueRt.attributes.js
+++ b/server/api/userVoiceQueueRt/userVoiceQueueRt.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/userVoiceQueueRt.events.js b/server/api/userVoiceQueueRt/userVoiceQueueRt.events.js
index 8d76f0f..ca7f162 100644
--- a/server/api/userVoiceQueueRt/userVoiceQueueRt.events.js
+++ b/server/api/userVoiceQueueRt/userVoiceQueueRt.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/userVoiceQueueRt.model.js b/server/api/userVoiceQueueRt/userVoiceQueueRt.model.js
index 692b0dd..138292d 100644
--- a/server/api/userVoiceQueueRt/userVoiceQueueRt.model.js
+++ b/server/api/userVoiceQueueRt/userVoiceQueueRt.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/userVoiceQueueRt.rpc.js b/server/api/userVoiceQueueRt/userVoiceQueueRt.rpc.js
index 8611f24..8d7fd06 100644
--- a/server/api/userVoiceQueueRt/userVoiceQueueRt.rpc.js
+++ b/server/api/userVoiceQueueRt/userVoiceQueueRt.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userVoiceQueueRt/userVoiceQueueRt.socket.js b/server/api/userVoiceQueueRt/userVoiceQueueRt.socket.js
index 33c3439..eaef676 100644
--- a/server/api/userVoiceQueueRt/userVoiceQueueRt.socket.js
+++ b/server/api/userVoiceQueueRt/userVoiceQueueRt.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userWhatsappQueue/index.js b/server/api/userWhatsappQueue/index.js
index 4a09c13..c832cbb 100644
--- a/server/api/userWhatsappQueue/index.js
+++ b/server/api/userWhatsappQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userWhatsappQueue/userWhatsappQueue.attributes.js b/server/api/userWhatsappQueue/userWhatsappQueue.attributes.js
index 8356800..608d446 100644
--- a/server/api/userWhatsappQueue/userWhatsappQueue.attributes.js
+++ b/server/api/userWhatsappQueue/userWhatsappQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xddf6=['INTEGER','exports'];(function(_0x64de37,_0x1e1090){var _0x44b88e=function(_0x122bff){while(--_0x122bff){_0x64de37['push'](_0x64de37['shift']());}};_0x44b88e(++_0x1e1090);}(_0xddf6,0xf7));var _0x6ddf=function(_0x4964b6,_0x6186cf){_0x4964b6=_0x4964b6-0x0;var _0x3d6b37=_0xddf6[_0x4964b6];return _0x3d6b37;};'use strict';var Sequelize=require('sequelize');module[_0x6ddf('0x0')]={'penalty':{'type':Sequelize[_0x6ddf('0x1')],'defaultValue':0x0}};
\ No newline at end of file
+var _0x0c29=['INTEGER'];(function(_0x5b644e,_0x2e5e07){var _0x49c6bf=function(_0x3032d9){while(--_0x3032d9){_0x5b644e['push'](_0x5b644e['shift']());}};_0x49c6bf(++_0x2e5e07);}(_0x0c29,0xb7));var _0x90c2=function(_0x2a238a,_0x1d5054){_0x2a238a=_0x2a238a-0x0;var _0xeef802=_0x0c29[_0x2a238a];return _0xeef802;};'use strict';var Sequelize=require('sequelize');module['exports']={'penalty':{'type':Sequelize[_0x90c2('0x0')],'defaultValue':0x0}};
\ No newline at end of file
diff --git a/server/api/userWhatsappQueue/userWhatsappQueue.model.js b/server/api/userWhatsappQueue/userWhatsappQueue.model.js
index e359293..a4c896c 100644
--- a/server/api/userWhatsappQueue/userWhatsappQueue.model.js
+++ b/server/api/userWhatsappQueue/userWhatsappQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/userWhatsappQueue/userWhatsappQueue.rpc.js b/server/api/userWhatsappQueue/userWhatsappQueue.rpc.js
index 56ae39d..a1ffd88 100644
--- a/server/api/userWhatsappQueue/userWhatsappQueue.rpc.js
+++ b/server/api/userWhatsappQueue/userWhatsappQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/variable/index.js b/server/api/variable/index.js
index 33a2254..1e8b275 100644
--- a/server/api/variable/index.js
+++ b/server/api/variable/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/variable/variable.attributes.js b/server/api/variable/variable.attributes.js
index 0088297..3c0c346 100644
--- a/server/api/variable/variable.attributes.js
+++ b/server/api/variable/variable.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/variable/variable.controller.js b/server/api/variable/variable.controller.js
index 17307ac..48e197a 100644
--- a/server/api/variable/variable.controller.js
+++ b/server/api/variable/variable.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/variable/variable.model.js b/server/api/variable/variable.model.js
index ad2ebca..341b942 100644
--- a/server/api/variable/variable.model.js
+++ b/server/api/variable/variable.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/variable/variable.rpc.js b/server/api/variable/variable.rpc.js
index f458f5b..ccf30d4 100644
--- a/server/api/variable/variable.rpc.js
+++ b/server/api/variable/variable.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/version/index.js b/server/api/version/index.js
index 10a7127..606c6b9 100644
--- a/server/api/version/index.js
+++ b/server/api/version/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/version/version.controller.js b/server/api/version/version.controller.js
index 7306d1c..824486a 100644
--- a/server/api/version/version.controller.js
+++ b/server/api/version/version.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceAgentReport/index.js b/server/api/voiceAgentReport/index.js
index bc57a6c..949e2d4 100644
--- a/server/api/voiceAgentReport/index.js
+++ b/server/api/voiceAgentReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceAgentReport/voiceAgentReport.attributes.js b/server/api/voiceAgentReport/voiceAgentReport.attributes.js
index 2f2cf69..e2b8225 100644
--- a/server/api/voiceAgentReport/voiceAgentReport.attributes.js
+++ b/server/api/voiceAgentReport/voiceAgentReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceAgentReport/voiceAgentReport.controller.js b/server/api/voiceAgentReport/voiceAgentReport.controller.js
index c27215b..bf12415 100644
--- a/server/api/voiceAgentReport/voiceAgentReport.controller.js
+++ b/server/api/voiceAgentReport/voiceAgentReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceAgentReport/voiceAgentReport.model.js b/server/api/voiceAgentReport/voiceAgentReport.model.js
index 38ff86a..c74d17a 100644
--- a/server/api/voiceAgentReport/voiceAgentReport.model.js
+++ b/server/api/voiceAgentReport/voiceAgentReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceAgentReport/voiceAgentReport.rpc.js b/server/api/voiceAgentReport/voiceAgentReport.rpc.js
index b029fba..741d6f6 100644
--- a/server/api/voiceAgentReport/voiceAgentReport.rpc.js
+++ b/server/api/voiceAgentReport/voiceAgentReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceCallReport/index.js b/server/api/voiceCallReport/index.js
index f9b0160..6fc006a 100644
--- a/server/api/voiceCallReport/index.js
+++ b/server/api/voiceCallReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceCallReport/voiceCallReport.attributes.js b/server/api/voiceCallReport/voiceCallReport.attributes.js
index 99ff884..48037e7 100644
--- a/server/api/voiceCallReport/voiceCallReport.attributes.js
+++ b/server/api/voiceCallReport/voiceCallReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceCallReport/voiceCallReport.controller.js b/server/api/voiceCallReport/voiceCallReport.controller.js
index 60c666a..057c38f 100644
--- a/server/api/voiceCallReport/voiceCallReport.controller.js
+++ b/server/api/voiceCallReport/voiceCallReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceCallReport/voiceCallReport.model.js b/server/api/voiceCallReport/voiceCallReport.model.js
index 748d46f..1e47c4b 100644
--- a/server/api/voiceCallReport/voiceCallReport.model.js
+++ b/server/api/voiceCallReport/voiceCallReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceCallReport/voiceCallReport.rpc.js b/server/api/voiceCallReport/voiceCallReport.rpc.js
index 2a960ea..8c3eb0c 100644
--- a/server/api/voiceCallReport/voiceCallReport.rpc.js
+++ b/server/api/voiceCallReport/voiceCallReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceChanSpy/index.js b/server/api/voiceChanSpy/index.js
index b7c6fab..f5c3d3d 100644
--- a/server/api/voiceChanSpy/index.js
+++ b/server/api/voiceChanSpy/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceChanSpy/voiceChanSpy.attributes.js b/server/api/voiceChanSpy/voiceChanSpy.attributes.js
index 9964866..1a63487 100644
--- a/server/api/voiceChanSpy/voiceChanSpy.attributes.js
+++ b/server/api/voiceChanSpy/voiceChanSpy.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceChanSpy/voiceChanSpy.controller.js b/server/api/voiceChanSpy/voiceChanSpy.controller.js
index 2eea483..29a2ce4 100644
--- a/server/api/voiceChanSpy/voiceChanSpy.controller.js
+++ b/server/api/voiceChanSpy/voiceChanSpy.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceChanSpy/voiceChanSpy.model.js b/server/api/voiceChanSpy/voiceChanSpy.model.js
index 64a9e10..20338d0 100644
--- a/server/api/voiceChanSpy/voiceChanSpy.model.js
+++ b/server/api/voiceChanSpy/voiceChanSpy.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceChanSpy/voiceChanSpy.rpc.js b/server/api/voiceChanSpy/voiceChanSpy.rpc.js
index 9922ab3..aa985dc 100644
--- a/server/api/voiceChanSpy/voiceChanSpy.rpc.js
+++ b/server/api/voiceChanSpy/voiceChanSpy.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceContext/index.js b/server/api/voiceContext/index.js
index 56171ec..30eaa17 100644
--- a/server/api/voiceContext/index.js
+++ b/server/api/voiceContext/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceContext/voiceContext.attributes.js b/server/api/voiceContext/voiceContext.attributes.js
index 4ad43cf..d0cd4ac 100644
--- a/server/api/voiceContext/voiceContext.attributes.js
+++ b/server/api/voiceContext/voiceContext.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceContext/voiceContext.controller.js b/server/api/voiceContext/voiceContext.controller.js
index 4481e8b..8cd6634 100644
--- a/server/api/voiceContext/voiceContext.controller.js
+++ b/server/api/voiceContext/voiceContext.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceContext/voiceContext.model.js b/server/api/voiceContext/voiceContext.model.js
index 91d57ab..51e70da 100644
--- a/server/api/voiceContext/voiceContext.model.js
+++ b/server/api/voiceContext/voiceContext.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceContext/voiceContext.rpc.js b/server/api/voiceContext/voiceContext.rpc.js
index 87cb3b6..c6db1f1 100644
--- a/server/api/voiceContext/voiceContext.rpc.js
+++ b/server/api/voiceContext/voiceContext.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceDialReport/index.js b/server/api/voiceDialReport/index.js
index c0ff08c..84d306e 100644
--- a/server/api/voiceDialReport/index.js
+++ b/server/api/voiceDialReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceDialReport/voiceDialReport.attributes.js b/server/api/voiceDialReport/voiceDialReport.attributes.js
index cda1c20..e152c30 100644
--- a/server/api/voiceDialReport/voiceDialReport.attributes.js
+++ b/server/api/voiceDialReport/voiceDialReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceDialReport/voiceDialReport.controller.js b/server/api/voiceDialReport/voiceDialReport.controller.js
index bccef12..907dbbc 100644
--- a/server/api/voiceDialReport/voiceDialReport.controller.js
+++ b/server/api/voiceDialReport/voiceDialReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceDialReport/voiceDialReport.model.js b/server/api/voiceDialReport/voiceDialReport.model.js
index e5cc97b..543ddc9 100644
--- a/server/api/voiceDialReport/voiceDialReport.model.js
+++ b/server/api/voiceDialReport/voiceDialReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceDialReport/voiceDialReport.rpc.js b/server/api/voiceDialReport/voiceDialReport.rpc.js
index 9138c3b..a3f6a80 100644
--- a/server/api/voiceDialReport/voiceDialReport.rpc.js
+++ b/server/api/voiceDialReport/voiceDialReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/index.js b/server/api/voiceExtension/index.js
index 4d24a8d..3530aa7 100644
--- a/server/api/voiceExtension/index.js
+++ b/server/api/voiceExtension/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.attributes.js b/server/api/voiceExtension/voiceExtension.attributes.js
index ad6f3bb..65b9e9b 100644
--- a/server/api/voiceExtension/voiceExtension.attributes.js
+++ b/server/api/voiceExtension/voiceExtension.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.controller.js b/server/api/voiceExtension/voiceExtension.controller.js
index 833b389..28e1957 100644
--- a/server/api/voiceExtension/voiceExtension.controller.js
+++ b/server/api/voiceExtension/voiceExtension.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.events.js b/server/api/voiceExtension/voiceExtension.events.js
index d3f003d..523bd21 100644
--- a/server/api/voiceExtension/voiceExtension.events.js
+++ b/server/api/voiceExtension/voiceExtension.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.model.js b/server/api/voiceExtension/voiceExtension.model.js
index b48425c..d5c883a 100644
--- a/server/api/voiceExtension/voiceExtension.model.js
+++ b/server/api/voiceExtension/voiceExtension.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.rpc.js b/server/api/voiceExtension/voiceExtension.rpc.js
index f465bc0..bb0d57c 100644
--- a/server/api/voiceExtension/voiceExtension.rpc.js
+++ b/server/api/voiceExtension/voiceExtension.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceExtension/voiceExtension.socket.js b/server/api/voiceExtension/voiceExtension.socket.js
index 948e75f..f9986a4 100644
--- a/server/api/voiceExtension/voiceExtension.socket.js
+++ b/server/api/voiceExtension/voiceExtension.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMail/index.js b/server/api/voiceMail/index.js
index 6753f06..1b55570 100644
--- a/server/api/voiceMail/index.js
+++ b/server/api/voiceMail/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMail/voiceMail.attributes.js b/server/api/voiceMail/voiceMail.attributes.js
index a667b07..51938d7 100644
--- a/server/api/voiceMail/voiceMail.attributes.js
+++ b/server/api/voiceMail/voiceMail.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMail/voiceMail.controller.js b/server/api/voiceMail/voiceMail.controller.js
index b0da9cb..d9c58a6 100644
--- a/server/api/voiceMail/voiceMail.controller.js
+++ b/server/api/voiceMail/voiceMail.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMail/voiceMail.model.js b/server/api/voiceMail/voiceMail.model.js
index e47a9bd..ca1fba7 100644
--- a/server/api/voiceMail/voiceMail.model.js
+++ b/server/api/voiceMail/voiceMail.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMail/voiceMail.rpc.js b/server/api/voiceMail/voiceMail.rpc.js
index 4371d61..e8845d4 100644
--- a/server/api/voiceMail/voiceMail.rpc.js
+++ b/server/api/voiceMail/voiceMail.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMailMessage/index.js b/server/api/voiceMailMessage/index.js
index f1e44bf..57941da 100644
--- a/server/api/voiceMailMessage/index.js
+++ b/server/api/voiceMailMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMailMessage/voiceMailMessage.attributes.js b/server/api/voiceMailMessage/voiceMailMessage.attributes.js
index 1b4b4b9..dea913d 100644
--- a/server/api/voiceMailMessage/voiceMailMessage.attributes.js
+++ b/server/api/voiceMailMessage/voiceMailMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMailMessage/voiceMailMessage.controller.js b/server/api/voiceMailMessage/voiceMailMessage.controller.js
index 8ff539f..ddef3ff 100644
--- a/server/api/voiceMailMessage/voiceMailMessage.controller.js
+++ b/server/api/voiceMailMessage/voiceMailMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMailMessage/voiceMailMessage.model.js b/server/api/voiceMailMessage/voiceMailMessage.model.js
index fc39c47..6465aa9 100644
--- a/server/api/voiceMailMessage/voiceMailMessage.model.js
+++ b/server/api/voiceMailMessage/voiceMailMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMailMessage/voiceMailMessage.rpc.js b/server/api/voiceMailMessage/voiceMailMessage.rpc.js
index 2199c09..8f8e10c 100644
--- a/server/api/voiceMailMessage/voiceMailMessage.rpc.js
+++ b/server/api/voiceMailMessage/voiceMailMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMusicOnHold/index.js b/server/api/voiceMusicOnHold/index.js
index 2063fe6..d663482 100644
--- a/server/api/voiceMusicOnHold/index.js
+++ b/server/api/voiceMusicOnHold/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMusicOnHold/voiceMusicOnHold.attributes.js b/server/api/voiceMusicOnHold/voiceMusicOnHold.attributes.js
index a05d892..b1e1f6c 100644
--- a/server/api/voiceMusicOnHold/voiceMusicOnHold.attributes.js
+++ b/server/api/voiceMusicOnHold/voiceMusicOnHold.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMusicOnHold/voiceMusicOnHold.controller.js b/server/api/voiceMusicOnHold/voiceMusicOnHold.controller.js
index 3b81986..73b5d9a 100644
--- a/server/api/voiceMusicOnHold/voiceMusicOnHold.controller.js
+++ b/server/api/voiceMusicOnHold/voiceMusicOnHold.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMusicOnHold/voiceMusicOnHold.model.js b/server/api/voiceMusicOnHold/voiceMusicOnHold.model.js
index a2cc85b..911575a 100644
--- a/server/api/voiceMusicOnHold/voiceMusicOnHold.model.js
+++ b/server/api/voiceMusicOnHold/voiceMusicOnHold.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceMusicOnHold/voiceMusicOnHold.rpc.js b/server/api/voiceMusicOnHold/voiceMusicOnHold.rpc.js
index b49ae60..9a4d7dc 100644
--- a/server/api/voiceMusicOnHold/voiceMusicOnHold.rpc.js
+++ b/server/api/voiceMusicOnHold/voiceMusicOnHold.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/index.js b/server/api/voicePrefix/index.js
index dbf984c..95b4bff 100644
--- a/server/api/voicePrefix/index.js
+++ b/server/api/voicePrefix/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.attributes.js b/server/api/voicePrefix/voicePrefix.attributes.js
index 5877ace..7428e5d 100644
--- a/server/api/voicePrefix/voicePrefix.attributes.js
+++ b/server/api/voicePrefix/voicePrefix.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.controller.js b/server/api/voicePrefix/voicePrefix.controller.js
index 83c203e..f352bff 100644
--- a/server/api/voicePrefix/voicePrefix.controller.js
+++ b/server/api/voicePrefix/voicePrefix.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.events.js b/server/api/voicePrefix/voicePrefix.events.js
index 8dd4a8b..f2593dc 100644
--- a/server/api/voicePrefix/voicePrefix.events.js
+++ b/server/api/voicePrefix/voicePrefix.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.model.js b/server/api/voicePrefix/voicePrefix.model.js
index a8c1ac6..ef904bd 100644
--- a/server/api/voicePrefix/voicePrefix.model.js
+++ b/server/api/voicePrefix/voicePrefix.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.rpc.js b/server/api/voicePrefix/voicePrefix.rpc.js
index 0f7d73a..020386a 100644
--- a/server/api/voicePrefix/voicePrefix.rpc.js
+++ b/server/api/voicePrefix/voicePrefix.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voicePrefix/voicePrefix.socket.js b/server/api/voicePrefix/voicePrefix.socket.js
index 51819c3..544e161 100644
--- a/server/api/voicePrefix/voicePrefix.socket.js
+++ b/server/api/voicePrefix/voicePrefix.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/index.js b/server/api/voiceQueue/index.js
index 577fc2b..643b513 100644
--- a/server/api/voiceQueue/index.js
+++ b/server/api/voiceQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.attributes.js b/server/api/voiceQueue/voiceQueue.attributes.js
index 7cbaabc..2d05061 100644
--- a/server/api/voiceQueue/voiceQueue.attributes.js
+++ b/server/api/voiceQueue/voiceQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.controller.js b/server/api/voiceQueue/voiceQueue.controller.js
index 95d408e..78828c7 100644
--- a/server/api/voiceQueue/voiceQueue.controller.js
+++ b/server/api/voiceQueue/voiceQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.events.js b/server/api/voiceQueue/voiceQueue.events.js
index dd55a2b..6d43a2c 100644
--- a/server/api/voiceQueue/voiceQueue.events.js
+++ b/server/api/voiceQueue/voiceQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.model.js b/server/api/voiceQueue/voiceQueue.model.js
index e256e47..f86a7b5 100644
--- a/server/api/voiceQueue/voiceQueue.model.js
+++ b/server/api/voiceQueue/voiceQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.rpc.js b/server/api/voiceQueue/voiceQueue.rpc.js
index 5d954a8..496a62f 100644
--- a/server/api/voiceQueue/voiceQueue.rpc.js
+++ b/server/api/voiceQueue/voiceQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueue/voiceQueue.socket.js b/server/api/voiceQueue/voiceQueue.socket.js
index ccf1b32..8b3b771 100644
--- a/server/api/voiceQueue/voiceQueue.socket.js
+++ b/server/api/voiceQueue/voiceQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/index.js b/server/api/voiceQueueReport/index.js
index 1fe78ac..7022e4c 100644
--- a/server/api/voiceQueueReport/index.js
+++ b/server/api/voiceQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.attributes.js b/server/api/voiceQueueReport/voiceQueueReport.attributes.js
index 155af20..1caa6c2 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.attributes.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.controller.js b/server/api/voiceQueueReport/voiceQueueReport.controller.js
index bb3e1df..8baea30 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.controller.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.events.js b/server/api/voiceQueueReport/voiceQueueReport.events.js
index 56b295c..657ec78 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.events.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.model.js b/server/api/voiceQueueReport/voiceQueueReport.model.js
index 3f2a9c3..19aa1f6 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.model.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.rpc.js b/server/api/voiceQueueReport/voiceQueueReport.rpc.js
index 315ff5e..82c69a1 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.rpc.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueueReport/voiceQueueReport.socket.js b/server/api/voiceQueueReport/voiceQueueReport.socket.js
index aecda8d..3777c16 100644
--- a/server/api/voiceQueueReport/voiceQueueReport.socket.js
+++ b/server/api/voiceQueueReport/voiceQueueReport.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueuesLog/index.js b/server/api/voiceQueuesLog/index.js
index 56f9f79..2ab3bd3 100644
--- a/server/api/voiceQueuesLog/index.js
+++ b/server/api/voiceQueuesLog/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueuesLog/voiceQueuesLog.attributes.js b/server/api/voiceQueuesLog/voiceQueuesLog.attributes.js
index e1c5c91..b77f932 100644
--- a/server/api/voiceQueuesLog/voiceQueuesLog.attributes.js
+++ b/server/api/voiceQueuesLog/voiceQueuesLog.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueuesLog/voiceQueuesLog.controller.js b/server/api/voiceQueuesLog/voiceQueuesLog.controller.js
index f77415e..c5b41d7 100644
--- a/server/api/voiceQueuesLog/voiceQueuesLog.controller.js
+++ b/server/api/voiceQueuesLog/voiceQueuesLog.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueuesLog/voiceQueuesLog.model.js b/server/api/voiceQueuesLog/voiceQueuesLog.model.js
index cca963a..d531cb1 100644
--- a/server/api/voiceQueuesLog/voiceQueuesLog.model.js
+++ b/server/api/voiceQueuesLog/voiceQueuesLog.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceQueuesLog/voiceQueuesLog.rpc.js b/server/api/voiceQueuesLog/voiceQueuesLog.rpc.js
index 4326f43..3e16892 100644
--- a/server/api/voiceQueuesLog/voiceQueuesLog.rpc.js
+++ b/server/api/voiceQueuesLog/voiceQueuesLog.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceRecording/index.js b/server/api/voiceRecording/index.js
index dccaaee..331a5d8 100644
--- a/server/api/voiceRecording/index.js
+++ b/server/api/voiceRecording/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceRecording/voiceRecording.attributes.js b/server/api/voiceRecording/voiceRecording.attributes.js
index a8c3f31..38f95bf 100644
--- a/server/api/voiceRecording/voiceRecording.attributes.js
+++ b/server/api/voiceRecording/voiceRecording.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceRecording/voiceRecording.controller.js b/server/api/voiceRecording/voiceRecording.controller.js
index 5c4bfdd..70f4bc0 100644
--- a/server/api/voiceRecording/voiceRecording.controller.js
+++ b/server/api/voiceRecording/voiceRecording.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceRecording/voiceRecording.model.js b/server/api/voiceRecording/voiceRecording.model.js
index c40f786..3d42a60 100644
--- a/server/api/voiceRecording/voiceRecording.model.js
+++ b/server/api/voiceRecording/voiceRecording.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceRecording/voiceRecording.rpc.js b/server/api/voiceRecording/voiceRecording.rpc.js
index 2ad7a51..2b0ed16 100644
--- a/server/api/voiceRecording/voiceRecording.rpc.js
+++ b/server/api/voiceRecording/voiceRecording.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceTransferReport/index.js b/server/api/voiceTransferReport/index.js
index e7160ee..eddf245 100644
--- a/server/api/voiceTransferReport/index.js
+++ b/server/api/voiceTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceTransferReport/voiceTransferReport.attributes.js b/server/api/voiceTransferReport/voiceTransferReport.attributes.js
index 15b1f5e..0a6aeea 100644
--- a/server/api/voiceTransferReport/voiceTransferReport.attributes.js
+++ b/server/api/voiceTransferReport/voiceTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceTransferReport/voiceTransferReport.controller.js b/server/api/voiceTransferReport/voiceTransferReport.controller.js
index 5f95f56..2a1ac0d 100644
--- a/server/api/voiceTransferReport/voiceTransferReport.controller.js
+++ b/server/api/voiceTransferReport/voiceTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceTransferReport/voiceTransferReport.model.js b/server/api/voiceTransferReport/voiceTransferReport.model.js
index e144926..f9dba1f 100644
--- a/server/api/voiceTransferReport/voiceTransferReport.model.js
+++ b/server/api/voiceTransferReport/voiceTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/voiceTransferReport/voiceTransferReport.rpc.js b/server/api/voiceTransferReport/voiceTransferReport.rpc.js
index edb11ee..42b4add 100644
--- a/server/api/voiceTransferReport/voiceTransferReport.rpc.js
+++ b/server/api/voiceTransferReport/voiceTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/webbar/index.js b/server/api/webbar/index.js
index 03957bc..49c07b1 100644
--- a/server/api/webbar/index.js
+++ b/server/api/webbar/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/webbar/webbar.controller.js b/server/api/webbar/webbar.controller.js
index 2fc9cd5..8956ced 100644
--- a/server/api/webbar/webbar.controller.js
+++ b/server/api/webbar/webbar.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/index.js b/server/api/whatsappAccount/index.js
index 067536e..2332b18 100644
--- a/server/api/whatsappAccount/index.js
+++ b/server/api/whatsappAccount/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.attributes.js b/server/api/whatsappAccount/whatsappAccount.attributes.js
index a423724..93bbe7f 100644
--- a/server/api/whatsappAccount/whatsappAccount.attributes.js
+++ b/server/api/whatsappAccount/whatsappAccount.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.controller.js b/server/api/whatsappAccount/whatsappAccount.controller.js
index 90fdb73..60baaf2 100644
--- a/server/api/whatsappAccount/whatsappAccount.controller.js
+++ b/server/api/whatsappAccount/whatsappAccount.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.events.js b/server/api/whatsappAccount/whatsappAccount.events.js
index 03d3143..ad04315 100644
--- a/server/api/whatsappAccount/whatsappAccount.events.js
+++ b/server/api/whatsappAccount/whatsappAccount.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.model.js b/server/api/whatsappAccount/whatsappAccount.model.js
index f38d192..eb3888f 100644
--- a/server/api/whatsappAccount/whatsappAccount.model.js
+++ b/server/api/whatsappAccount/whatsappAccount.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.rpc.js b/server/api/whatsappAccount/whatsappAccount.rpc.js
index 9e1a658..34008cc 100644
--- a/server/api/whatsappAccount/whatsappAccount.rpc.js
+++ b/server/api/whatsappAccount/whatsappAccount.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappAccount/whatsappAccount.socket.js b/server/api/whatsappAccount/whatsappAccount.socket.js
index 807f216..6d7d8f1 100644
--- a/server/api/whatsappAccount/whatsappAccount.socket.js
+++ b/server/api/whatsappAccount/whatsappAccount.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappApplication/index.js b/server/api/whatsappApplication/index.js
index 8cd320f..2d5b589 100644
--- a/server/api/whatsappApplication/index.js
+++ b/server/api/whatsappApplication/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappApplication/whatsappApplication.attributes.js b/server/api/whatsappApplication/whatsappApplication.attributes.js
index 55529e3..0d933f6 100644
--- a/server/api/whatsappApplication/whatsappApplication.attributes.js
+++ b/server/api/whatsappApplication/whatsappApplication.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappApplication/whatsappApplication.controller.js b/server/api/whatsappApplication/whatsappApplication.controller.js
index e5e7b04..c46ac62 100644
--- a/server/api/whatsappApplication/whatsappApplication.controller.js
+++ b/server/api/whatsappApplication/whatsappApplication.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappApplication/whatsappApplication.model.js b/server/api/whatsappApplication/whatsappApplication.model.js
index 71b3b52..dbeef7c 100644
--- a/server/api/whatsappApplication/whatsappApplication.model.js
+++ b/server/api/whatsappApplication/whatsappApplication.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappApplication/whatsappApplication.rpc.js b/server/api/whatsappApplication/whatsappApplication.rpc.js
index 3dbe880..a3bc79e 100644
--- a/server/api/whatsappApplication/whatsappApplication.rpc.js
+++ b/server/api/whatsappApplication/whatsappApplication.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/index.js b/server/api/whatsappInteraction/index.js
index 91496ee..dfd399f 100644
--- a/server/api/whatsappInteraction/index.js
+++ b/server/api/whatsappInteraction/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.attributes.js b/server/api/whatsappInteraction/whatsappInteraction.attributes.js
index f668bb2..94db8c7 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.attributes.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.controller.js b/server/api/whatsappInteraction/whatsappInteraction.controller.js
index ee65bc8..2e15283 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.controller.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.events.js b/server/api/whatsappInteraction/whatsappInteraction.events.js
index 32d7415..5536974 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.events.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.model.js b/server/api/whatsappInteraction/whatsappInteraction.model.js
index e6c2ae8..41e919b 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.model.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.rpc.js b/server/api/whatsappInteraction/whatsappInteraction.rpc.js
index dbdcf09..4d4fa93 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.rpc.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappInteraction/whatsappInteraction.socket.js b/server/api/whatsappInteraction/whatsappInteraction.socket.js
index c68608e..c644ebf 100644
--- a/server/api/whatsappInteraction/whatsappInteraction.socket.js
+++ b/server/api/whatsappInteraction/whatsappInteraction.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/index.js b/server/api/whatsappMessage/index.js
index b43f8a0..d1abc7b 100644
--- a/server/api/whatsappMessage/index.js
+++ b/server/api/whatsappMessage/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.attributes.js b/server/api/whatsappMessage/whatsappMessage.attributes.js
index 40e6ed0..3cbb737 100644
--- a/server/api/whatsappMessage/whatsappMessage.attributes.js
+++ b/server/api/whatsappMessage/whatsappMessage.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.controller.js b/server/api/whatsappMessage/whatsappMessage.controller.js
index b9ba06e..a62f2fb 100644
--- a/server/api/whatsappMessage/whatsappMessage.controller.js
+++ b/server/api/whatsappMessage/whatsappMessage.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.events.js b/server/api/whatsappMessage/whatsappMessage.events.js
index 567d91b..a0c6107 100644
--- a/server/api/whatsappMessage/whatsappMessage.events.js
+++ b/server/api/whatsappMessage/whatsappMessage.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.model.js b/server/api/whatsappMessage/whatsappMessage.model.js
index 98cf469..01c5b1d 100644
--- a/server/api/whatsappMessage/whatsappMessage.model.js
+++ b/server/api/whatsappMessage/whatsappMessage.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.rpc.js b/server/api/whatsappMessage/whatsappMessage.rpc.js
index 8fa5e81..1453f53 100644
--- a/server/api/whatsappMessage/whatsappMessage.rpc.js
+++ b/server/api/whatsappMessage/whatsappMessage.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappMessage/whatsappMessage.socket.js b/server/api/whatsappMessage/whatsappMessage.socket.js
index 6adb048..6bc855e 100644
--- a/server/api/whatsappMessage/whatsappMessage.socket.js
+++ b/server/api/whatsappMessage/whatsappMessage.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/index.js b/server/api/whatsappQueue/index.js
index ecef0de..b4f1fca 100644
--- a/server/api/whatsappQueue/index.js
+++ b/server/api/whatsappQueue/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.attributes.js b/server/api/whatsappQueue/whatsappQueue.attributes.js
index 8855338..9f4d7fc 100644
--- a/server/api/whatsappQueue/whatsappQueue.attributes.js
+++ b/server/api/whatsappQueue/whatsappQueue.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.controller.js b/server/api/whatsappQueue/whatsappQueue.controller.js
index 03721e7..c2c67fe 100644
--- a/server/api/whatsappQueue/whatsappQueue.controller.js
+++ b/server/api/whatsappQueue/whatsappQueue.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.events.js b/server/api/whatsappQueue/whatsappQueue.events.js
index b7f18ea..5e02f79 100644
--- a/server/api/whatsappQueue/whatsappQueue.events.js
+++ b/server/api/whatsappQueue/whatsappQueue.events.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.model.js b/server/api/whatsappQueue/whatsappQueue.model.js
index b4d93ff..c6c00a9 100644
--- a/server/api/whatsappQueue/whatsappQueue.model.js
+++ b/server/api/whatsappQueue/whatsappQueue.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.rpc.js b/server/api/whatsappQueue/whatsappQueue.rpc.js
index 2e5933d..868f343 100644
--- a/server/api/whatsappQueue/whatsappQueue.rpc.js
+++ b/server/api/whatsappQueue/whatsappQueue.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueue/whatsappQueue.socket.js b/server/api/whatsappQueue/whatsappQueue.socket.js
index 6395f0f..c3f62c8 100644
--- a/server/api/whatsappQueue/whatsappQueue.socket.js
+++ b/server/api/whatsappQueue/whatsappQueue.socket.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueueReport/index.js b/server/api/whatsappQueueReport/index.js
index cca68fd..e7afd1e 100644
--- a/server/api/whatsappQueueReport/index.js
+++ b/server/api/whatsappQueueReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueueReport/whatsappQueueReport.attributes.js b/server/api/whatsappQueueReport/whatsappQueueReport.attributes.js
index f6fe97f..e32549b 100644
--- a/server/api/whatsappQueueReport/whatsappQueueReport.attributes.js
+++ b/server/api/whatsappQueueReport/whatsappQueueReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueueReport/whatsappQueueReport.controller.js b/server/api/whatsappQueueReport/whatsappQueueReport.controller.js
index 18d4953..0e543bb 100644
--- a/server/api/whatsappQueueReport/whatsappQueueReport.controller.js
+++ b/server/api/whatsappQueueReport/whatsappQueueReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueueReport/whatsappQueueReport.model.js b/server/api/whatsappQueueReport/whatsappQueueReport.model.js
index 3d7c499..97fd195 100644
--- a/server/api/whatsappQueueReport/whatsappQueueReport.model.js
+++ b/server/api/whatsappQueueReport/whatsappQueueReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappQueueReport/whatsappQueueReport.rpc.js b/server/api/whatsappQueueReport/whatsappQueueReport.rpc.js
index 0c97b83..0fbe4ca 100644
--- a/server/api/whatsappQueueReport/whatsappQueueReport.rpc.js
+++ b/server/api/whatsappQueueReport/whatsappQueueReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappTransferReport/index.js b/server/api/whatsappTransferReport/index.js
index f2d2a1d..d1be248 100644
--- a/server/api/whatsappTransferReport/index.js
+++ b/server/api/whatsappTransferReport/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappTransferReport/whatsappTransferReport.attributes.js b/server/api/whatsappTransferReport/whatsappTransferReport.attributes.js
index be2f8bb..6e9439f 100644
--- a/server/api/whatsappTransferReport/whatsappTransferReport.attributes.js
+++ b/server/api/whatsappTransferReport/whatsappTransferReport.attributes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappTransferReport/whatsappTransferReport.controller.js b/server/api/whatsappTransferReport/whatsappTransferReport.controller.js
index 90773d4..b54c44b 100644
--- a/server/api/whatsappTransferReport/whatsappTransferReport.controller.js
+++ b/server/api/whatsappTransferReport/whatsappTransferReport.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappTransferReport/whatsappTransferReport.model.js b/server/api/whatsappTransferReport/whatsappTransferReport.model.js
index 7f4e31c..c383860 100644
--- a/server/api/whatsappTransferReport/whatsappTransferReport.model.js
+++ b/server/api/whatsappTransferReport/whatsappTransferReport.model.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/whatsappTransferReport/whatsappTransferReport.rpc.js b/server/api/whatsappTransferReport/whatsappTransferReport.rpc.js
index 72279e5..6e05925 100644
--- a/server/api/whatsappTransferReport/whatsappTransferReport.rpc.js
+++ b/server/api/whatsappTransferReport/whatsappTransferReport.rpc.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/app.js b/server/app.js
index f0cbee2..c51de17 100644
--- a/server/app.js
+++ b/server/app.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/auth/service.js b/server/components/auth/service.js
index 2f663d9..4e95e85 100644
--- a/server/components/auth/service.js
+++ b/server/components/auth/service.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/encryptor/index.js b/server/components/encryptor/index.js
index 078fb14..7c68b36 100644
--- a/server/components/encryptor/index.js
+++ b/server/components/encryptor/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/export/csv.js b/server/components/export/csv.js
index 8b14e0c..1e873cc 100644
--- a/server/components/export/csv.js
+++ b/server/components/export/csv.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/export/pdf.js b/server/components/export/pdf.js
index a58e529..8ab2e9e 100644
--- a/server/components/export/pdf.js
+++ b/server/components/export/pdf.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/export/xlsx.js b/server/components/export/xlsx.js
index 3f849e1..43f12d8 100644
--- a/server/components/export/xlsx.js
+++ b/server/components/export/xlsx.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/extensions/rewrite.js b/server/components/extensions/rewrite.js
index d9c6b97..e183f02 100644
--- a/server/components/extensions/rewrite.js
+++ b/server/components/extensions/rewrite.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/import/cm/csv.js b/server/components/import/cm/csv.js
index 6a8f535..5dd81a0 100644
--- a/server/components/import/cm/csv.js
+++ b/server/components/import/cm/csv.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/import/cm/csv2.js b/server/components/import/cm/csv2.js
index 7cc67fa..fa1b81b 100644
--- a/server/components/import/cm/csv2.js
+++ b/server/components/import/cm/csv2.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/import/cm/csvUpdates.js b/server/components/import/cm/csvUpdates.js
deleted file mode 100644
index 67bb41d..0000000
--- a/server/components/import/cm/csvUpdates.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/components/integrations/configuration.js b/server/components/integrations/configuration.js
index 35bc3d2..b13972c 100644
--- a/server/components/integrations/configuration.js
+++ b/server/components/integrations/configuration.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/interaction/service.js b/server/components/interaction/service.js
index 66c12d9..adf6422 100644
--- a/server/components/interaction/service.js
+++ b/server/components/interaction/service.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/license/service.js b/server/components/license/service.js
index ee92286..057ab7c 100644
--- a/server/components/license/service.js
+++ b/server/components/license/service.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/parsers/advancedSearch.js b/server/components/parsers/advancedSearch.js
index d300d7d..12785f8 100644
--- a/server/components/parsers/advancedSearch.js
+++ b/server/components/parsers/advancedSearch.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/components/parsers/qs.js b/server/components/parsers/qs.js
index eee1e88..36dd750 100644
--- a/server/components/parsers/qs.js
+++ b/server/components/parsers/qs.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/environment/development.js b/server/config/environment/development.js
index d2c58f6..6eecb89 100644
--- a/server/config/environment/development.js
+++ b/server/config/environment/development.js
@@ -65,7 +65,7 @@ module.exports = {
     ip: process.env.AGIIP || '127.0.0.1',
   },
   // Seed database on startup
-  seedDB: false,
+  seedDB: true,
   google: {
     clientID: process.env.GOOGLE_ID || 'id',
     clientSecret: process.env.GOOGLE_SECRET || 'secret',
@@ -80,5 +80,10 @@ module.exports = {
   },
   encrypt: {
     algorithm: 'aes192'
+  },
+  activedirectory: {
+    baseDN: process.env.AD_BASEDN || '',
+    url: process.env.AD_URL,
+    domain: process.env.AD_DOMAIN
   }
 };
\ No newline at end of file
diff --git a/server/config/express.js b/server/config/express.js
index 3bb7646..d5853b9 100644
--- a/server/config/express.js
+++ b/server/config/express.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/license/hardware.js b/server/config/license/hardware.js
index 7f88dd6..1168099 100644
--- a/server/config/license/hardware.js
+++ b/server/config/license/hardware.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/license/index.js b/server/config/license/index.js
index e3ce4f9..bd31131 100644
--- a/server/config/license/index.js
+++ b/server/config/license/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/license/util.js b/server/config/license/util.js
index 1ab1ccb..2ea333f 100644
--- a/server/config/license/util.js
+++ b/server/config/license/util.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/local.env.js b/server/config/local.env.js
index 00a2d71..4049e0c 100644
--- a/server/config/local.env.js
+++ b/server/config/local.env.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/logger.js b/server/config/logger.js
index bec2391..3225f98 100644
--- a/server/config/logger.js
+++ b/server/config/logger.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/pm2/config.js b/server/config/pm2/config.js
index f0f01ec..6bc9ffd 100644
--- a/server/config/pm2/config.js
+++ b/server/config/pm2/config.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/pm2/index.js b/server/config/pm2/index.js
index b338b84..9e39b16 100644
--- a/server/config/pm2/index.js
+++ b/server/config/pm2/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/schedule/chat.js b/server/config/schedule/chat.js
index 203078a..bd235c4 100644
--- a/server/config/schedule/chat.js
+++ b/server/config/schedule/chat.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.attributes.js b/server/config/schedule/cloud-provider.js
similarity index 67%
copy from server/api/contactItemType/contactItemType.attributes.js
copy to server/config/schedule/cloud-provider.js
index 60a13fe..3679b34 100644
--- a/server/api/contactItemType/contactItemType.attributes.js
+++ b/server/config/schedule/cloud-provider.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/schedule/index.js b/server/config/schedule/index.js
index 41ad018..7d499bb 100644
--- a/server/config/schedule/index.js
+++ b/server/config/schedule/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/contactItemType/contactItemType.attributes.js b/server/config/schedule/logout.js
similarity index 54%
rename from server/api/contactItemType/contactItemType.attributes.js
rename to server/config/schedule/logout.js
index 60a13fe..06c098f 100644
--- a/server/api/contactItemType/contactItemType.attributes.js
+++ b/server/config/schedule/logout.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/schedule/transcribe.js b/server/config/schedule/transcribe.js
index 68274ae..e6d8ddd 100644
--- a/server/config/schedule/transcribe.js
+++ b/server/config/schedule/transcribe.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/schedule/whatsapp.js b/server/config/schedule/whatsapp.js
index 87d295a..6bedeec 100644
--- a/server/config/schedule/whatsapp.js
+++ b/server/config/schedule/whatsapp.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/seedContact.js b/server/config/seedContact.js
index 2ed678b..c9e80e3 100644
--- a/server/config/seedContact.js
+++ b/server/config/seedContact.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/seedDB/voiceExtensions.js b/server/config/seedDB/voiceExtensions.js
index f34c641..1d115d9 100644
--- a/server/config/seedDB/voiceExtensions.js
+++ b/server/config/seedDB/voiceExtensions.js
@@ -362,6 +362,10 @@ var applicationsAlways = {
       app: 'Progress'
     },
     {
+      app: 'Set',
+      appdata: 'CDR(type)=internal'
+    },
+    {
       app: 'Queue',
       appdata: '${EXTEN:20},xX'
     }
diff --git a/server/config/seedUsers.js b/server/config/seedUsers.js
index 1a49fa1..50554a9 100644
--- a/server/config/seedUsers.js
+++ b/server/config/seedUsers.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/socketio.js b/server/config/socketio.js
index 316ff30..cca8fed 100644
--- a/server/config/socketio.js
+++ b/server/config/socketio.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/triggers/index.js b/server/config/triggers/index.js
index 7011e5a..3d09acf 100644
--- a/server/config/triggers/index.js
+++ b/server/config/triggers/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/utils.js b/server/config/utils.js
index 27d7301..f2c6254 100644
--- a/server/config/utils.js
+++ b/server/config/utils.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/errors/index.js b/server/errors/index.js
index a38418b..592eaad 100644
--- a/server/errors/index.js
+++ b/server/errors/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/files/chat/iframe.ejs b/server/files/chat/iframe.ejs
index 428b46c..5ee4542 100644
--- a/server/files/chat/iframe.ejs
+++ b/server/files/chat/iframe.ejs
@@ -7,7 +7,6 @@
 
     var  alignment="<%=alignment%>";
     var  verticalAlignment="<%=verticalAlignment%>";
-
     var  iframe_status = false;
 
     document.documentElement.style.setProperty('--xc-ws-div-color', '<%=div_color%>');
@@ -50,7 +49,7 @@
     <% if (alignment == 'right') { -%> // Right
         topChat_set(iframe_h, verticalAlignment);
         document.body.appendChild(div_tab);
-        var  html = '<div id="chat_tab_arrow"> <strong><</strong> </div> <span id="chat_tab_text" style="writing-mode: tb-rl; transform: rotate(-180deg);" flex><strong> CHAT </strong></span>';
+        var  html = '<div id="chat_tab_arrow"> <strong><</strong> </div> <span id="chat_tab_text" style="writing-mode: tb-rl; transform: rotate(-180deg);" flex><strong><%=labelText%></strong></span>';
         div_tab.innerHTML = html;
         
         div_tab.style.backgroundColor="<%=div_color%>";
@@ -98,7 +97,7 @@
     <% } else if (alignment == 'left') { -%> 
         topChat_set(iframe_h, verticalAlignment);
         document.body.appendChild(div_tab);
-        var  html='<div id="chat_tab_arrow"> <strong>></strong> </div><span id="chat_tab_text" style="writing-mode: tb-rl; transform: rotate(-180deg);" flex><strong> CHAT </strong></span>';
+        var  html='<div id="chat_tab_arrow"> <strong>></strong> </div><span id="chat_tab_text" style="writing-mode: tb-rl; transform: rotate(-180deg);" flex><strong><%=labelText%></strong></span>';
         div_tab.innerHTML=html;
 
         div_tab.style.backgroundColor="<%=div_color%>";
diff --git a/server/migrations/2.5.27.js b/server/migrations/2.5.27.js
index 22df2f1..f7d42ec 100644
--- a/server/migrations/2.5.27.js
+++ b/server/migrations/2.5.27.js
@@ -1,165 +1,165 @@
-'use strict';
-
-var BPromise = require('bluebird');
-var util = require('util');
-
-var logger = require('../config/logger')('migration');
-
-var Sequence = function() {};
-
-Sequence.prototype.enqueue = function(fn) {
-  this.tail = this.tail ? this.tail.finally(fn) : fn();
-};
-
-var Migration = function(queryInterface) {
-  this.queryInterface = queryInterface;
-  this.sequence = new Sequence();
-};
-
-Migration.prototype.changeColumn = function(table, column, type) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .changeColumn(table, column, type)
-      .then(function() {
-        logger.info('Changed column %s in table %s', column, table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.addColumn = function(table, column, type) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .addColumn(table, column, type)
-      .then(function() {
-        logger.info('Added column %s to %s', column, table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.dropTable = function(table) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .dropTable(table, {
-        force: true
-      })
-      .then(function() {
-        logger.info('table dropped %s', table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.addIndex = function(table, column, indexName) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .addIndex(table, column, {
-        indexName: indexName
-      })
-      .then(function() {
-        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.removeIndex = function(table, indexName) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .removeIndex(table, indexName)
-      .then(function() {
-        logger.info('removeIndex %s %s', table, indexName);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.query = function(sql) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface.sequelize
-      .query(sql)
-      .then(function() {
-        logger.info('query %s', sql);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.removeColumn = function(table, column) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .removeColumn(table, column)
-      .then(function() {
-        logger.info('Removed column %s from %s', column, table);
-      })
-      .catch(function(err) {
-        logger.info(
-          util.inspect(err, {
-            showHidden: false,
-            depth: null
-          })
-        );
-      });
-  });
-};
-
-Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .renameColumn(table, oldColumn, newColumn)
-      .then(function() {
-        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
-      })
-      .catch(function(err) {
-        logger.info(
-          util.inspect(err, {
-            showHidden: false,
-            depth: null
-          })
-        );
-      });
-  });
-};
-
-Migration.prototype.final = function(resolve) {
-  this.sequence.enqueue(function() {
-    return resolve();
-  });
-};
-
-module.exports = {
-  up: function(queryInterface, Sequelize) {
-    return new BPromise(function(resolve) {
-      var migration = new Migration(queryInterface);
-
-      // START FINAL
-      migration.final(resolve);
-      // END FINAL
-    });
-  },
-
-  down: function(queryInterface, Sequelize) {
-    // var migration = new Migration(queryInterface);
-  }
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
 };
\ No newline at end of file
diff --git a/server/migrations/2.5.34.js b/server/migrations/2.5.34.js
new file mode 100644
index 0000000..f7d42ec
--- /dev/null
+++ b/server/migrations/2.5.34.js
@@ -0,0 +1,165 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.35.js b/server/migrations/2.5.35.js
new file mode 100644
index 0000000..22df2f1
--- /dev/null
+++ b/server/migrations/2.5.35.js
@@ -0,0 +1,165 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.36.js b/server/migrations/2.5.36.js
new file mode 100644
index 0000000..e3fb3ea
--- /dev/null
+++ b/server/migrations/2.5.36.js
@@ -0,0 +1,184 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START users
+      migration.addColumn('users', 'ignorePauseForPreviewCalls', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false
+      });
+
+      migration.addColumn('users', 'selectRecallMeCampaign', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false
+      });
+      // END users
+
+      // START voice_queues
+      migration.addColumn('voice_queues', 'dialPreviewAutoRecallMe', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: true
+      });
+      // END voice_queues
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.37.js b/server/migrations/2.5.37.js
new file mode 100644
index 0000000..0dea0f6
--- /dev/null
+++ b/server/migrations/2.5.37.js
@@ -0,0 +1,188 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START settings
+      migration.addColumn('settings', 'viewHelpSection', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: true
+      });
+
+      migration.addColumn('settings', 'secureCookieEnabled', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: true
+      });
+      // END settings 
+
+      // START whatsapp_accounts
+      migration.addColumn('whatsapp_accounts', 'baseUrl', {
+        type: Sequelize.STRING
+      });
+
+      migration.changeColumn('whatsapp_accounts', 'type', {
+        type: Sequelize.ENUM('twilio', 'sinch')
+      });
+      // END whatsapp_accounts
+
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.38.js b/server/migrations/2.5.38.js
new file mode 100644
index 0000000..22df2f1
--- /dev/null
+++ b/server/migrations/2.5.38.js
@@ -0,0 +1,165 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.39.js b/server/migrations/2.5.39.js
new file mode 100644
index 0000000..4262900
--- /dev/null
+++ b/server/migrations/2.5.39.js
@@ -0,0 +1,193 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START CHAT WEBSITE
+      migration.addColumn('chat_websites', 'labelText', {
+        type: Sequelize.STRING,
+        defaultValue: 'CHAT'
+      });
+      // END CHAT WEBSITE
+
+      // START settings
+      migration.addColumn('settings', 'adSsoEnabled', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false
+      });
+      // END settings 
+
+      // START users
+      migration.addColumn('users', 'adSsoEnabled', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false
+      });
+      // END users
+
+      // START int_dynamics365_configurations
+      migration.addColumn('int_dynamics365_configurations', 'moduleCreate', {
+        type: Sequelize.ENUM('contact', 'nothing'),
+        defaultValue: 'contact'
+      });
+      // END int_dynamics365_configurations 
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.40.js b/server/migrations/2.5.40.js
new file mode 100644
index 0000000..22df2f1
--- /dev/null
+++ b/server/migrations/2.5.40.js
@@ -0,0 +1,165 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.41.js b/server/migrations/2.5.41.js
new file mode 100644
index 0000000..6639582
--- /dev/null
+++ b/server/migrations/2.5.41.js
@@ -0,0 +1,297 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START settings
+      migration.addColumn('settings', 'limitTabs', {
+        type: Sequelize.INTEGER,
+        defaultValue: 20
+      });
+
+      migration.addColumn('settings', 'disabledCookie', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false
+      });
+
+      migration.addColumn('settings', 'previewRecallmeReminderInterval', {
+        type: Sequelize.INTEGER,
+        defaultValue: 5
+      });
+      // END settings 
+
+      // START cm_hopper
+      migration.addColumn('cm_hopper', 'recallmeNotifiedDate', {
+        type: Sequelize.DATE,
+        allowNull: true
+      });
+      // END cm_hopper 
+
+      // START voice_queues
+      migration.addColumn('voice_queues', 'dialPreviewRecallmeReminder', {
+        type: Sequelize.BOOLEAN,
+        default: false
+      });
+      // END voice_queues 
+
+      // START cloud_providers
+      migration.changeColumn('cloud_providers', 'service', {
+        type: Sequelize.ENUM('AmazonAWS', 'Google', 'MicrosoftAzure')
+      });
+
+      migration.addColumn('cloud_providers', 'type', {
+        type: Sequelize.ENUM('Outlook365', 'Dynamics365'),
+        after: 'service'
+      });
+
+      migration.addColumn('cloud_providers', 'data3', {
+        type: Sequelize.STRING,
+        after: 'data2'
+      });
+
+      migration.addColumn('cloud_providers', 'data4', {
+        type: Sequelize.STRING,
+        after: 'data3'
+      });
+
+      migration.addColumn('cloud_providers', 'data5', {
+        type: Sequelize.TEXT,
+        after: 'data4'
+      });
+
+      migration.addColumn('cloud_providers', 'data6', {
+        type: Sequelize.TEXT,
+        after: 'data5'
+      });
+
+      migration.addColumn('cloud_providers', 'data7', {
+        type: Sequelize.TEXT,
+        after: 'data6'
+      });
+      // END cloud_providers 
+
+      // START mail_accounts
+      migration.addColumn('mail_accounts', 'provider', {
+        type: Sequelize.ENUM('gmail', 'hotmail', 'yahoo', 'outlook365'),
+        after: 'name',
+        defaultValue: null
+      });
+      // END mail_accounts 
+
+      // START mail_servers_in
+      migration.query('UPDATE mail_servers_in SET host = \'imap.gmail.com\' WHERE service = \'gmail\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_in SET port = 993 WHERE service = \'gmail\' AND port IS NULL');
+
+      migration.query('UPDATE mail_servers_in SET host = \'imap-mail.outlook.com\' WHERE service = \'hotmail\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_in SET port = 993 WHERE service = \'hotmail\' AND port IS NULL');
+
+      migration.query('UPDATE mail_servers_in SET host = \'imap.mail.yahoo.com\' WHERE service = \'yahoo\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_in SET port = 993 WHERE service = \'yahoo\' AND port IS NULL');
+
+      migration.query('UPDATE mail_servers_in SET host = \'outlook.office365.com\' WHERE service = \'outlook365\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_in SET port = 993 WHERE service = \'outlook365\' AND port IS NULL');
+
+      migration.addColumn('mail_servers_in', 'modernAuthentication', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false,
+        after: 'authentication'
+      });
+
+      migration.addColumn('mail_servers_in', 'CloudProviderId', {
+        type: Sequelize.INTEGER
+      });
+
+      migration.addIndex('mail_servers_in', ['CloudProviderId'], 'CloudProviderId');
+
+      migration.query('ALTER TABLE `mail_servers_in` ADD CONSTRAINT `mail_servers_in_ibfk_2` FOREIGN KEY (`CloudProviderId`) REFERENCES `cloud_providers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE');
+      // END mail_servers_in 
+
+      // START mail_servers_out
+      migration.query('UPDATE mail_servers_out SET host = \'smtp.gmail.com\' WHERE service = \'gmail\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_out SET port = 465 WHERE service = \'gmail\' AND port IS NULL AND secure = 0');
+      migration.query('UPDATE mail_servers_out SET port = 587 WHERE service = \'gmail\' AND port IS NULL AND secure = 1');
+
+      migration.query('UPDATE mail_servers_out SET host = \'smtp-mail.outlook.com\' WHERE service = \'hotmail\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_out SET port = 587 WHERE service = \'hotmail\' AND port IS NULL');
+
+      migration.query('UPDATE mail_servers_out SET host = \'smtp.mail.yahoo.com\' WHERE service = \'yahoo\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_out SET port = 465 WHERE service = \'yahoo\' AND port IS NULL');
+
+      migration.query('UPDATE mail_servers_out SET host = \'smtp.office365.com\' WHERE service = \'outlook365\' AND host IS NULL');
+      migration.query('UPDATE mail_servers_out SET port = 587 WHERE service = \'outlook365\' AND port IS NULL');
+
+      migration.addColumn('mail_servers_out', 'modernAuthentication', {
+        type: Sequelize.BOOLEAN,
+        defaultValue: false,
+        after: 'authentication'
+      });
+
+      migration.addColumn('mail_servers_out', 'CloudProviderId', {
+        type: Sequelize.INTEGER
+      });
+
+      migration.addIndex('mail_servers_out', ['CloudProviderId'], 'CloudProviderId');
+
+      migration.query('ALTER TABLE `mail_servers_out` ADD CONSTRAINT `mail_servers_out_ibfk_2` FOREIGN KEY (`CloudProviderId`) REFERENCES `cloud_providers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE');
+      // END mail_servers_out 
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.5.42.js b/server/migrations/2.5.42.js
new file mode 100644
index 0000000..067054b
--- /dev/null
+++ b/server/migrations/2.5.42.js
@@ -0,0 +1,175 @@
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+
+var logger = require('../config/logger')('migration');
+
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+  this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+  this.queryInterface = queryInterface;
+  this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .changeColumn(table, column, type)
+      .then(function() {
+        logger.info('Changed column %s in table %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addColumn(table, column, type)
+      .then(function() {
+        logger.info('Added column %s to %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.dropTable = function(table) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .dropTable(table, {
+        force: true
+      })
+      .then(function() {
+        logger.info('table dropped %s', table);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .addIndex(table, column, {
+        indexName: indexName
+      })
+      .then(function() {
+        logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeIndex(table, indexName)
+      .then(function() {
+        logger.info('removeIndex %s %s', table, indexName);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.query = function(sql) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface.sequelize
+      .query(sql)
+      .then(function() {
+        logger.info('query %s', sql);
+      })
+      .catch(function(err) {
+        logger.info(JSON.stringify(err));
+      });
+  });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .removeColumn(table, column)
+      .then(function() {
+        logger.info('Removed column %s from %s', column, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+  var _this = this;
+  this.sequence.enqueue(function() {
+    return _this.queryInterface
+      .renameColumn(table, oldColumn, newColumn)
+      .then(function() {
+        logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
+      })
+      .catch(function(err) {
+        logger.info(
+          util.inspect(err, {
+            showHidden: false,
+            depth: null
+          })
+        );
+      });
+  });
+};
+
+Migration.prototype.final = function(resolve) {
+  this.sequence.enqueue(function() {
+    return resolve();
+  });
+};
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return new BPromise(function(resolve) {
+      var migration = new Migration(queryInterface);
+
+      // START settings
+      migration.addColumn('settings', 'disconnectionTimeout', {
+        type: Sequelize.INTEGER,
+        validate: {
+          min: 1
+        },
+        defaultValue: '5'
+      });
+      // END settings 
+
+      // START FINAL
+      migration.final(resolve);
+      // END FINAL
+    });
+  },
+
+  down: function(queryInterface, Sequelize) {
+    // var migration = new Migration(queryInterface);
+  }
+};
\ No newline at end of file
diff --git a/server/migrations/2.6.0.js b/server/migrations/2.6.0.js
deleted file mode 100644
index b95d0b2..0000000
--- a/server/migrations/2.6.0.js
+++ /dev/null
@@ -1,249 +0,0 @@
-"use strict";
-
-var BPromise = require("bluebird");
-var util = require("util");
-
-var logger = require("../config/logger")("migration");
-
-var Sequence = function() {};
-
-Sequence.prototype.enqueue = function(fn) {
-  this.tail = this.tail ? this.tail.finally(fn) : fn();
-};
-
-var Migration = function(queryInterface) {
-  this.queryInterface = queryInterface;
-  this.sequence = new Sequence();
-};
-
-Migration.prototype.changeColumn = function(table, column, type) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .changeColumn(table, column, type)
-      .then(function() {
-        logger.info("Changed column %s in table %s", column, table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.addColumn = function(table, column, type) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .addColumn(table, column, type)
-      .then(function() {
-        logger.info("Added column %s to %s", column, table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.dropTable = function(table) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .dropTable(table, {
-        force: true,
-      })
-      .then(function() {
-        logger.info("table dropped %s", table);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.addIndex = function(table, column, indexName) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .addIndex(table, column, {
-        indexName: indexName,
-      })
-      .then(function() {
-        logger.info("addIndex %s %s %s", table, column.join(","), indexName);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.removeIndex = function(table, indexName) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .removeIndex(table, indexName)
-      .then(function() {
-        logger.info("removeIndex %s %s", table, indexName);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.query = function(sql) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface.sequelize
-      .query(sql)
-      .then(function() {
-        logger.info("query %s", sql);
-      })
-      .catch(function(err) {
-        logger.info(JSON.stringify(err));
-      });
-  });
-};
-
-Migration.prototype.removeColumn = function(table, column) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .removeColumn(table, column)
-      .then(function() {
-        logger.info("Removed column %s from %s", column, table);
-      })
-      .catch(function(err) {
-        logger.info(
-          util.inspect(err, {
-            showHidden: false,
-            depth: null,
-          })
-        );
-      });
-  });
-};
-
-Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
-  var _this = this;
-  this.sequence.enqueue(function() {
-    return _this.queryInterface
-      .renameColumn(table, oldColumn, newColumn)
-      .then(function() {
-        logger.info(
-          "Renamed column from %s to %s on %s",
-          oldColumn,
-          newColumn,
-          table
-        );
-      })
-      .catch(function(err) {
-        logger.info(
-          util.inspect(err, {
-            showHidden: false,
-            depth: null,
-          })
-        );
-      });
-  });
-};
-
-Migration.prototype.final = function(resolve) {
-  this.sequence.enqueue(function() {
-    return resolve();
-  });
-};
-
-module.exports = {
-  up: function(queryInterface, Sequelize) {
-    return new BPromise(function(resolve) {
-      var migration = new Migration(queryInterface);
-
-      // START tools_contact_item_types
-      migration.query(
-        "CREATE TABLE `tools_contact_item_types` (" +
-        "  `id` INT AUTO_INCREMENT NOT NULL," +
-        "  `name` varchar(255) NOT NULL," +
-        "  `OrderBy` INT NULL," +
-        "  `rgbBackgroundColor` varchar(20) NULL," +
-        "  `createdAt` datetime NOT NULL," +
-        "  `updatedAt` datetime NOT NULL," +
-        "  UNIQUE  INDEX `item_type_id` (id) " +
-        ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"
-      );
-      // END tools_contact_item_types
-
-      // START cm_contact_has_items
-      migration.query(
-        "CREATE TABLE `cm_contact_has_items` (" +
-        "  `CmContactId` INT NOT NULL," +
-        "  `item` varchar(255) NOT NULL," +
-        "  `ItemTypeId` INT NULL," +
-        "  `ItemClass` VARCHAR(20) NOT NULL," +
-        "  `OrderBy` INT NULL," +
-        "  `description` varchar(255) DEFAULT NULL," +
-        "  `createdAt` datetime NOT NULL," +
-        "  `updatedAt` datetime NOT NULL," +
-        "  UNIQUE  INDEX `contact_item` (CmContactId,item), " +
-        "  CONSTRAINT `cm_contact_has_items_ibfk_1` FOREIGN KEY (`CmContactId`) REFERENCES `cm_contacts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, " +
-        "  CONSTRAINT `cm_contact_has_items_ibfk_2` FOREIGN KEY (`ItemTypeId`) REFERENCES `tools_contact_item_types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE" +
-        ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"
-      );
-      // END cm_contact_has_items
-
-      // START cm_hopper_additional_phones
-      migration.query(
-        "CREATE TABLE `cm_hopper_additional_phones` (" +
-        "  `id` INT AUTO_INCREMENT NOT NULL," +
-        "  `CmHopperId` INT NOT NULL," +
-        "  `phone` varchar(255) NOT NULL," +
-        "  `OrderBy` INT NULL default 0," +
-        "  `scheduledat` datetime NULL," +
-        "  `countbusyretry` INT NULL default 0," +
-        "  `countcongestionretry` INT NULL default 0," +
-        "  `countnoanswerretry` INT NULL default 0," +
-        "  `countnosuchnumberretry` INT NULL default 0," +
-        "  `countdropretry` INT NULL default 0," +
-        "  `countabandonedretry` INT NULL default 0," +
-        "  `countmachineretry` INT NULL default 0," +
-        "  `countagentrejectretry` INT NULL default 0," +
-        "  `createdAt` datetime NOT NULL," +
-        "  `updatedAt` datetime NOT NULL," +
-        "  UNIQUE  INDEX `hopper_additional_phone_id` (id), " +
-        "  INDEX `cm_hopper_phone_item` (CmHopperId), " +
-        "  CONSTRAINT `cm_hopper_phone_item1` FOREIGN KEY (`CmHopperId`) REFERENCES `cm_hopper` (`id`) ON DELETE CASCADE ON UPDATE CASCADE " +
-        ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"
-      );
-      // END cm_hopper_additional_phones
-
-      // START cm_hopper
-      migration.addColumn("cm_hopper", "OrderBy", {
-        type: Sequelize.INTEGER,
-        allowNull: true,
-        defaultValue: 0
-      });
-      // END cm_hopper
-
-      // START cm_contacts
-      migration.addColumn("cm_contacts", "AdditionalPhones", {
-        type: Sequelize.STRING,
-        allowNull: true
-      });
-      // START cm_contacts
-
-      // START voice_queues
-      migration.addColumn("voice_queues", "callAdditionalPhoneAfterMin", {
-        type: Sequelize.INTEGER,
-        defaultValue: 3
-      });
-      // END voice_queues
-
-      // START FINAL
-      migration.final(resolve);
-      // END FINAL
-    });
-  },
-
-  down: function(queryInterface, Sequelize) {
-    // var migration = new Migration(queryInterface);
-  }
-};
\ No newline at end of file
diff --git a/server/mysqldb/index.js b/server/mysqldb/index.js
index 449cba9..5e5cee7 100644
--- a/server/mysqldb/index.js
+++ b/server/mysqldb/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/routes.js b/server/routes.js
index 9ff0da1..33d60ce 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/rpc/index.js b/server/rpc/index.js
index ca334bf..bfd8063 100644
--- a/server/rpc/index.js
+++ b/server/rpc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/cmContactHasItem/cmContactHasItem.attributes.js b/server/safe-template.js
similarity index 53%
rename from server/api/cmContactHasItem/cmContactHasItem.attributes.js
rename to server/safe-template.js
index e5703c5..11d198c 100644
--- a/server/api/cmContactHasItem/cmContactHasItem.attributes.js
+++ b/server/safe-template.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/channel.js b/server/services/agi/channel.js
index 675e092..7c8a47f 100644
--- a/server/services/agi/channel.js
+++ b/server/services/agi/channel.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/error.js b/server/services/agi/error.js
index 68d6d2c..1d27d94 100644
--- a/server/services/agi/error.js
+++ b/server/services/agi/error.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/graph/index.js b/server/services/agi/graph/index.js
index c3346f0..8d9d242 100644
--- a/server/services/agi/graph/index.js
+++ b/server/services/agi/graph/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/index.js b/server/services/agi/index.js
index a4499fa..1cea4ff 100644
--- a/server/services/agi/index.js
+++ b/server/services/agi/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/mailRpc/index.js b/server/services/agi/mailRpc/index.js
index 1de936d..8d98028 100644
--- a/server/services/agi/mailRpc/index.js
+++ b/server/services/agi/mailRpc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/reply.js b/server/services/agi/reply.js
index b9d0e25..56e8a91 100644
--- a/server/services/agi/reply.js
+++ b/server/services/agi/reply.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/rpc/index.js b/server/services/agi/rpc/index.js
index 6db40dd..8391cc4 100644
--- a/server/services/agi/rpc/index.js
+++ b/server/services/agi/rpc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/aws/index.js b/server/services/agi/scripts/aws/index.js
index 7bf3a96..3a3d02a 100644
--- a/server/services/agi/scripts/aws/index.js
+++ b/server/services/agi/scripts/aws/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x84e7=['./lex','exports'];(function(_0x288885,_0x32adc2){var _0x179616=function(_0x3214c4){while(--_0x3214c4){_0x288885['push'](_0x288885['shift']());}};_0x179616(++_0x32adc2);}(_0x84e7,0x122));var _0x784e=function(_0x1cf4dd,_0x22eb58){_0x1cf4dd=_0x1cf4dd-0x0;var _0x20ce58=_0x84e7[_0x1cf4dd];return _0x20ce58;};var polly=require('./polly');var lex=require(_0x784e('0x0'));module[_0x784e('0x1')]={'polly':polly,'lex':lex};
\ No newline at end of file
+var _0xfdbd=['./polly','./lex','exports'];(function(_0x11bf43,_0xb3130c){var _0x173c94=function(_0x5a6fb2){while(--_0x5a6fb2){_0x11bf43['push'](_0x11bf43['shift']());}};_0x173c94(++_0xb3130c);}(_0xfdbd,0xf0));var _0xdfdb=function(_0x4bfac3,_0x58324d){_0x4bfac3=_0x4bfac3-0x0;var _0x15f0f2=_0xfdbd[_0x4bfac3];return _0x15f0f2;};var polly=require(_0xdfdb('0x0'));var lex=require(_0xdfdb('0x1'));module[_0xdfdb('0x2')]={'polly':polly,'lex':lex};
\ No newline at end of file
diff --git a/server/services/agi/scripts/aws/lex/index.js b/server/services/agi/scripts/aws/lex/index.js
index fc75428..32cecb0 100644
--- a/server/services/agi/scripts/aws/lex/index.js
+++ b/server/services/agi/scripts/aws/lex/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/aws/lex/lib/api.js b/server/services/agi/scripts/aws/lex/lib/api.js
index b6fa599..143c166 100644
--- a/server/services/agi/scripts/aws/lex/lib/api.js
+++ b/server/services/agi/scripts/aws/lex/lib/api.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/aws/polly/index.js b/server/services/agi/scripts/aws/polly/index.js
index 268bfeb..60bc30f 100644
--- a/server/services/agi/scripts/aws/polly/index.js
+++ b/server/services/agi/scripts/aws/polly/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/aws/polly/lib/api.js b/server/services/agi/scripts/aws/polly/lib/api.js
index c0178b7..401e967 100644
--- a/server/services/agi/scripts/aws/polly/lib/api.js
+++ b/server/services/agi/scripts/aws/polly/lib/api.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/google/asr/index.js b/server/services/agi/scripts/google/asr/index.js
index 2014502..9c00784 100644
--- a/server/services/agi/scripts/google/asr/index.js
+++ b/server/services/agi/scripts/google/asr/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x12de=['./lib/api','exports'];(function(_0x9329ba,_0x7912f4){var _0x1f4ee5=function(_0x3c081a){while(--_0x3c081a){_0x9329ba['push'](_0x9329ba['shift']());}};_0x1f4ee5(++_0x7912f4);}(_0x12de,0x192));var _0xe12d=function(_0x41373c,_0x4ebde7){_0x41373c=_0x41373c-0x0;var _0x223fd3=_0x12de[_0x41373c];return _0x223fd3;};'use strict';var asr=require(_0xe12d('0x0'));module[_0xe12d('0x1')]=function(_0x3132f7,_0x55955d,_0x233caa,_0x2ab629){return asr(_0x3132f7,_0x55955d,_0x233caa);};
\ No newline at end of file
+var _0x47ae=['exports','./lib/api'];(function(_0x3d73c6,_0x53b3e6){var _0x2c9c68=function(_0x10fa0b){while(--_0x10fa0b){_0x3d73c6['push'](_0x3d73c6['shift']());}};_0x2c9c68(++_0x53b3e6);}(_0x47ae,0x1eb));var _0xe47a=function(_0x39f34f,_0x298f45){_0x39f34f=_0x39f34f-0x0;var _0x59fee1=_0x47ae[_0x39f34f];return _0x59fee1;};'use strict';var asr=require(_0xe47a('0x0'));module[_0xe47a('0x1')]=function(_0x5b6854,_0x5f1290,_0x1ab586,_0x339891){return asr(_0x5b6854,_0x5f1290,_0x1ab586);};
\ No newline at end of file
diff --git a/server/services/agi/scripts/google/asr/lib/api.js b/server/services/agi/scripts/google/asr/lib/api.js
index 93bd694..87435f2 100644
--- a/server/services/agi/scripts/google/asr/lib/api.js
+++ b/server/services/agi/scripts/google/asr/lib/api.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/google/index.js b/server/services/agi/scripts/google/index.js
index b3acce3..69f053f 100644
--- a/server/services/agi/scripts/google/index.js
+++ b/server/services/agi/scripts/google/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x9a8f=['exports','./asr'];(function(_0xf3a858,_0x3a0d16){var _0x1e5b5a=function(_0x3f498e){while(--_0x3f498e){_0xf3a858['push'](_0xf3a858['shift']());}};_0x1e5b5a(++_0x3a0d16);}(_0x9a8f,0x159));var _0xf9a8=function(_0x3c5594,_0x928bd7){_0x3c5594=_0x3c5594-0x0;var _0x55dbee=_0x9a8f[_0x3c5594];return _0x55dbee;};var asr=require(_0xf9a8('0x0'));module[_0xf9a8('0x1')]={'asr':asr};
\ No newline at end of file
+var _0x7e34=['exports','./asr'];(function(_0x2742db,_0x58e00c){var _0x18659e=function(_0x5bd3ac){while(--_0x5bd3ac){_0x2742db['push'](_0x2742db['shift']());}};_0x18659e(++_0x58e00c);}(_0x7e34,0x10f));var _0x47e3=function(_0x1840de,_0xd08232){_0x1840de=_0x1840de-0x0;var _0x12d575=_0x7e34[_0x1840de];return _0x12d575;};var asr=require(_0x47e3('0x0'));module[_0x47e3('0x1')]={'asr':asr};
\ No newline at end of file
diff --git a/server/services/agi/scripts/index.js b/server/services/agi/scripts/index.js
index f4be1f1..a48ceab 100644
--- a/server/services/agi/scripts/index.js
+++ b/server/services/agi/scripts/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/sestek/index.js b/server/services/agi/scripts/sestek/index.js
index 1377067..8602045 100644
--- a/server/services/agi/scripts/sestek/index.js
+++ b/server/services/agi/scripts/sestek/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xfb12=['exports','./nda'];(function(_0x5ddb1c,_0x5ea4df){var _0x354adc=function(_0x2dfb1f){while(--_0x2dfb1f){_0x5ddb1c['push'](_0x5ddb1c['shift']());}};_0x354adc(++_0x5ea4df);}(_0xfb12,0x127));var _0x2fb1=function(_0x402a43,_0x68abb5){_0x402a43=_0x402a43-0x0;var _0xe8bc0=_0xfb12[_0x402a43];return _0xe8bc0;};var nda=require(_0x2fb1('0x0'));module[_0x2fb1('0x1')]={'nda':nda};
\ No newline at end of file
+var _0x0eb2=['exports'];(function(_0x5c351c,_0x2046d8){var _0x26f3b3=function(_0x47ac18){while(--_0x47ac18){_0x5c351c['push'](_0x5c351c['shift']());}};_0x26f3b3(++_0x2046d8);}(_0x0eb2,0x1e4));var _0x20eb=function(_0x396009,_0x409127){_0x396009=_0x396009-0x0;var _0x589e7e=_0x0eb2[_0x396009];return _0x589e7e;};var nda=require('./nda');module[_0x20eb('0x0')]={'nda':nda};
\ No newline at end of file
diff --git a/server/services/agi/scripts/sestek/nda/index.js b/server/services/agi/scripts/sestek/nda/index.js
index 733b73a..aa317c1 100644
--- a/server/services/agi/scripts/sestek/nda/index.js
+++ b/server/services/agi/scripts/sestek/nda/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/tilde/asr/index.js b/server/services/agi/scripts/tilde/asr/index.js
index 0017fce..e13280e 100644
--- a/server/services/agi/scripts/tilde/asr/index.js
+++ b/server/services/agi/scripts/tilde/asr/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xb067=['exports','./lib/api'];(function(_0x479988,_0x17b763){var _0x17610c=function(_0x1dc420){while(--_0x1dc420){_0x479988['push'](_0x479988['shift']());}};_0x17610c(++_0x17b763);}(_0xb067,0x1e5));var _0x7b06=function(_0x3dd15e,_0x1f0015){_0x3dd15e=_0x3dd15e-0x0;var _0x231fd0=_0xb067[_0x3dd15e];return _0x231fd0;};'use strict';var asr=require(_0x7b06('0x0'));module[_0x7b06('0x1')]=function(_0xbf2c0f,_0x2289a1,_0x379b62,_0x13802f){return asr(_0xbf2c0f,_0x2289a1,_0x379b62,_0x13802f);};
\ No newline at end of file
+var _0xbfdb=['./lib/api'];(function(_0xfff1af,_0x3c627d){var _0x4df459=function(_0x32f6d1){while(--_0x32f6d1){_0xfff1af['push'](_0xfff1af['shift']());}};_0x4df459(++_0x3c627d);}(_0xbfdb,0x181));var _0xbbfd=function(_0x4ea8ed,_0x426b34){_0x4ea8ed=_0x4ea8ed-0x0;var _0x3798cd=_0xbfdb[_0x4ea8ed];return _0x3798cd;};'use strict';var asr=require(_0xbbfd('0x0'));module['exports']=function(_0xd4b5eb,_0x2c3307,_0x505ebf,_0x58e2fa){return asr(_0xd4b5eb,_0x2c3307,_0x505ebf,_0x58e2fa);};
\ No newline at end of file
diff --git a/server/services/agi/scripts/tilde/asr/lib/api.js b/server/services/agi/scripts/tilde/asr/lib/api.js
index 6f0c012..b57cc92 100644
--- a/server/services/agi/scripts/tilde/asr/lib/api.js
+++ b/server/services/agi/scripts/tilde/asr/lib/api.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/scripts/tilde/index.js b/server/services/agi/scripts/tilde/index.js
index 06f3376..b31263e 100644
--- a/server/services/agi/scripts/tilde/index.js
+++ b/server/services/agi/scripts/tilde/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0x2651=['exports','./asr'];(function(_0x1dad92,_0x2f948c){var _0x90a9f6=function(_0x5644db){while(--_0x5644db){_0x1dad92['push'](_0x1dad92['shift']());}};_0x90a9f6(++_0x2f948c);}(_0x2651,0xc9));var _0x1265=function(_0x39c734,_0x2f3e06){_0x39c734=_0x39c734-0x0;var _0xb2a2f9=_0x2651[_0x39c734];return _0xb2a2f9;};var asr=require(_0x1265('0x0'));module[_0x1265('0x1')]={'asr':asr};
\ No newline at end of file
+var _0xd15c=['./asr','exports'];(function(_0x3779eb,_0xc19002){var _0x50423a=function(_0x16e841){while(--_0x16e841){_0x3779eb['push'](_0x3779eb['shift']());}};_0x50423a(++_0xc19002);}(_0xd15c,0x138));var _0xcd15=function(_0x265f56,_0x511c3b){_0x265f56=_0x265f56-0x0;var _0x3710ee=_0xd15c[_0x265f56];return _0x3710ee;};var asr=require(_0xcd15('0x0'));module[_0xcd15('0x1')]={'asr':asr};
\ No newline at end of file
diff --git a/server/services/agi/server.js b/server/services/agi/server.js
index dd3adf7..ad58024 100644
--- a/server/services/agi/server.js
+++ b/server/services/agi/server.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/agi/vertices.js b/server/services/agi/vertices.js
index 58dbe82..bece769 100644
--- a/server/services/agi/vertices.js
+++ b/server/services/agi/vertices.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/acw/index.js b/server/services/ami/acw/index.js
index e7c2c79..56794a5 100644
--- a/server/services/ami/acw/index.js
+++ b/server/services/ami/acw/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/ami.js b/server/services/ami/ami.js
index a8ac9ff..c39c898 100644
--- a/server/services/ami/ami.js
+++ b/server/services/ami/ami.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/client.js b/server/services/ami/client.js
index 8ea7166..fc429d4 100644
--- a/server/services/ami/client.js
+++ b/server/services/ami/client.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/action.js b/server/services/ami/dialer/action.js
index 3de5979..027219b 100644
--- a/server/services/ami/dialer/action.js
+++ b/server/services/ami/dialer/action.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/additionalPhone.js b/server/services/ami/dialer/additionalPhone.js
deleted file mode 100644
index fdbd2b5..0000000
--- a/server/services/ami/dialer/additionalPhone.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/services/ami/dialer/agentComplete.js b/server/services/ami/dialer/agentComplete.js
index 7c8d283..68c9152 100644
--- a/server/services/ami/dialer/agentComplete.js
+++ b/server/services/ami/dialer/agentComplete.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/final.js b/server/services/ami/dialer/final.js
index df4551c..3818be3 100644
--- a/server/services/ami/dialer/final.js
+++ b/server/services/ami/dialer/final.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/hangup.js b/server/services/ami/dialer/hangup.js
index 196606c..e5898fe 100644
--- a/server/services/ami/dialer/hangup.js
+++ b/server/services/ami/dialer/hangup.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/history.js b/server/services/ami/dialer/history.js
index 876398b..a09c341 100644
--- a/server/services/ami/dialer/history.js
+++ b/server/services/ami/dialer/history.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/index.js b/server/services/ami/dialer/index.js
index 192bb10..cd94023 100644
--- a/server/services/ami/dialer/index.js
+++ b/server/services/ami/dialer/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/dialer/queueCallerAbandon.js b/server/services/ami/dialer/queueCallerAbandon.js
index 12d7d5e..e1ebdd7 100644
--- a/server/services/ami/dialer/queueCallerAbandon.js
+++ b/server/services/ami/dialer/queueCallerAbandon.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/fax/action.js b/server/services/ami/fax/action.js
index 6e70b0b..42eb2c1 100644
--- a/server/services/ami/fax/action.js
+++ b/server/services/ami/fax/action.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/fax/index.js b/server/services/ami/fax/index.js
index a757d7e..d6c6c8c 100644
--- a/server/services/ami/fax/index.js
+++ b/server/services/ami/fax/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/fax/rpcDb.js b/server/services/ami/fax/rpcDb.js
index 7a8cb20..cd1225c 100644
--- a/server/services/ami/fax/rpcDb.js
+++ b/server/services/ami/fax/rpcDb.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/fax/util/gs.js b/server/services/ami/fax/util/gs.js
index 77c5a73..3f4e120 100644
--- a/server/services/ami/fax/util/gs.js
+++ b/server/services/ami/fax/util/gs.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/fax/util/util.js b/server/services/ami/fax/util/util.js
index 8ff77b8..0747b15 100644
--- a/server/services/ami/fax/util/util.js
+++ b/server/services/ami/fax/util/util.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/index.js b/server/services/ami/index.js
index 1d1b22d..4636688 100644
--- a/server/services/ami/index.js
+++ b/server/services/ami/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/agent.js b/server/services/ami/model/agent.js
index bb87ae1..f757760 100644
--- a/server/services/ami/model/agent.js
+++ b/server/services/ami/model/agent.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/campaign.js b/server/services/ami/model/campaign.js
index e495719..957a64c 100644
--- a/server/services/ami/model/campaign.js
+++ b/server/services/ami/model/campaign.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/channel.js b/server/services/ami/model/channel.js
index 2004f02..cfa8f8f 100644
--- a/server/services/ami/model/channel.js
+++ b/server/services/ami/model/channel.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/deskAccount.js b/server/services/ami/model/deskAccount.js
index c55977e..56ec096 100644
--- a/server/services/ami/model/deskAccount.js
+++ b/server/services/ami/model/deskAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/dynamics365Account.js b/server/services/ami/model/dynamics365Account.js
index 6007e50..49f22b9 100644
--- a/server/services/ami/model/dynamics365Account.js
+++ b/server/services/ami/model/dynamics365Account.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/faxAccount.js b/server/services/ami/model/faxAccount.js
index 33651bc..bae05ba 100644
--- a/server/services/ami/model/faxAccount.js
+++ b/server/services/ami/model/faxAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/freshdeskAccount.js b/server/services/ami/model/freshdeskAccount.js
index 65f79f9..b457148 100644
--- a/server/services/ami/model/freshdeskAccount.js
+++ b/server/services/ami/model/freshdeskAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/freshsalesAccount.js b/server/services/ami/model/freshsalesAccount.js
index 664a3e9..1e2595e 100644
--- a/server/services/ami/model/freshsalesAccount.js
+++ b/server/services/ami/model/freshsalesAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/queueReport.js b/server/services/ami/model/queueReport.js
index 02e000e..167144f 100644
--- a/server/services/ami/model/queueReport.js
+++ b/server/services/ami/model/queueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/salesforceAccount.js b/server/services/ami/model/salesforceAccount.js
index 76119a2..cd0bc4d 100644
--- a/server/services/ami/model/salesforceAccount.js
+++ b/server/services/ami/model/salesforceAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/servicenowAccount.js b/server/services/ami/model/servicenowAccount.js
index 1b83526..17e5fca 100644
--- a/server/services/ami/model/servicenowAccount.js
+++ b/server/services/ami/model/servicenowAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/sugarcrmAccount.js b/server/services/ami/model/sugarcrmAccount.js
index 4dc8550..000f839 100644
--- a/server/services/ami/model/sugarcrmAccount.js
+++ b/server/services/ami/model/sugarcrmAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/telephone.js b/server/services/ami/model/telephone.js
index 174805d..fe4d380 100644
--- a/server/services/ami/model/telephone.js
+++ b/server/services/ami/model/telephone.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/template.js b/server/services/ami/model/template.js
index afc4496..43d57a1 100644
--- a/server/services/ami/model/template.js
+++ b/server/services/ami/model/template.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/trigger.js b/server/services/ami/model/trigger.js
index 9a2f77b..93ad9e1 100644
--- a/server/services/ami/model/trigger.js
+++ b/server/services/ami/model/trigger.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/trunk.js b/server/services/ami/model/trunk.js
index 6e9daa1..2b83c39 100644
--- a/server/services/ami/model/trunk.js
+++ b/server/services/ami/model/trunk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/voiceExtension.js b/server/services/ami/model/voiceExtension.js
index 4e37504..068a3f4 100644
--- a/server/services/ami/model/voiceExtension.js
+++ b/server/services/ami/model/voiceExtension.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/voiceQueue.js b/server/services/ami/model/voiceQueue.js
index 657bf3f..ef4e245 100644
--- a/server/services/ami/model/voiceQueue.js
+++ b/server/services/ami/model/voiceQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/vtigerAccount.js b/server/services/ami/model/vtigerAccount.js
index 52b714a..612ab0d 100644
--- a/server/services/ami/model/vtigerAccount.js
+++ b/server/services/ami/model/vtigerAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/zendeskAccount.js b/server/services/ami/model/zendeskAccount.js
index fc30443..f655f77 100644
--- a/server/services/ami/model/zendeskAccount.js
+++ b/server/services/ami/model/zendeskAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/model/zohoAccount.js b/server/services/ami/model/zohoAccount.js
index ded0fcc..a4d2463 100644
--- a/server/services/ami/model/zohoAccount.js
+++ b/server/services/ami/model/zohoAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/preview/action.js b/server/services/ami/preview/action.js
index ff7eb84..d8e2460 100644
--- a/server/services/ami/preview/action.js
+++ b/server/services/ami/preview/action.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/preview/index.js b/server/services/ami/preview/index.js
index 078c6a7..a379963 100644
--- a/server/services/ami/preview/index.js
+++ b/server/services/ami/preview/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/preview/rpcDb.js b/server/services/ami/preview/rpcDb.js
index 5a1dc10..2196509 100644
--- a/server/services/ami/preview/rpcDb.js
+++ b/server/services/ami/preview/rpcDb.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/preview/util/util.js b/server/services/ami/preview/util/util.js
index e7e71c0..6469ff9 100644
--- a/server/services/ami/preview/util/util.js
+++ b/server/services/ami/preview/util/util.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/properties.js b/server/services/ami/properties.js
index e0ae891..4eb1fa5 100644
--- a/server/services/ami/properties.js
+++ b/server/services/ami/properties.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/realtime/index.js b/server/services/ami/realtime/index.js
index 1749842..13c57a4 100644
--- a/server/services/ami/realtime/index.js
+++ b/server/services/ami/realtime/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/index.js b/server/services/ami/report/index.js
index c932679..7181d0a 100644
--- a/server/services/ami/report/index.js
+++ b/server/services/ami/report/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/userReport.js b/server/services/ami/report/userReport.js
index 18c81da..aac668c 100644
--- a/server/services/ami/report/userReport.js
+++ b/server/services/ami/report/userReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/voiceAgentReport.js b/server/services/ami/report/voiceAgentReport.js
index e0c3c35..697baa5 100644
--- a/server/services/ami/report/voiceAgentReport.js
+++ b/server/services/ami/report/voiceAgentReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/voiceCallReport.js b/server/services/ami/report/voiceCallReport.js
index 8173dab..ef8456d 100644
--- a/server/services/ami/report/voiceCallReport.js
+++ b/server/services/ami/report/voiceCallReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/voiceDialReport.js b/server/services/ami/report/voiceDialReport.js
index 2112dcf..3b0f8d8 100644
--- a/server/services/ami/report/voiceDialReport.js
+++ b/server/services/ami/report/voiceDialReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/report/voiceQueueReport.js b/server/services/ami/report/voiceQueueReport.js
index 0947b61..d78da15 100644
--- a/server/services/ami/report/voiceQueueReport.js
+++ b/server/services/ami/report/voiceQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/agentReportPreview.js b/server/services/ami/rpc/agentReportPreview.js
index 42c7f56..7422fa3 100644
--- a/server/services/ami/rpc/agentReportPreview.js
+++ b/server/services/ami/rpc/agentReportPreview.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/attachment.js b/server/services/ami/rpc/attachment.js
index b31bdaf..43165d0 100644
--- a/server/services/ami/rpc/attachment.js
+++ b/server/services/ami/rpc/attachment.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/campaign.js b/server/services/ami/rpc/campaign.js
index 1dec3c5..543dea9 100644
--- a/server/services/ami/rpc/campaign.js
+++ b/server/services/ami/rpc/campaign.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmContact.js b/server/services/ami/rpc/cmContact.js
index 01d25df..ddf6da7 100644
--- a/server/services/ami/rpc/cmContact.js
+++ b/server/services/ami/rpc/cmContact.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmHopper.js b/server/services/ami/rpc/cmHopper.js
index 3a08217..1908356 100644
--- a/server/services/ami/rpc/cmHopper.js
+++ b/server/services/ami/rpc/cmHopper.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmHopperAdditionalPhone.js b/server/services/ami/rpc/cmHopperAdditionalPhone.js
deleted file mode 100644
index db9d68d..0000000
--- a/server/services/ami/rpc/cmHopperAdditionalPhone.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// *************************************************************************
-// *                                                                       *
-// * xCALLY Motion -  The Omnichannel Contact Center                       *
-// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * Email: [email-masked]                                                *
-// * Website: https://www.xcally.com                                       *
-// *                                                                       *
-// *************************************************************************
-// *                                                                       *
-// * The SOFTWARE PRODUCT is protected by copyright laws and international *
-// * copyright treaties, as well as other intellectual property laws and   *
-// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
-// *                                                                       *
-// *************************************************************************
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmHopperBlack.js b/server/services/ami/rpc/cmHopperBlack.js
index 30f7726..200c0e4 100644
--- a/server/services/ami/rpc/cmHopperBlack.js
+++ b/server/services/ami/rpc/cmHopperBlack.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmHopperFinal.js b/server/services/ami/rpc/cmHopperFinal.js
index 6cd356c..a0014ca 100644
--- a/server/services/ami/rpc/cmHopperFinal.js
+++ b/server/services/ami/rpc/cmHopperFinal.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/cmHopperHistory.js b/server/services/ami/rpc/cmHopperHistory.js
index 638218e..2c43ba5 100644
--- a/server/services/ami/rpc/cmHopperHistory.js
+++ b/server/services/ami/rpc/cmHopperHistory.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/faxAccount.js b/server/services/ami/rpc/faxAccount.js
index fb17684..688dd16 100644
--- a/server/services/ami/rpc/faxAccount.js
+++ b/server/services/ami/rpc/faxAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/faxMessage.js b/server/services/ami/rpc/faxMessage.js
index e07e793..8edec24 100644
--- a/server/services/ami/rpc/faxMessage.js
+++ b/server/services/ami/rpc/faxMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/desk.js b/server/services/ami/rpc/integrations/desk.js
index a3dec2a..12a1b07 100644
--- a/server/services/ami/rpc/integrations/desk.js
+++ b/server/services/ami/rpc/integrations/desk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/dynamics365.js b/server/services/ami/rpc/integrations/dynamics365.js
index 9ff47ba..592c117 100644
--- a/server/services/ami/rpc/integrations/dynamics365.js
+++ b/server/services/ami/rpc/integrations/dynamics365.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/freshdesk.js b/server/services/ami/rpc/integrations/freshdesk.js
index b871170..10a1ebb 100644
--- a/server/services/ami/rpc/integrations/freshdesk.js
+++ b/server/services/ami/rpc/integrations/freshdesk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/freshsales.js b/server/services/ami/rpc/integrations/freshsales.js
index 5f4215f..7495df4 100644
--- a/server/services/ami/rpc/integrations/freshsales.js
+++ b/server/services/ami/rpc/integrations/freshsales.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/salesforce.js b/server/services/ami/rpc/integrations/salesforce.js
index 815699b..230dc2e 100644
--- a/server/services/ami/rpc/integrations/salesforce.js
+++ b/server/services/ami/rpc/integrations/salesforce.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/servicenow.js b/server/services/ami/rpc/integrations/servicenow.js
index 32633ec..52ac9e4 100644
--- a/server/services/ami/rpc/integrations/servicenow.js
+++ b/server/services/ami/rpc/integrations/servicenow.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/sugarcrm.js b/server/services/ami/rpc/integrations/sugarcrm.js
index 3e786eb..29235ad 100644
--- a/server/services/ami/rpc/integrations/sugarcrm.js
+++ b/server/services/ami/rpc/integrations/sugarcrm.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/vtiger.js b/server/services/ami/rpc/integrations/vtiger.js
index 0d0b620..5405fb5 100644
--- a/server/services/ami/rpc/integrations/vtiger.js
+++ b/server/services/ami/rpc/integrations/vtiger.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/zendesk.js b/server/services/ami/rpc/integrations/zendesk.js
index 455185c..f390ea0 100644
--- a/server/services/ami/rpc/integrations/zendesk.js
+++ b/server/services/ami/rpc/integrations/zendesk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/integrations/zoho.js b/server/services/ami/rpc/integrations/zoho.js
index 91ce5c3..c0f2584 100644
--- a/server/services/ami/rpc/integrations/zoho.js
+++ b/server/services/ami/rpc/integrations/zoho.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/memberReport.js b/server/services/ami/rpc/memberReport.js
index cd95191..6e28a8c 100644
--- a/server/services/ami/rpc/memberReport.js
+++ b/server/services/ami/rpc/memberReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/setting.js b/server/services/ami/rpc/setting.js
index 0141ed8..57eafa6 100644
--- a/server/services/ami/rpc/setting.js
+++ b/server/services/ami/rpc/setting.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/template.js b/server/services/ami/rpc/template.js
index d60728b..29194b1 100644
--- a/server/services/ami/rpc/template.js
+++ b/server/services/ami/rpc/template.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/trigger.js b/server/services/ami/rpc/trigger.js
index 6df88ee..41048d1 100644
--- a/server/services/ami/rpc/trigger.js
+++ b/server/services/ami/rpc/trigger.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/trunk.js b/server/services/ami/rpc/trunk.js
index 564f5af..fdc03dc 100644
--- a/server/services/ami/rpc/trunk.js
+++ b/server/services/ami/rpc/trunk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/user.js b/server/services/ami/rpc/user.js
index 01ba27e..581d6c7 100644
--- a/server/services/ami/rpc/user.js
+++ b/server/services/ami/rpc/user.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceAgentReport.js b/server/services/ami/rpc/voiceAgentReport.js
index 501f4d3..c2ea7e3 100644
--- a/server/services/ami/rpc/voiceAgentReport.js
+++ b/server/services/ami/rpc/voiceAgentReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceCallReport.js b/server/services/ami/rpc/voiceCallReport.js
index d99b1b6..f60d814 100644
--- a/server/services/ami/rpc/voiceCallReport.js
+++ b/server/services/ami/rpc/voiceCallReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceDialReport.js b/server/services/ami/rpc/voiceDialReport.js
index 554f38e..0db094c 100644
--- a/server/services/ami/rpc/voiceDialReport.js
+++ b/server/services/ami/rpc/voiceDialReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceExtension.js b/server/services/ami/rpc/voiceExtension.js
index cac14a8..dd4657a 100644
--- a/server/services/ami/rpc/voiceExtension.js
+++ b/server/services/ami/rpc/voiceExtension.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceQueue.js b/server/services/ami/rpc/voiceQueue.js
index 9d956cd..a24691d 100644
--- a/server/services/ami/rpc/voiceQueue.js
+++ b/server/services/ami/rpc/voiceQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceQueueReport.js b/server/services/ami/rpc/voiceQueueReport.js
index fa0114f..9614351 100644
--- a/server/services/ami/rpc/voiceQueueReport.js
+++ b/server/services/ami/rpc/voiceQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceQueueRt.js b/server/services/ami/rpc/voiceQueueRt.js
index 8657757..b7a2d5b 100644
--- a/server/services/ami/rpc/voiceQueueRt.js
+++ b/server/services/ami/rpc/voiceQueueRt.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceRecording.js b/server/services/ami/rpc/voiceRecording.js
index 51f8885..33df543 100644
--- a/server/services/ami/rpc/voiceRecording.js
+++ b/server/services/ami/rpc/voiceRecording.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/rpc/voiceTransferReport.js b/server/services/ami/rpc/voiceTransferReport.js
index d80f7e8..1ea8c1c 100644
--- a/server/services/ami/rpc/voiceTransferReport.js
+++ b/server/services/ami/rpc/voiceTransferReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/server/index.js b/server/services/ami/server/index.js
index 6592711..72c8aab 100644
--- a/server/services/ami/server/index.js
+++ b/server/services/ami/server/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/cmContact/index.js b/server/services/ami/trigger/cmContact/index.js
index 2fbe112..d8db8b1 100644
--- a/server/services/ami/trigger/cmContact/index.js
+++ b/server/services/ami/trigger/cmContact/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/index.js b/server/services/ami/trigger/index.js
index 5d8fc8d..88643e9 100644
--- a/server/services/ami/trigger/index.js
+++ b/server/services/ami/trigger/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/desk.js b/server/services/ami/trigger/integration/desk.js
index 62869d3..9715e92 100644
--- a/server/services/ami/trigger/integration/desk.js
+++ b/server/services/ami/trigger/integration/desk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/dynamics365.js b/server/services/ami/trigger/integration/dynamics365.js
index bbadc71..401b6e6 100644
--- a/server/services/ami/trigger/integration/dynamics365.js
+++ b/server/services/ami/trigger/integration/dynamics365.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/freshdesk.js b/server/services/ami/trigger/integration/freshdesk.js
index 9a382cb..fca6b1f 100644
--- a/server/services/ami/trigger/integration/freshdesk.js
+++ b/server/services/ami/trigger/integration/freshdesk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/freshsales.js b/server/services/ami/trigger/integration/freshsales.js
index dcfb8cb..cfd4824 100644
--- a/server/services/ami/trigger/integration/freshsales.js
+++ b/server/services/ami/trigger/integration/freshsales.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/index.js b/server/services/ami/trigger/integration/index.js
index 77246b6..79d520b 100644
--- a/server/services/ami/trigger/integration/index.js
+++ b/server/services/ami/trigger/integration/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/salesforce.js b/server/services/ami/trigger/integration/salesforce.js
index d3a7e8c..ce77586 100644
--- a/server/services/ami/trigger/integration/salesforce.js
+++ b/server/services/ami/trigger/integration/salesforce.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/servicenow.js b/server/services/ami/trigger/integration/servicenow.js
index 42cdd17..dc428fd 100644
--- a/server/services/ami/trigger/integration/servicenow.js
+++ b/server/services/ami/trigger/integration/servicenow.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/sugarcrm.js b/server/services/ami/trigger/integration/sugarcrm.js
index db3f065..0770679 100644
--- a/server/services/ami/trigger/integration/sugarcrm.js
+++ b/server/services/ami/trigger/integration/sugarcrm.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/util.js b/server/services/ami/trigger/integration/util.js
index 4f1eab8..d229e1b 100644
--- a/server/services/ami/trigger/integration/util.js
+++ b/server/services/ami/trigger/integration/util.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/vtiger.js b/server/services/ami/trigger/integration/vtiger.js
index de80215..6b51b7b 100644
--- a/server/services/ami/trigger/integration/vtiger.js
+++ b/server/services/ami/trigger/integration/vtiger.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/zendesk.js b/server/services/ami/trigger/integration/zendesk.js
index 6c034a7..0b80054 100644
--- a/server/services/ami/trigger/integration/zendesk.js
+++ b/server/services/ami/trigger/integration/zendesk.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/integration/zoho.js b/server/services/ami/trigger/integration/zoho.js
index 613abbf..5846433 100644
--- a/server/services/ami/trigger/integration/zoho.js
+++ b/server/services/ami/trigger/integration/zoho.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/script/index.js b/server/services/ami/trigger/script/index.js
index b6e39b9..6b6fd81 100644
--- a/server/services/ami/trigger/script/index.js
+++ b/server/services/ami/trigger/script/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/ami/trigger/urlforward/index.js b/server/services/ami/trigger/urlforward/index.js
index 2fd6716..86e96bd 100644
--- a/server/services/ami/trigger/urlforward/index.js
+++ b/server/services/ami/trigger/urlforward/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/client.js b/server/services/email/client.js
index f2c11b7..82f34c6 100644
--- a/server/services/email/client.js
+++ b/server/services/email/client.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/index.js b/server/services/email/index.js
index 03c5d64..be494cd 100644
--- a/server/services/email/index.js
+++ b/server/services/email/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/lib/email.js b/server/services/email/lib/email.js
index 15e9051..397d62b 100644
--- a/server/services/email/lib/email.js
+++ b/server/services/email/lib/email.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/lib/imap.js b/server/services/email/lib/imap.js
index b27ff22..2acdda9 100644
--- a/server/services/email/lib/imap.js
+++ b/server/services/email/lib/imap.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/lib/smtp.js b/server/services/email/lib/smtp.js
index dac2f53..ac7f304 100644
--- a/server/services/email/lib/smtp.js
+++ b/server/services/email/lib/smtp.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/lib/utils.js b/server/services/email/lib/utils.js
index 3ce3134..fb90ad1 100644
--- a/server/services/email/lib/utils.js
+++ b/server/services/email/lib/utils.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/model/mailAccount.js b/server/services/email/model/mailAccount.js
index a5a4022..3c564ce 100644
--- a/server/services/email/model/mailAccount.js
+++ b/server/services/email/model/mailAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/realtime/index.js b/server/services/email/realtime/index.js
index 8b08b50..abec21a 100644
--- a/server/services/email/realtime/index.js
+++ b/server/services/email/realtime/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/rpc/mailAccount.js b/server/services/email/rpc/mailAccount.js
index 8a4104e..0de347a 100644
--- a/server/services/email/rpc/mailAccount.js
+++ b/server/services/email/rpc/mailAccount.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/rpc/setting.js b/server/services/email/rpc/setting.js
index 15262c0..0694d82 100644
--- a/server/services/email/rpc/setting.js
+++ b/server/services/email/rpc/setting.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/email/server/index.js b/server/services/email/server/index.js
index e8383bc..ba57ff5 100644
--- a/server/services/email/server/index.js
+++ b/server/services/email/server/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/express/index.js b/server/services/express/index.js
index 0e17be2..d86b84c 100644
--- a/server/services/express/index.js
+++ b/server/services/express/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/client.js b/server/services/routing/client.js
index de169cb..1f28aec 100644
--- a/server/services/routing/client.js
+++ b/server/services/routing/client.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/index.js b/server/services/routing/index.js
index bfdfb2d..36285fa 100644
--- a/server/services/routing/index.js
+++ b/server/services/routing/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/lib/rule-engine.js b/server/services/routing/lib/rule-engine.js
index 843a68e..0b215a4 100644
--- a/server/services/routing/lib/rule-engine.js
+++ b/server/services/routing/lib/rule-engine.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/mailRpc/index.js b/server/services/routing/mailRpc/index.js
index 0b84a74..1619f4c 100644
--- a/server/services/routing/mailRpc/index.js
+++ b/server/services/routing/mailRpc/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/agent.js b/server/services/routing/model/agent.js
index f1b2b48..1a80aad 100644
--- a/server/services/routing/model/agent.js
+++ b/server/services/routing/model/agent.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/chatQueue.js b/server/services/routing/model/chatQueue.js
index 8859363..576493b 100644
--- a/server/services/routing/model/chatQueue.js
+++ b/server/services/routing/model/chatQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/faxQueue.js b/server/services/routing/model/faxQueue.js
index d207dc2..c0eeaf6 100644
--- a/server/services/routing/model/faxQueue.js
+++ b/server/services/routing/model/faxQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/interval.js b/server/services/routing/model/interval.js
index 2acf919..a5ac8ad 100644
--- a/server/services/routing/model/interval.js
+++ b/server/services/routing/model/interval.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/mailQueue.js b/server/services/routing/model/mailQueue.js
index c812657..946226e 100644
--- a/server/services/routing/model/mailQueue.js
+++ b/server/services/routing/model/mailQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/openchannelQueue.js b/server/services/routing/model/openchannelQueue.js
index a71dda3..56705ab 100644
--- a/server/services/routing/model/openchannelQueue.js
+++ b/server/services/routing/model/openchannelQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/smsQueue.js b/server/services/routing/model/smsQueue.js
index 61f075a..b57e2ca 100644
--- a/server/services/routing/model/smsQueue.js
+++ b/server/services/routing/model/smsQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/model/whatsappQueue.js b/server/services/routing/model/whatsappQueue.js
index 1d38af7..059095b 100644
--- a/server/services/routing/model/whatsappQueue.js
+++ b/server/services/routing/model/whatsappQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/realtime/index.js b/server/services/routing/realtime/index.js
index 6198c1f..27ba542 100644
--- a/server/services/routing/realtime/index.js
+++ b/server/services/routing/realtime/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/chatInteraction.js b/server/services/routing/rpc/chatInteraction.js
index 80a3b4c..710c930 100644
--- a/server/services/routing/rpc/chatInteraction.js
+++ b/server/services/routing/rpc/chatInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/chatMessage.js b/server/services/routing/rpc/chatMessage.js
index 626d2a8..34ed958 100644
--- a/server/services/routing/rpc/chatMessage.js
+++ b/server/services/routing/rpc/chatMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/chatQueue.js b/server/services/routing/rpc/chatQueue.js
index e7572c8..972b5cd 100644
--- a/server/services/routing/rpc/chatQueue.js
+++ b/server/services/routing/rpc/chatQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/chatQueueReport.js b/server/services/routing/rpc/chatQueueReport.js
index 03e0d83..c12318a 100644
--- a/server/services/routing/rpc/chatQueueReport.js
+++ b/server/services/routing/rpc/chatQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/faxInteraction.js b/server/services/routing/rpc/faxInteraction.js
index ac77d2a..fb30d56 100644
--- a/server/services/routing/rpc/faxInteraction.js
+++ b/server/services/routing/rpc/faxInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/faxMessage.js b/server/services/routing/rpc/faxMessage.js
index ad108b7..5304365 100644
--- a/server/services/routing/rpc/faxMessage.js
+++ b/server/services/routing/rpc/faxMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/faxQueue.js b/server/services/routing/rpc/faxQueue.js
index b5293a5..8107afe 100644
--- a/server/services/routing/rpc/faxQueue.js
+++ b/server/services/routing/rpc/faxQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/faxQueueReport.js b/server/services/routing/rpc/faxQueueReport.js
index 6695429..a5d969e 100644
--- a/server/services/routing/rpc/faxQueueReport.js
+++ b/server/services/routing/rpc/faxQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/interval.js b/server/services/routing/rpc/interval.js
index d4b7d2e..db5cdda 100644
--- a/server/services/routing/rpc/interval.js
+++ b/server/services/routing/rpc/interval.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/mailInteraction.js b/server/services/routing/rpc/mailInteraction.js
index 9e81e21..d0bd31f 100644
--- a/server/services/routing/rpc/mailInteraction.js
+++ b/server/services/routing/rpc/mailInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/mailMessage.js b/server/services/routing/rpc/mailMessage.js
index b9721bd..52c3696 100644
--- a/server/services/routing/rpc/mailMessage.js
+++ b/server/services/routing/rpc/mailMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/mailQueue.js b/server/services/routing/rpc/mailQueue.js
index bb6c3b7..2a946aa 100644
--- a/server/services/routing/rpc/mailQueue.js
+++ b/server/services/routing/rpc/mailQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/mailQueueReport.js b/server/services/routing/rpc/mailQueueReport.js
index cca2b8f..380724e 100644
--- a/server/services/routing/rpc/mailQueueReport.js
+++ b/server/services/routing/rpc/mailQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/openchannelInteraction.js b/server/services/routing/rpc/openchannelInteraction.js
index dfa57dc..e627db2 100644
--- a/server/services/routing/rpc/openchannelInteraction.js
+++ b/server/services/routing/rpc/openchannelInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/openchannelMessage.js b/server/services/routing/rpc/openchannelMessage.js
index 9f5d27a..b27fa42 100644
--- a/server/services/routing/rpc/openchannelMessage.js
+++ b/server/services/routing/rpc/openchannelMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/openchannelQueue.js b/server/services/routing/rpc/openchannelQueue.js
index 96f62c3..31dc33f 100644
--- a/server/services/routing/rpc/openchannelQueue.js
+++ b/server/services/routing/rpc/openchannelQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/openchannelQueueReport.js b/server/services/routing/rpc/openchannelQueueReport.js
index a965d79..d340e9b 100644
--- a/server/services/routing/rpc/openchannelQueueReport.js
+++ b/server/services/routing/rpc/openchannelQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/smsInteraction.js b/server/services/routing/rpc/smsInteraction.js
index 603593c..8ed32ed 100644
--- a/server/services/routing/rpc/smsInteraction.js
+++ b/server/services/routing/rpc/smsInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/smsMessage.js b/server/services/routing/rpc/smsMessage.js
index 4f0fd0c..f419dc3 100644
--- a/server/services/routing/rpc/smsMessage.js
+++ b/server/services/routing/rpc/smsMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/smsQueue.js b/server/services/routing/rpc/smsQueue.js
index b540d73..5ecfe31 100644
--- a/server/services/routing/rpc/smsQueue.js
+++ b/server/services/routing/rpc/smsQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/smsQueueReport.js b/server/services/routing/rpc/smsQueueReport.js
index 107a69b..2147cb7 100644
--- a/server/services/routing/rpc/smsQueueReport.js
+++ b/server/services/routing/rpc/smsQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/user.js b/server/services/routing/rpc/user.js
index 09a7ec8..06d1db0 100644
--- a/server/services/routing/rpc/user.js
+++ b/server/services/routing/rpc/user.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/whatsappInteraction.js b/server/services/routing/rpc/whatsappInteraction.js
index e8980d4..3296b5a 100644
--- a/server/services/routing/rpc/whatsappInteraction.js
+++ b/server/services/routing/rpc/whatsappInteraction.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/whatsappMessage.js b/server/services/routing/rpc/whatsappMessage.js
index 9a53f37..2bbc411 100644
--- a/server/services/routing/rpc/whatsappMessage.js
+++ b/server/services/routing/rpc/whatsappMessage.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/whatsappQueue.js b/server/services/routing/rpc/whatsappQueue.js
index af63d05..5c51ced 100644
--- a/server/services/routing/rpc/whatsappQueue.js
+++ b/server/services/routing/rpc/whatsappQueue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/rpc/whatsappQueueReport.js b/server/services/routing/rpc/whatsappQueueReport.js
index ebcf7ff..9063bd7 100644
--- a/server/services/routing/rpc/whatsappQueueReport.js
+++ b/server/services/routing/rpc/whatsappQueueReport.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/agent.js b/server/services/routing/server/applications/agent.js
index adc5b20..f41a302 100644
--- a/server/services/routing/server/applications/agent.js
+++ b/server/services/routing/server/applications/agent.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/amazonlex.js b/server/services/routing/server/applications/amazonlex.js
index 227c3d4..6ff2814 100644
--- a/server/services/routing/server/applications/amazonlex.js
+++ b/server/services/routing/server/applications/amazonlex.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/autoreply.js b/server/services/routing/server/applications/autoreply.js
index 793714f..250605f 100644
--- a/server/services/routing/server/applications/autoreply.js
+++ b/server/services/routing/server/applications/autoreply.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/close.js b/server/services/routing/server/applications/close.js
index 1285b29..12f1cf4 100644
--- a/server/services/routing/server/applications/close.js
+++ b/server/services/routing/server/applications/close.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/dialogflow.js b/server/services/routing/server/applications/dialogflow.js
index 3c7a24d..156e413 100644
--- a/server/services/routing/server/applications/dialogflow.js
+++ b/server/services/routing/server/applications/dialogflow.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/dialogflowV2.js b/server/services/routing/server/applications/dialogflowV2.js
index c6cc670..b4aac59 100644
--- a/server/services/routing/server/applications/dialogflowV2.js
+++ b/server/services/routing/server/applications/dialogflowV2.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/gotoif.js b/server/services/routing/server/applications/gotoif.js
index 9c725eb..5fc4b24 100644
--- a/server/services/routing/server/applications/gotoif.js
+++ b/server/services/routing/server/applications/gotoif.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/gotop.js b/server/services/routing/server/applications/gotop.js
index 0e2e1f5..573462a 100644
--- a/server/services/routing/server/applications/gotop.js
+++ b/server/services/routing/server/applications/gotop.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/message.js b/server/services/routing/server/applications/message.js
index 5b3db80..b2d79de 100644
--- a/server/services/routing/server/applications/message.js
+++ b/server/services/routing/server/applications/message.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/noop.js b/server/services/routing/server/applications/noop.js
index 4aec577..a6276b3 100644
--- a/server/services/routing/server/applications/noop.js
+++ b/server/services/routing/server/applications/noop.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/queue.js b/server/services/routing/server/applications/queue.js
index 6a4a99a..f5952b4 100644
--- a/server/services/routing/server/applications/queue.js
+++ b/server/services/routing/server/applications/queue.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/strategy/agent.js b/server/services/routing/server/applications/strategy/agent.js
index a51f6a8..8f03771 100644
--- a/server/services/routing/server/applications/strategy/agent.js
+++ b/server/services/routing/server/applications/strategy/agent.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/strategy/beepall.js b/server/services/routing/server/applications/strategy/beepall.js
index b71be4d..3dc46d0 100644
--- a/server/services/routing/server/applications/strategy/beepall.js
+++ b/server/services/routing/server/applications/strategy/beepall.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/strategy/index.js b/server/services/routing/server/applications/strategy/index.js
index b447e96..d0a22a0 100644
--- a/server/services/routing/server/applications/strategy/index.js
+++ b/server/services/routing/server/applications/strategy/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
-var _0xc126=['./beepall','./agent','exports','./rrmemory'];(function(_0xdd2bfa,_0x5bd304){var _0x55397e=function(_0x196f7d){while(--_0x196f7d){_0xdd2bfa['push'](_0xdd2bfa['shift']());}};_0x55397e(++_0x5bd304);}(_0xc126,0x18a));var _0x6c12=function(_0x4780f7,_0x2ba30c){_0x4780f7=_0x4780f7-0x0;var _0x1b5c77=_0xc126[_0x4780f7];return _0x1b5c77;};'use strict';module[_0x6c12('0x0')]={'rrmemory':require(_0x6c12('0x1')),'beepall':require(_0x6c12('0x2')),'agent':require(_0x6c12('0x3'))};
\ No newline at end of file
+var _0xaab2=['./agent','exports','./rrmemory','./beepall'];(function(_0x45174,_0x189f55){var _0x5ba604=function(_0x9db0fb){while(--_0x9db0fb){_0x45174['push'](_0x45174['shift']());}};_0x5ba604(++_0x189f55);}(_0xaab2,0xe5));var _0x2aab=function(_0x1facfa,_0x1acf7d){_0x1facfa=_0x1facfa-0x0;var _0x9ec701=_0xaab2[_0x1facfa];return _0x9ec701;};'use strict';module[_0x2aab('0x0')]={'rrmemory':require(_0x2aab('0x1')),'beepall':require(_0x2aab('0x2')),'agent':require(_0x2aab('0x3'))};
\ No newline at end of file
diff --git a/server/services/routing/server/applications/strategy/rrmemory.js b/server/services/routing/server/applications/strategy/rrmemory.js
index b7f3b66..407ca8a 100644
--- a/server/services/routing/server/applications/strategy/rrmemory.js
+++ b/server/services/routing/server/applications/strategy/rrmemory.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/strategy/util.js b/server/services/routing/server/applications/strategy/util.js
index 8e9b868..04eeec7 100644
--- a/server/services/routing/server/applications/strategy/util.js
+++ b/server/services/routing/server/applications/strategy/util.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/system.js b/server/services/routing/server/applications/system.js
index d7bc41f..a0c3688 100644
--- a/server/services/routing/server/applications/system.js
+++ b/server/services/routing/server/applications/system.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/tag.js b/server/services/routing/server/applications/tag.js
index cfd0535..f0fc9bd 100644
--- a/server/services/routing/server/applications/tag.js
+++ b/server/services/routing/server/applications/tag.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/applications/tvox.js b/server/services/routing/server/applications/tvox.js
new file mode 100644
index 0000000..eedd37f
--- /dev/null
+++ b/server/services/routing/server/applications/tvox.js
@@ -0,0 +1,18 @@
+// *************************************************************************
+// *                                                                       *
+// * xCALLY Motion -  The Omnichannel Contact Center                       *
+// * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * Email: [email-masked]                                                *
+// * Website: https://www.xcally.com                                       *
+// *                                                                       *
+// *************************************************************************
+// *                                                                       *
+// * The SOFTWARE PRODUCT is protected by copyright laws and international *
+// * copyright treaties, as well as other intellectual property laws and   *
+// * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
+// *                                                                       *
+// *************************************************************************
\ No newline at end of file
diff --git a/server/services/routing/server/applications/utils.js b/server/services/routing/server/applications/utils.js
index cd33034..602d23a 100644
--- a/server/services/routing/server/applications/utils.js
+++ b/server/services/routing/server/applications/utils.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/index.js b/server/services/routing/server/index.js
index 68d6b10..0eeb96e 100644
--- a/server/services/routing/server/index.js
+++ b/server/services/routing/server/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/routing/server/interval.js b/server/services/routing/server/interval.js
index d76351b..0471e60 100644
--- a/server/services/routing/server/interval.js
+++ b/server/services/routing/server/interval.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/agents.controller.js b/server/services/xdr/agents.controller.js
index 78fa29f..2901b25 100644
--- a/server/services/xdr/agents.controller.js
+++ b/server/services/xdr/agents.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/calls.controller.js b/server/services/xdr/calls.controller.js
index 062902d..dd63338 100644
--- a/server/services/xdr/calls.controller.js
+++ b/server/services/xdr/calls.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/core.controller.js b/server/services/xdr/core.controller.js
index 329d68d..2dc74b4 100644
--- a/server/services/xdr/core.controller.js
+++ b/server/services/xdr/core.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/dials.controller.js b/server/services/xdr/dials.controller.js
index 7f576d8..ed30faf 100644
--- a/server/services/xdr/dials.controller.js
+++ b/server/services/xdr/dials.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/index.js b/server/services/xdr/index.js
index 280c615..a51a729 100644
--- a/server/services/xdr/index.js
+++ b/server/services/xdr/index.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/members.controller.js b/server/services/xdr/members.controller.js
index 89d82a6..12ae090 100644
--- a/server/services/xdr/members.controller.js
+++ b/server/services/xdr/members.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/queues.controller.js b/server/services/xdr/queues.controller.js
index 58b68e3..bfe4aca 100644
--- a/server/services/xdr/queues.controller.js
+++ b/server/services/xdr/queues.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/recordings.controller.js b/server/services/xdr/recordings.controller.js
index f26d7e3..1294c7d 100644
--- a/server/services/xdr/recordings.controller.js
+++ b/server/services/xdr/recordings.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/transfers.controller.js b/server/services/xdr/transfers.controller.js
index 75bd2e0..278b634 100644
--- a/server/services/xdr/transfers.controller.js
+++ b/server/services/xdr/transfers.controller.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/server/services/xdr/utils.js b/server/services/xdr/utils.js
index 63442bd..d0f87dc 100644
--- a/server/services/xdr/utils.js
+++ b/server/services/xdr/utils.js
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold. 		           *
 // *                                                                       *
 // *************************************************************************
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/00fe515d7113c2841e5d74c9ff891413.svg b/snippet/3.0.0/assets/images/00fe515d7113c2841e5d.svg
similarity index 100%
rename from snippet/3.0.0/00fe515d7113c2841e5d74c9ff891413.svg
rename to snippet/3.0.0/assets/images/00fe515d7113c2841e5d.svg
diff --git a/snippet/3.0.0/assets/images/3b24a6b94b2631f4d565.svg b/snippet/3.0.0/assets/images/3b24a6b94b2631f4d565.svg
new file mode 100644
index 0000000..004a356
--- /dev/null
+++ b/snippet/3.0.0/assets/images/3b24a6b94b2631f4d565.svg
@@ -0,0 +1,17 @@
+<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
+<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
+    <g fill="none" fill-rule="evenodd">
+        <g transform="translate(1 1)" stroke-width="2">
+            <circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
+            <path d="M36 18c0-9.94-8.06-18-18-18">
+                <animateTransform
+                    attributeName="transform"
+                    type="rotate"
+                    from="0 18 18"
+                    to="360 18 18"
+                    dur="1s"
+                    repeatCount="indefinite"/>
+            </path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/snippet/3.0.0/c9f502ad417b1b987198457bca8144c0.svg b/snippet/3.0.0/assets/images/c9f502ad417b1b987198.svg
similarity index 100%
rename from snippet/3.0.0/c9f502ad417b1b987198457bca8144c0.svg
rename to snippet/3.0.0/assets/images/c9f502ad417b1b987198.svg
diff --git a/snippet/3.0.0/index.html b/snippet/3.0.0/index.html
index 4cb6f85..fe7e6d1 100644
--- a/snippet/3.0.0/index.html
+++ b/snippet/3.0.0/index.html
@@ -2,9 +2,9 @@
       base.setAttribute('href', window.location.pathname)
       const title = document.getElementsByTagName('title')[0];
       title.parentNode.insertBefore(base, title);
                   settings.id
+                }}/logo?token={{ settings.token }}" class="avatar logo" alt="logo"/></div><span class="title" flex style="margin-left: 4px" ng-style="{'font-size': '{{settings.fontSize}}px', 'color': '{{settings.textColor}}'}" md-truncate>{{ actualTitle }}</span><md-progress-circular ng-if="loading" md-diameter="16px"></md-progress-circular><md-button ng-print class="md-icon-button header-button" aria-label="Print" ng-if="
                 layout.up &&
                 visitor.interaction.id &&
                 status != 'waiting' &&
@@ -19,11 +19,11 @@
                 status != 'online' &&
                 status != 'offline' &&
                 status != 'unmanaged'
-              " ng-click="$event.stopPropagation();" ng-csv="vm.download();" csv-header="['Sender', 'Message', 'Sent At']" filename="transcript.csv"><i class="mdi mdi-download mdi-light"></i></div><md-button class="md-icon-button header-button" aria-label="Close" ng-if="
+              " ng-click="$event.stopPropagation();" ng-csv="vm.download();" quote-strings="true" csv-header="['Sender', 'Message', 'Sent At']" filename="transcript.csv"><i class="mdi mdi-download mdi-light"></i></div><md-button class="md-icon-button header-button" aria-label="Close" ng-if="
                 layout.up &&
                 visitor.interaction.id &&
                 status != 'waiting' &&
                 status != 'online' &&
                 status != 'offline' &&
                 status != 'unmanaged'
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/app.js b/snippet/3.0.0/scripts/app.js
index 85e187d..210848b 100644
--- a/snippet/3.0.0/scripts/app.js
+++ b/snippet/3.0.0/scripts/app.js
@@ -1,2 +1,2 @@
 /*! For license information please see app.js.LICENSE.txt */
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/chat.js b/snippet/3.0.0/scripts/chat.js
index e4f1f60..f6d0081 100644
--- a/snippet/3.0.0/scripts/chat.js
+++ b/snippet/3.0.0/scripts/chat.js
@@ -1,3 +1,3 @@
 /*! For license information please see chat.js.LICENSE.txt */
 //# sourceMappingURL=chat.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/chat.js.map b/snippet/3.0.0/scripts/chat.js.map
index 0a57a79..b577c48 100644
--- a/snippet/3.0.0/scripts/chat.js.map
+++ b/snippet/3.0.0/scripts/chat.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/mobile.js b/snippet/3.0.0/scripts/mobile.js
index 9825230..9ad64b1 100644
--- a/snippet/3.0.0/scripts/mobile.js
+++ b/snippet/3.0.0/scripts/mobile.js
@@ -1 +1 @@
-(self.webpackChunkmotion_chat=self.webpackChunkmotion_chat||[]).push([["mobile"],{"./src/styles/mobile.scss":()=>{}},s=>{"use strict";s(s.s="./src/styles/mobile.scss")}]);
\ No newline at end of file
+"use strict";(self.webpackChunkmotion_chat=self.webpackChunkmotion_chat||[]).push([["mobile"],{"./src/styles/mobile.scss":()=>{}},s=>{s(s.s="./src/styles/mobile.scss")}]);
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/runtime.js b/snippet/3.0.0/scripts/runtime.js
index 4284eee..2867731 100644
--- a/snippet/3.0.0/scripts/runtime.js
+++ b/snippet/3.0.0/scripts/runtime.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=runtime.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/runtime.js.map b/snippet/3.0.0/scripts/runtime.js.map
index 67809d7..5474eb2 100644
--- a/snippet/3.0.0/scripts/runtime.js.map
+++ b/snippet/3.0.0/scripts/runtime.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-58d021f3.js b/snippet/3.0.0/scripts/vendor-angular-58d021f3.js
index b6dd792..e32723b 100644
--- a/snippet/3.0.0/scripts/vendor-angular-58d021f3.js
+++ b/snippet/3.0.0/scripts/vendor-angular-58d021f3.js
@@ -1,2 +1,2 @@
-(self.webpackChunkmotion_chat=self.webpackChunkmotion_chat||[]).push([["vendor-angular-58d021f3"],{"./node_modules/@uirouter/angularjs/lib-esm/angular.js":(e,a,n)=>{"use strict";n.d(a,{ng:()=>s});var u=n("./node_modules/angular/index-exposed.js"),o=angular,s=u&&u.module?u:o}}]);
+"use strict";(self.webpackChunkmotion_chat=self.webpackChunkmotion_chat||[]).push([["vendor-angular-58d021f3"],{"./node_modules/@uirouter/angularjs/lib-esm/angular.js":(e,a,n)=>{n.d(a,{ng:()=>s});var u=n("./node_modules/angular/index-exposed.js"),o=angular,s=u&&u.module?u:o}}]);
 //# sourceMappingURL=vendor-angular-58d021f3.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-58d021f3.js.map b/snippet/3.0.0/scripts/vendor-angular-58d021f3.js.map
index 2f15a76..2ee3511 100644
--- a/snippet/3.0.0/scripts/vendor-angular-58d021f3.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-58d021f3.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://motion-chat/./node_modules/@uirouter/angularjs/lib-esm/angular.js"],"names":["ng_from_global","angular","ng"],"mappings":"uPAEmBA,EAAiBC,QACVC,EAAK,GAAkB,SAAwB,EAAiBF","file":"scripts/vendor-angular-58d021f3.js","sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"scripts/vendor-angular-58d021f3.js","mappings":"uPAEmBA,EAAiBC,QACVC,EAAK,GAAkB,SAAwB,EAAiBF","sources":["webpack://motion-chat/./node_modules/@uirouter/angularjs/lib-esm/angular.js"],"names":["ng_from_global","angular","ng"],"sourceRoot":""}
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-76f2ed34.js.map b/snippet/3.0.0/scripts/vendor-angular-76f2ed34.js.map
index 1c27f0a..afad197 100644
--- a/snippet/3.0.0/scripts/vendor-angular-76f2ed34.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-76f2ed34.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-animate.js.map b/snippet/3.0.0/scripts/vendor-angular-animate.js.map
index d70b48a..97addb2 100644
--- a/snippet/3.0.0/scripts/vendor-angular-animate.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-animate.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-local-storage.js.map b/snippet/3.0.0/scripts/vendor-angular-local-storage.js.map
index ad249ed..d046ed9 100644
--- a/snippet/3.0.0/scripts/vendor-angular-local-storage.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-local-storage.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-material.js b/snippet/3.0.0/scripts/vendor-angular-material.js
index 6150310..7a68641 100644
--- a/snippet/3.0.0/scripts/vendor-angular-material.js
+++ b/snippet/3.0.0/scripts/vendor-angular-material.js
@@ -1,3 +1,3 @@
 /*! For license information please see vendor-angular-material.js.LICENSE.txt */
 //# sourceMappingURL=vendor-angular-material.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-material.js.LICENSE.txt b/snippet/3.0.0/scripts/vendor-angular-material.js.LICENSE.txt
index 8744be5..cf9ed30 100644
--- a/snippet/3.0.0/scripts/vendor-angular-material.js.LICENSE.txt
+++ b/snippet/3.0.0/scripts/vendor-angular-material.js.LICENSE.txt
@@ -2,5 +2,5 @@
  * AngularJS Material Design
  * https://github.com/angular/material
  * @license MIT
- * v1.2.2
+ * v1.2.3
  */
diff --git a/snippet/3.0.0/scripts/vendor-angular-material.js.map b/snippet/3.0.0/scripts/vendor-angular-material.js.map
index 81d9cd5..44110ec 100644
--- a/snippet/3.0.0/scripts/vendor-angular-material.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-material.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-messages.js.map b/snippet/3.0.0/scripts/vendor-angular-messages.js.map
index 398770a..52aaa73 100644
--- a/snippet/3.0.0/scripts/vendor-angular-messages.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-messages.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-resource.js.map b/snippet/3.0.0/scripts/vendor-angular-resource.js.map
index d1b0370..69602e7 100644
--- a/snippet/3.0.0/scripts/vendor-angular-resource.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-resource.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-angular-sanitize.js.map b/snippet/3.0.0/scripts/vendor-angular-sanitize.js.map
index 7bc77eb..3162426 100644
--- a/snippet/3.0.0/scripts/vendor-angular-sanitize.js.map
+++ b/snippet/3.0.0/scripts/vendor-angular-sanitize.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-emojione.js.map b/snippet/3.0.0/scripts/vendor-emojione.js.map
index 3c962a2..70e3cdd 100644
--- a/snippet/3.0.0/scripts/vendor-emojione.js.map
+++ b/snippet/3.0.0/scripts/vendor-emojione.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-emojionearea.js.map b/snippet/3.0.0/scripts/vendor-emojionearea.js.map
index e1e2cf1..749e936 100644
--- a/snippet/3.0.0/scripts/vendor-emojionearea.js.map
+++ b/snippet/3.0.0/scripts/vendor-emojionearea.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-flow.js.map b/snippet/3.0.0/scripts/vendor-flow.js.map
index 162e60c..f7d9251 100644
--- a/snippet/3.0.0/scripts/vendor-flow.js.map
+++ b/snippet/3.0.0/scripts/vendor-flow.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-index.js.map b/snippet/3.0.0/scripts/vendor-index.js.map
index 194f7d6..023ab6f 100644
--- a/snippet/3.0.0/scripts/vendor-index.js.map
+++ b/snippet/3.0.0/scripts/vendor-index.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-jquery.js.map b/snippet/3.0.0/scripts/vendor-jquery.js.map
index 7b7f037..dac609c 100644
--- a/snippet/3.0.0/scripts/vendor-jquery.js.map
+++ b/snippet/3.0.0/scripts/vendor-jquery.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-jquery.textcomplete.js.map b/snippet/3.0.0/scripts/vendor-jquery.textcomplete.js.map
index 1387042..fe5a867 100644
--- a/snippet/3.0.0/scripts/vendor-jquery.textcomplete.js.map
+++ b/snippet/3.0.0/scripts/vendor-jquery.textcomplete.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-moment.js.map b/snippet/3.0.0/scripts/vendor-moment.js.map
index aa32a7d..3f256de 100644
--- a/snippet/3.0.0/scripts/vendor-moment.js.map
+++ b/snippet/3.0.0/scripts/vendor-moment.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-ng-embed.js.map b/snippet/3.0.0/scripts/vendor-ng-embed.js.map
index 7e831b6..23e1d2a 100644
--- a/snippet/3.0.0/scripts/vendor-ng-embed.js.map
+++ b/snippet/3.0.0/scripts/vendor-ng-embed.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-stateDirectives.js b/snippet/3.0.0/scripts/vendor-stateDirectives.js
index 3f96b99..a0b896a 100644
--- a/snippet/3.0.0/scripts/vendor-stateDirectives.js
+++ b/snippet/3.0.0/scripts/vendor-stateDirectives.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=vendor-stateDirectives.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-stateDirectives.js.map b/snippet/3.0.0/scripts/vendor-stateDirectives.js.map
index b6ba8a5..a674a86 100644
--- a/snippet/3.0.0/scripts/vendor-stateDirectives.js.map
+++ b/snippet/3.0.0/scripts/vendor-stateDirectives.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-stateService.js b/snippet/3.0.0/scripts/vendor-stateService.js
index 1ab53d1..36b4897 100644
--- a/snippet/3.0.0/scripts/vendor-stateService.js
+++ b/snippet/3.0.0/scripts/vendor-stateService.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=vendor-stateService.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-stateService.js.map b/snippet/3.0.0/scripts/vendor-stateService.js.map
index 15915cb..3abe455 100644
--- a/snippet/3.0.0/scripts/vendor-stateService.js.map
+++ b/snippet/3.0.0/scripts/vendor-stateService.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-transition.js b/snippet/3.0.0/scripts/vendor-transition.js
index 45fa30f..2f0a104 100644
--- a/snippet/3.0.0/scripts/vendor-transition.js
+++ b/snippet/3.0.0/scripts/vendor-transition.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=vendor-transition.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-transition.js.map b/snippet/3.0.0/scripts/vendor-transition.js.map
index df16fc0..3702f08 100644
--- a/snippet/3.0.0/scripts/vendor-transition.js.map
+++ b/snippet/3.0.0/scripts/vendor-transition.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-urlMatcher.js b/snippet/3.0.0/scripts/vendor-urlMatcher.js
index 8e468f6..f9c9a30 100644
--- a/snippet/3.0.0/scripts/vendor-urlMatcher.js
+++ b/snippet/3.0.0/scripts/vendor-urlMatcher.js
@@ -1,2 +1,2 @@
 //# sourceMappingURL=vendor-urlMatcher.js.map
\ No newline at end of file
diff --git a/snippet/3.0.0/scripts/vendor-urlMatcher.js.map b/snippet/3.0.0/scripts/vendor-urlMatcher.js.map
index 1e709bf..9920ce4 100644
--- a/snippet/3.0.0/scripts/vendor-urlMatcher.js.map
+++ b/snippet/3.0.0/scripts/vendor-urlMatcher.js.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/app.css b/snippet/3.0.0/styles/app.css
index 3956257..30baea4 100644
--- a/snippet/3.0.0/styles/app.css
+++ b/snippet/3.0.0/styles/app.css
@@ -18,11 +18,11 @@
  * *************************************************************************
  */
 @import url(https://fonts.googleapis.com/icon?family=Material+Icons);
  * AngularJS Material Design
  * https://github.com/angular/material
  * @license MIT
- * v1.2.2
+ * v1.2.3
 
 /*# sourceMappingURL=app.css.map*/
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/app.css.map b/snippet/3.0.0/styles/app.css.map
index a00dd22..ed81ab6 100644
--- a/snippet/3.0.0/styles/app.css.map
+++ b/snippet/3.0.0/styles/app.css.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/fonts/emoticons.svg b/snippet/3.0.0/styles/fonts/emoticons.svg
deleted file mode 100644
index 26e9725..0000000
--- a/snippet/3.0.0/styles/fonts/emoticons.svg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "00fe515d7113c2841e5d74c9ff891413.svg";
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/fonts/loader.svg b/snippet/3.0.0/styles/fonts/loader.svg
deleted file mode 100644
index d72cb0d..0000000
--- a/snippet/3.0.0/styles/fonts/loader.svg
+++ /dev/null
@@ -1 +0,0 @@
-export default "data:image/svg+xml;base64,PCEtLSBCeSBTYW0gSGVyYmVydCAoQHNoZXJiKSwgZm9yIGV2ZXJ5b25lLiBNb3JlIEAgaHR0cDovL2dvby5nbC83QUp6YkwgLS0+Cjxzdmcgd2lkdGg9IjM4IiBoZWlnaHQ9IjM4IiB2aWV3Qm94PSIwIDAgMzggMzgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSAxKSIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgPGNpcmNsZSBzdHJva2Utb3BhY2l0eT0iLjUiIGN4PSIxOCIgY3k9IjE4IiByPSIxOCIvPgogICAgICAgICAgICA8cGF0aCBkPSJNMzYgMThjMC05Ljk0LTguMDYtMTgtMTgtMTgiPgogICAgICAgICAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iCiAgICAgICAgICAgICAgICAgICAgdHlwZT0icm90YXRlIgogICAgICAgICAgICAgICAgICAgIGZyb209IjAgMTggMTgiCiAgICAgICAgICAgICAgICAgICAgdG89IjM2MCAxOCAxOCIKICAgICAgICAgICAgICAgICAgICBkdXI9IjFzIgogICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIi8+CiAgICAgICAgICAgIDwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg=="
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/fonts/materialdesignicons-webfont.svg b/snippet/3.0.0/styles/fonts/materialdesignicons-webfont.svg
deleted file mode 100644
index 22ce20b..0000000
--- a/snippet/3.0.0/styles/fonts/materialdesignicons-webfont.svg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "c9f502ad417b1b987198457bca8144c0.svg";
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/mobile.css b/snippet/3.0.0/styles/mobile.css
index 54a5ac1..6eb2abb 100644
--- a/snippet/3.0.0/styles/mobile.css
+++ b/snippet/3.0.0/styles/mobile.css
@@ -1,3 +1,3 @@
 
 /*# sourceMappingURL=mobile.css.map*/
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/mobile.css.map b/snippet/3.0.0/styles/mobile.css.map
index e9f6869..ca4909d 100644
--- a/snippet/3.0.0/styles/mobile.css.map
+++ b/snippet/3.0.0/styles/mobile.css.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/styles/vendor.css b/snippet/3.0.0/styles/vendor.css
index 4e3994e..4ae07fc 100644
--- a/snippet/3.0.0/styles/vendor.css
+++ b/snippet/3.0.0/styles/vendor.css
@@ -1,10 +1,10 @@
 @font-face {
     font-family : 'emoticons';
-    src         : url(fonts/emoticons.eot);
-    src         : url(fonts/emoticons.eot?#iefix5zh0vu) format('embedded-opentype'),
-    url(fonts/emoticons.woff) format('woff'),
-    url(fonts/emoticons.ttf) format('truetype'),
-    url(fonts/emoticons.svg#icomoon) format('svg');
+    src         : url(../assets/fonts/f2fc8fdab7e77dd45cca.eot?5zh0vu);
+    src         : url(../assets/fonts/f2fc8fdab7e77dd45cca.eot?#iefix5zh0vu) format('embedded-opentype'),
+    url(../assets/fonts/8a4db4218c8e3ba96535.woff?5zh0vu) format('woff'),
+    url(../assets/fonts/dc116c4c8ce73229b683.ttf?5zh0vu) format('truetype'),
+    url(../assets/images/00fe515d7113c2841e5d.svg?5zh0vu#icomoon) format('svg');
     font-weight : normal;
     font-style  : normal;
     }
@@ -172,7 +172,7 @@ code.has-numbering {
 .ne-embed iframe{
     border        : 0;
     background-color    : #3498DB;
-    background-image    : url(fonts/loader.svg);
+    background-image    : url(../assets/images/3b24a6b94b2631f4d565.svg);
     background-repeat   : no-repeat;
     background-position : center;
     width               : 100%;
@@ -273,7 +273,7 @@ code.has-numbering {
 
 .ne-video-player {
     background-color    : #3498DB;
-    background-image    : url(fonts/loader.svg);
+    background-image    : url(../assets/images/3b24a6b94b2631f4d565.svg);
     background-repeat   : no-repeat;
     background-position : center;
     }
@@ -316,7 +316,7 @@ code.has-numbering {
     margin              : 5px;
     margin-bottom       : 0;
     background-color    : #3498DB;
-    background-image    : url(fonts/loader.svg);
+    background-image    : url(../assets/images/3b24a6b94b2631f4d565.svg);
     background-repeat   : no-repeat;
     background-position : center;
     height              : 100%;
@@ -365,20 +365,20 @@ code.has-numbering {
 
 @media all and (-webkit-min-device-pixel-ratio : 1), all and (min--moz-device-pixel-ratio : 1), all and (-o-min-device-pixel-ratio : 1), all and (min-device-pixel-ratio : 1), all and (min-resolution : 96dpi) {
     .emoticon {
-        background : transparent url(./b45cb1fa106a1150f12e011cff91b7d6.png) 0 0 no-repeat;
+        background : transparent url(../assets/images/b45cb1fa106a1150f12e.png) 0 0 no-repeat;
         }
     }
 
 @media all and (-webkit-min-device-pixel-ratio : 1.5), all and (-o-min-device-pixel-ratio : 3/2), all and (min-device-pixel-ratio : 1.5), all and (min-resolution : 144dpi) {
     .emoticon {
-        background      : transparent url(./369ccd33e5368870b112b149b29f764f.png) 0 0 no-repeat;
+        background      : transparent url(../assets/images/369ccd33e5368870b112.png) 0 0 no-repeat;
         background-size : 27776px 22px;
         }
     }
 
 @-moz-document url-prefix() {
     .emoticon {
-        background : transparent url(./b45cb1fa106a1150f12e011cff91b7d6.png) 0 0 no-repeat;
+        background : transparent url(../assets/images/b45cb1fa106a1150f12e.png) 0 0 no-repeat;
         }
     }
 
@@ -4452,10 +4452,10 @@ img.emojione {
     top: 15px; }
 
 .emojionearea .emojionearea-button > div, .emojionearea .emojionearea-picker .emojionearea-wrapper:after {
-  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABuCAYAAADMB4ipAAAHfElEQVRo3u1XS1NT2Rb+9uOcQF4YlAJzLymFUHaLrdxKULvEUNpdTnRqD532f+AHMLMc94gqR1Zbt8rBnUh3YXipPGKwRDoWgXvrYiFUlEdIkPPYZ/dAkwox5yQCVt/bzRrBPnt9e+211/etFeDQDu3ArL+/X37OeqmRWoH7+vpItfWawStF1tfXR+zW9xW5ne0p8loOcAKuCdwpRft60C8a+X5zTvebCqcAvmidf1GGHtqhHdpf1qqKzsrKipyensbi4iKWl5cBAMFgEG1tbYhGo2hpadlbmxseHpaDg4MAgI6ODng8HgBAPp/H/Pw8AODatWvo7e2tvUHrui7v3r2L+fl5XL58GVeuXIHH49m1N5/Py0ePHmF0dBQdHR24desWVFXdtYdXAn/48CHm5+dx8+ZNRKPRigEUDpuenpb3799H4YaOnWh5eVmOj48jFoshGo0STdPkwMCAXF5elqV7BgYGpKZpMhqNklgshrGxMbx580Y6gicSCTDGEIvFAADpdBqpVArJZLK4J5lMIpVKIZ1OAwBisRgYY0gkEs6Rp1IphMNh+Hw+AgCGYQAANE0r7in8Xfjm8/lIOBzGq1evnMHX19fR1NRU/D8UCoFzjnA4XFwLh8PgnCMUChXXmpqakM1mUfVBS62xsZHk83lZWi1nz579ZA0AhBDO4A0NDchkMsWSJIRAURRiVy26rktVVUkmk0EgEHAGP3XqFKamppDP56Vpmrhz5w5u374t/X4/OP+w3TRNZLNZ6LoO0zSRz+dlf38/Ll686Jzz8+fPQwiBeDwOt9tNrl+/jkwmU6yaQpVkMhncuHEDbrebxONxCCEQiUScIw8Gg+TBgwdyZGQEyWRSdnV1kVQqJYeGhrC6ugrGGEKhEHp7e3Hy5EmSTCblvXv30NPTg2AwSA6M/vF4HCMjI7b0/yzh8vv9AIBsNrt34aokuQsLC7skt729varkHtqftUFf++FHsrq0QN3eBvp68Tfvf9Mv12oFCYU7G//e9nVuO7dpNbe2W4M//yQr0p8yRvyBo1Zr++lwLcCt7afD/sBRizJGavrB1dDYYh47Htrq+Kb7jBNwxzfdZ44dD201NLaYVUkU7ozQpuAJBkARwnRZpunN5zaa5hJjiXLH05GeiMd7JEM5zzHGNQBGZvk/Iv0yYVWMvK0zKk1Dl6ahW5RQobjqdjy+wEZn9PKF0n2d0csXPL7AhuKq26GECtPQLdPQZVtn1LlB69p7yRVVSEiDEGJwRd12e4+8PR3piRQidnuPvOWKuk0IMSSkwRVV6Np7WVVbSqvGsgSnlKkAFNPQXdrOtuKqcxtcUTUAhmUJnVJmlleJo3CVHmAaOlPUOmYJkxFKibQsSRkXhr4juKIKO2BHVSwcoLrqCVdUYho6K3YYRRWmoUtdey/tgKtK7rUffiQAsLq08MnbNLe2WwBgB/zHzueFyD8nwlIfbvdx8eU0WV1aKD1cVAMs9+F2j9gUPEEKemEJIe3AnXy4XfkBoNKSZHNthWfX31EA69VKttyHVyIOY1wRwmS6tqNsrr31vXo5k/bUu4gT2cp9lhbm0rzCJpeUUrE0vS63+c7/6uXMbDUWl/ssLczNFrVFddUT09AZpUy1LKvO0DVfPrfR9HxqfNbuEe185l9MFX3o6tIC5YpKFLWOfdQQ93Zu49j0+FDCDtjOp1yaOQCYhs4Y40wI05XfWj8yPT40Ua2ey33mEmMTtp2IUEq0nW3FKeJPGPjRp1Iz2QUuLUu66txG9NLVSK3gBZ+C1lcE54oqKOOCK6rm8QU2unu+u1ANuNynvFsBAG1ubbdMQ5eGviMAFDuP0w3sfMpvQEtb24fOQncU1bXl8R7JnOu+ZNv97XxKJwY6+PNPsrm13drObVqUMlMIU5OWpVHOc96Go5lTnV2fzC/VfAozD7HTCa6olBBa1Imlhbmq2lLuQ5xaW6nCPfnln0Yt7bDUhzhps8cfKH5//uTXmvS81OeLdqI/ZoROzSZrHqG/OvOPzxuhK5VgJTvV2bW3EdqJRABwrvvS/kfoSkoZvXT1YEbociHr7vnuYEfogpBFL109HKH/h0fomnXg3Lff79r7/MmvVbWG7gX4QObzc99+Tz7mHKah05KcW6ahQ9feS6cbMCdgt7eBWJagjCuUAC5tZzuouuo0Spm0hElc9R4cbf4bVl8v1p6WUmCuqEwIs34ruxaeeTy4uJVd67As08UVlVmWoG5vA7FLG3WMmHEupVTyW+vh2cn4DADMTsaTuc21LiGEhzHOnQ6gNtMrJSBMCKHkNt999WLi0S7hejEZH81n174WpukiIMw0dKq66p3Bw50RwhUVXFGJKUy28Xal48VkfKrSlWenhsc23q2cEB9SR7iiItwZIbbgHn8AlDFCCMW7laXjqZnHjkNpaubJzNuVpWZCKChjxOMPVH/QlaW0f/G3ZLqWWl6ce/bvlddp7yFD/w8Z+njoX1+GoZMjgzMAMDkyeLAMnRh+uKveJ0YGD4ahEyODFRk6OfrL/hj67GnckaHPng7vjaGzyYmaGDr77KktQ38H8tqx8Wja+WIAAAAASUVORK5CYII=') !important; }
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABuCAYAAADMB4ipAAAHfElEQVRo3u1XS1NT2Rb+9uOcQF4YlAJzLymFUHaLrdxKULvEUNpdTnRqD532f+AHMLMc94gqR1Zbt8rBnUh3YXipPGKwRDoWgXvrYiFUlEdIkPPYZ/dAkwox5yQCVt/bzRrBPnt9e+211/etFeDQDu3ArL+/X37OeqmRWoH7+vpItfWawStF1tfXR+zW9xW5ne0p8loOcAKuCdwpRft60C8a+X5zTvebCqcAvmidf1GGHtqhHdpf1qqKzsrKipyensbi4iKWl5cBAMFgEG1tbYhGo2hpadlbmxseHpaDg4MAgI6ODng8HgBAPp/H/Pw8AODatWvo7e2tvUHrui7v3r2L+fl5XL58GVeuXIHH49m1N5/Py0ePHmF0dBQdHR24desWVFXdtYdXAn/48CHm5+dx8+ZNRKPRigEUDpuenpb3799H4YaOnWh5eVmOj48jFoshGo0STdPkwMCAXF5elqV7BgYGpKZpMhqNklgshrGxMbx580Y6gicSCTDGEIvFAADpdBqpVArJZLK4J5lMIpVKIZ1OAwBisRgYY0gkEs6Rp1IphMNh+Hw+AgCGYQAANE0r7in8Xfjm8/lIOBzGq1evnMHX19fR1NRU/D8UCoFzjnA4XFwLh8PgnCMUChXXmpqakM1mUfVBS62xsZHk83lZWi1nz579ZA0AhBDO4A0NDchkMsWSJIRAURRiVy26rktVVUkmk0EgEHAGP3XqFKamppDP56Vpmrhz5w5u374t/X4/OP+w3TRNZLNZ6LoO0zSRz+dlf38/Ll686Jzz8+fPQwiBeDwOt9tNrl+/jkwmU6yaQpVkMhncuHEDbrebxONxCCEQiUScIw8Gg+TBgwdyZGQEyWRSdnV1kVQqJYeGhrC6ugrGGEKhEHp7e3Hy5EmSTCblvXv30NPTg2AwSA6M/vF4HCMjI7b0/yzh8vv9AIBsNrt34aokuQsLC7skt729varkHtqftUFf++FHsrq0QN3eBvp68Tfvf9Mv12oFCYU7G//e9nVuO7dpNbe2W4M//yQr0p8yRvyBo1Zr++lwLcCt7afD/sBRizJGavrB1dDYYh47Htrq+Kb7jBNwxzfdZ44dD201NLaYVUkU7ozQpuAJBkARwnRZpunN5zaa5hJjiXLH05GeiMd7JEM5zzHGNQBGZvk/Iv0yYVWMvK0zKk1Dl6ahW5RQobjqdjy+wEZn9PKF0n2d0csXPL7AhuKq26GECtPQLdPQZVtn1LlB69p7yRVVSEiDEGJwRd12e4+8PR3piRQidnuPvOWKuk0IMSSkwRVV6Np7WVVbSqvGsgSnlKkAFNPQXdrOtuKqcxtcUTUAhmUJnVJmlleJo3CVHmAaOlPUOmYJkxFKibQsSRkXhr4juKIKO2BHVSwcoLrqCVdUYho6K3YYRRWmoUtdey/tgKtK7rUffiQAsLq08MnbNLe2WwBgB/zHzueFyD8nwlIfbvdx8eU0WV1aKD1cVAMs9+F2j9gUPEEKemEJIe3AnXy4XfkBoNKSZHNthWfX31EA69VKttyHVyIOY1wRwmS6tqNsrr31vXo5k/bUu4gT2cp9lhbm0rzCJpeUUrE0vS63+c7/6uXMbDUWl/ssLczNFrVFddUT09AZpUy1LKvO0DVfPrfR9HxqfNbuEe185l9MFX3o6tIC5YpKFLWOfdQQ93Zu49j0+FDCDtjOp1yaOQCYhs4Y40wI05XfWj8yPT40Ua2ey33mEmMTtp2IUEq0nW3FKeJPGPjRp1Iz2QUuLUu66txG9NLVSK3gBZ+C1lcE54oqKOOCK6rm8QU2unu+u1ANuNynvFsBAG1ubbdMQ5eGviMAFDuP0w3sfMpvQEtb24fOQncU1bXl8R7JnOu+ZNv97XxKJwY6+PNPsrm13drObVqUMlMIU5OWpVHOc96Go5lTnV2fzC/VfAozD7HTCa6olBBa1Imlhbmq2lLuQ5xaW6nCPfnln0Yt7bDUhzhps8cfKH5//uTXmvS81OeLdqI/ZoROzSZrHqG/OvOPzxuhK5VgJTvV2bW3EdqJRABwrvvS/kfoSkoZvXT1YEbociHr7vnuYEfogpBFL109HKH/h0fomnXg3Lff79r7/MmvVbWG7gX4QObzc99+Tz7mHKah05KcW6ahQ9feS6cbMCdgt7eBWJagjCuUAC5tZzuouuo0Spm0hElc9R4cbf4bVl8v1p6WUmCuqEwIs34ruxaeeTy4uJVd67As08UVlVmWoG5vA7FLG3WMmHEupVTyW+vh2cn4DADMTsaTuc21LiGEhzHOnQ6gNtMrJSBMCKHkNt999WLi0S7hejEZH81n174WpukiIMw0dKq66p3Bw50RwhUVXFGJKUy28Xal48VkfKrSlWenhsc23q2cEB9SR7iiItwZIbbgHn8AlDFCCMW7laXjqZnHjkNpaubJzNuVpWZCKChjxOMPVH/QlaW0f/G3ZLqWWl6ce/bvlddp7yFD/w8Z+njoX1+GoZMjgzMAMDkyeLAMnRh+uKveJ0YGD4ahEyODFRk6OfrL/hj67GnckaHPng7vjaGzyYmaGDr77KktQ38H8tqx8Wja+WIAAAAASUVORK5CYII=) !important; }
 
 .emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder {
-  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAC/v79T5hyIAAAAAXRSTlMAQObYZgAAABNJREFUCNdjYGNgQEb/P4AQqiAASiUEG6Vit44AAAAASUVORK5CYII=') !important; }
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAC/v79T5hyIAAAAAXRSTlMAQObYZgAAABNJREFUCNdjYGNgQEb/P4AQqiAASiUEG6Vit44AAAAASUVORK5CYII=) !important; }
 
 /*# sourceMappingURL=emojionearea.css.map */
 
diff --git a/snippet/3.0.0/styles/vendor.css.map b/snippet/3.0.0/styles/vendor.css.map
index 9952156..217ad3a 100644
--- a/snippet/3.0.0/styles/vendor.css.map
+++ b/snippet/3.0.0/styles/vendor.css.map
@@ -1 +1 @@
\ No newline at end of file
\ No newline at end of file
diff --git a/snippet/3.0.0/templates/offline/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/30dfa91ae2de8cc8368b.html
similarity index 97%
rename from snippet/3.0.0/templates/offline/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/30dfa91ae2de8cc8368b.html
index 7277cb5..a1e11ef 100644
--- a/snippet/3.0.0/templates/offline/index.tpl.html/index.tpl.html
+++ b/snippet/3.0.0/templates/30dfa91ae2de8cc8368b.html
@@ -15,7 +15,9 @@
         layout="column"
         class="form-field"
       >
-        <span>{{field.props.title + (field.config.required ? '*' : '')}}</span>
+        <span ng-show="field.type !== 'label'">
+          {{field.props.title + (field.config.required ? '*' : '')}}
+        </span>
 
         <span
           ng-class="field.props.error? 'field-description error': 'field-description'"
@@ -56,7 +58,7 @@
               layout="row"
               layout-align="center center"
             >
-              <span>{{field.value}}</span>
+              <span ng-bind-html="field.value"></span>
             </md-content>
           </div>
           <!-- END label -->
diff --git a/snippet/3.0.0/templates/unmanaged/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/4b1f437e6978b48d5480.html
similarity index 100%
rename from snippet/3.0.0/templates/unmanaged/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/4b1f437e6978b48d5480.html
diff --git a/snippet/3.0.0/templates/chat/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/5e32f2e1a6d11e8f150e.html
similarity index 100%
rename from snippet/3.0.0/templates/chat/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/5e32f2e1a6d11e8f150e.html
diff --git a/snippet/3.0.0/templates/waiting/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/6043a16afdb829ba5934.html
similarity index 100%
rename from snippet/3.0.0/templates/waiting/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/6043a16afdb829ba5934.html
diff --git a/snippet/3.0.0/templates/closing/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/b5ecdf1981d6cd190497.html
similarity index 100%
rename from snippet/3.0.0/templates/closing/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/b5ecdf1981d6cd190497.html
diff --git a/snippet/3.0.0/templates/online/index.tpl.html/index.tpl.html b/snippet/3.0.0/templates/be5191f7b4d693a86fa3.html
similarity index 97%
rename from snippet/3.0.0/templates/online/index.tpl.html/index.tpl.html
rename to snippet/3.0.0/templates/be5191f7b4d693a86fa3.html
index 8e20e74..9c63fb0 100644
--- a/snippet/3.0.0/templates/online/index.tpl.html/index.tpl.html
+++ b/snippet/3.0.0/templates/be5191f7b4d693a86fa3.html
@@ -13,7 +13,9 @@
         layout="column"
         class="form-field"
       >
-        <span>{{field.props.title + (field.config.required ? '*' : '')}}</span>
+        <span ng-show="field.type !== 'label'">
+          {{field.props.title + (field.config.required ? '*' : '')}}
+        </span>
 
         <span
           ng-class="field.props.error? 'field-description error': 'field-description'"
@@ -54,7 +56,7 @@
               layout="row"
               layout-align="center center"
             >
-              <span>{{field.value}}</span>
+              <span ng-bind-html="field.value"></span>
             </md-content>
           </div>
           <!-- END label -->