diff --git a/CHANGELOG.md b/CHANGELOG.md
index ada49c9..c650a74 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.6.5 - 2020-05-18
+### Added
+- Add redirect ordering (Closes #274)
+
## 3.6.4 - 2020-04-15
### Fixed
- Fix JS error when `%` appeared in SEO snippet text
diff --git a/composer.json b/composer.json
index 11c0457..6813a42 100644
--- a/composer.json
+++ b/composer.json
@@ -2,7 +2,7 @@
"name": "ether/seo",
"license": "MIT",
"description": "SEO utilities including a unique field type, sitemap, & redirect manager",
- "version": "3.6.4",
+ "version": "3.6.5",
"type": "craft-plugin",
"minimum-stability": "dev",
"require": {
diff --git a/resources/js/settings/Redirects.js b/resources/js/settings/Redirects.js
index 4ac24ab..50dd54d 100644
--- a/resources/js/settings/Redirects.js
+++ b/resources/js/settings/Redirects.js
@@ -53,6 +53,13 @@ export default class Redirects {
initTables () {
Object.keys(this.tables).forEach(key => {
+ if (this.tables[key].__sorter)
+ this.tables[key].__sorter.destroy();
+
+ this.tables[key].__sorter = new Craft.DataTableSorter(this.tables[key].parentNode, {
+ onSortChange: () => this.onSort(this.tables[key]),
+ });
+
[].slice.call(this.tables[key].getElementsByTagName("tr")).forEach(row => {
const links = row.getElementsByTagName("a");
@@ -60,7 +67,7 @@ export default class Redirects {
this.onEditClick(key, e, row);
});
- links[1].addEventListener("click", e => {
+ links[2].addEventListener("click", e => {
this.onDeleteClick(key, e, row);
});
});
@@ -80,18 +87,22 @@ export default class Redirects {
, type = form.elements[this.namespaceField("type")]
, siteId = form.elements[this.namespaceField("siteId")];
+ const order = this.tables[siteId.value].children.length;
+
// Validate
if (!Redirects._validate(uri, to, spinner))
return;
this.post("POST", {
+ action: 'seo/redirects/save',
+ order,
uri: uri.value,
to: to.value,
type: type.value,
siteId: siteId.value,
}, ({ id }) => {
this.tables[siteId.value].appendChild(this.rowStatic(
- id, uri.value, to.value, type.value, siteId.value
+ id, order, uri.value, to.value, type.value, siteId.value
));
Craft.cp.displayNotice(
@@ -102,6 +113,7 @@ export default class Redirects {
uri.value = '';
to.value = '';
uri.focus();
+ this.initTables();
}, error => {
Craft.cp.displayError("SEO: " + error);
spinner.classList.add("hidden");
@@ -141,9 +153,9 @@ export default class Redirects {
type: type.value,
siteId: siteId.value,
}, ({ redirects: newRedirects }) => {
- newRedirects.forEach(({ id, uri, to, type, siteId }) => {
+ newRedirects.forEach(({ id, order, uri, to, type, siteId }) => {
this.tables[siteId || 'null'].appendChild(this.rowStatic(
- id, uri, to, type, siteId
+ id, order, uri, to, type, siteId
));
});
@@ -151,6 +163,7 @@ export default class Redirects {
spinner.classList.add("hidden");
redirects.value = '';
+ this.initTables();
}, error => {
Craft.cp.displayError('SEO: ' + error);
spinner.classList.add("hidden");
@@ -164,17 +177,20 @@ export default class Redirects {
const form = e.target
, spinner = form.getElementsByClassName("spinner")[0];
- const id = form.elements[this.namespaceField("id")]
- , uri = form.elements[this.namespaceField("uri")]
- , to = form.elements[this.namespaceField("to")]
- , type = form.elements[this.namespaceField("type")];
+ const id = form.elements[this.namespaceField("id")]
+ , order = form.elements[this.namespaceField("order")]
+ , uri = form.elements[this.namespaceField("uri")]
+ , to = form.elements[this.namespaceField("to")]
+ , type = form.elements[this.namespaceField("type")];
// Validate
if (!Redirects._validate(uri, to, spinner))
return;
this.post("POST", {
+ action: 'seo/redirects/save',
id: id.value,
+ order: order.value,
uri: uri.value,
to: to.value,
type: type.value,
@@ -185,7 +201,7 @@ export default class Redirects {
this.tables[siteId].insertBefore(
this.rowStatic(
- id.value, uri.value, to.value, type.value, siteId.value,
+ id.value, order.value, uri.value, to.value, type.value, siteId.value,
row.dataset.added
),
row
@@ -200,10 +216,10 @@ export default class Redirects {
onEditClick = (siteId, e, row) => {
e.preventDefault();
- const { id, uri, to, type, added } = e.target.dataset;
+ const { id, order, uri, to, type, added } = e.target.dataset;
this.cancelCurrentEdit();
- const editRows = this.rowEdit(id, uri, to, type);
+ const editRows = this.rowEdit(id, order, uri, to, type);
this.editRow = row;
this.editRow.setAttribute('data-added', added);
@@ -247,6 +263,27 @@ export default class Redirects {
Craft.cp.displayNotice('SEO: ' + error);
});
};
+
+ onSort = table => {
+ const rows = table.querySelectorAll('tr');
+ const post = [];
+
+ for (let i = 0, l = rows.length; i < l; i++) {
+ const row = rows[i];
+ row.dataset.order = i;
+ row.querySelector('a').dataset.order = i;
+ post.push({ id: row.dataset.id, order: row.dataset.order });
+ }
+
+ this.post('POST', {
+ action: 'seo/redirects/sort',
+ order: post,
+ }, () => {
+ Craft.cp.displayNotice('SEO: Redirect order saved');
+ }, error => {
+ Craft.cp.displayNotice('SEO: ' + error);
+ });
+ };
// Helpers
// =========================================================================
@@ -259,7 +296,7 @@ export default class Redirects {
method,
fields = {},
onSuccess = () => {},
- onError = () => {}
+ onError = () => {},
) {
const jsonData = {};
@@ -294,7 +331,7 @@ export default class Redirects {
});
}
- rowStatic (id = -1, uri = "", to = "", type = 301, siteId = null, dateCreated = null) {
+ rowStatic (id = -1, order = -1, uri = "", to = "", type = 301, siteId = null, dateCreated = null) {
const added = dateCreated || 'Now';
const row = c("tr", { "tabindex": 0, "data-id": id }, [
@@ -307,11 +344,12 @@ export default class Redirects {
"href": "#",
"title": "Edit Redirect",
"data-id": id,
+ "data-order": order,
"data-uri": uri,
"data-to": to,
"data-type": type,
"data-added": dateCreated,
- "click": e => this.onEditClick(siteId, e, row)
+ "click": e => this.onEditClick(siteId, e, row),
}, uri)
])
])
@@ -327,14 +365,22 @@ export default class Redirects {
// Added
c("td", {}, added),
+ // Reorder
+ c("td", { "class": "thin action" }, [
+ c("a", {
+ "class": "move icon",
+ "title": "Reorder",
+ }),
+ ]),
+
// Delete
c("td", { "class": "thin action" }, [
c("a", {
"class": "delete icon",
"title": "Delete",
- "click": e => this.onDeleteClick(siteId, e, row)
- })
- ])
+ "click": e => this.onDeleteClick(siteId, e, row),
+ }),
+ ]),
]);
return row;
diff --git a/src/Seo.php b/src/Seo.php
index 557a6a3..60003c6 100644
--- a/src/Seo.php
+++ b/src/Seo.php
@@ -55,7 +55,7 @@ class Seo extends Plugin
public $documentationUrl =
'https://github.com/ethercreative/seo/blob/v3/README.md';
- public $schemaVersion = '3.1.0';
+ public $schemaVersion = '3.1.1';
// Craft
// =========================================================================
@@ -236,7 +236,7 @@ public function onRegisterCPUrlRules (RegisterUrlRulesEvent $event)
// Redirects
// ---------------------------------------------------------------------
$event->rules['DELETE seo/redirects'] = 'seo/redirects/delete';
- $event->rules['POST seo/redirects'] = 'seo/redirects/save';
+ //$event->rules['POST seo/redirects'] = 'seo/redirects/save';
$event->rules['PUT seo/redirects'] = 'seo/redirects/bulk';
$event->rules['seo/redirects'] = 'seo/redirects/index';
diff --git a/src/controllers/RedirectsController.php b/src/controllers/RedirectsController.php
index 6d3f718..844d9dd 100644
--- a/src/controllers/RedirectsController.php
+++ b/src/controllers/RedirectsController.php
@@ -58,13 +58,14 @@ public function actionSave ()
$request = Craft::$app->request;
+ $order = $request->getRequiredBodyParam('order');
$uri = $request->getRequiredBodyParam('uri');
$to = $request->getRequiredBodyParam('to');
$type = $request->getRequiredBodyParam('type');
$siteId = $request->getBodyParam('siteId', false);
$id = $request->getBodyParam('id');
- $err = Seo::$i->redirects->save($uri, $to, $type, $siteId, $id);
+ $err = Seo::$i->redirects->save($order, $uri, $to, $type, $siteId, $id);
if (is_numeric($err))
{
@@ -107,6 +108,20 @@ public function actionBulk ()
}
}
+ public function actionSort ()
+ {
+ $order = Craft::$app->getRequest()->getBodyParam('order');
+
+ $error = Seo::$i->redirects->sort($order);
+
+ if ($error) return $this->asErrorJson($error);
+ else {
+ return $this->asJson([
+ 'success' => true,
+ ]);
+ }
+ }
+
/**
* @throws Exception
* @throws Throwable
diff --git a/src/migrations/m200518_110721_add_order_to_redirects.php b/src/migrations/m200518_110721_add_order_to_redirects.php
new file mode 100644
index 0000000..81e760b
--- /dev/null
+++ b/src/migrations/m200518_110721_add_order_to_redirects.php
@@ -0,0 +1,51 @@
+addColumn(
+ RedirectRecord::$tableName,
+ 'order',
+ $this->integer()->null()
+ );
+
+ $rows = RedirectRecord::find()->select(['id', 'siteId'])->all();
+ $siteCounts = [];
+
+ foreach ($rows as $row)
+ {
+ if (!array_key_exists($row->siteId, $siteCounts))
+ $siteCounts[$row->siteId] = 0;
+
+ $record = RedirectRecord::findOne(['id' => $row->id]);
+ $record->order = $siteCounts[$row->siteId];
+ $record->save(false);
+
+ $siteCounts[$row->siteId]++;
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function safeDown()
+ {
+ $this->dropColumn(
+ RedirectRecord::$tableName,
+ 'order'
+ );
+ }
+}
diff --git a/src/models/Redirect.php b/src/models/Redirect.php
index d55c1b6..7d6ce70 100644
--- a/src/models/Redirect.php
+++ b/src/models/Redirect.php
@@ -13,6 +13,9 @@ class Redirect extends Model
// Props: Public Instance
// -------------------------------------------------------------------------
+ /** @var int */
+ public $order;
+
/** @var string */
public $uri;
@@ -37,6 +40,12 @@ public function rules (): array
{
$rules = parent::rules();
+ $rules[] = [
+ ['order'],
+ 'integer',
+ 'required',
+ ];
+
$rules[] = [
['url', 'to', 'type'],
'string',
diff --git a/src/records/RedirectRecord.php b/src/records/RedirectRecord.php
index 51912fc..5077f54 100644
--- a/src/records/RedirectRecord.php
+++ b/src/records/RedirectRecord.php
@@ -8,6 +8,7 @@
* Class RedirectRecord
*
* @property int $id
+ * @property int $order
* @property string $uri
* @property string $to
* @property string $type
diff --git a/src/services/RedirectsService.php b/src/services/RedirectsService.php
index 64564e8..5476804 100644
--- a/src/services/RedirectsService.php
+++ b/src/services/RedirectsService.php
@@ -5,6 +5,7 @@
use Craft;
use craft\base\Component;
use craft\events\ExceptionEvent;
+use craft\helpers\ArrayHelper;
use craft\helpers\UrlHelper;
use ether\seo\records\RedirectRecord;
use Exception;
@@ -80,10 +81,10 @@ public function findAllRedirects ($currentSiteOnly = false)
return RedirectRecord::find()->where(
'[[siteId]] IS NULL OR [[siteId]] = ' .
Craft::$app->sites->currentSite->id
- )->orderBy('dateCreated asc, siteId asc')->all();
+ )->orderBy('order asc')->all();
return array_reduce(
- RedirectRecord::find()->orderBy('dateCreated ASC')->all(),
+ RedirectRecord::find()->orderBy('order asc')->all(),
function ($a, RedirectRecord $record) {
$a[$record->siteId ?? 'null'][] = $record;
return $a;
@@ -142,6 +143,7 @@ public function findRedirectByPath ($path)
/**
* Saves the redirect
*
+ * @param int $order
* @param string $uri
* @param string $to
* @param string $type
@@ -150,7 +152,7 @@ public function findRedirectByPath ($path)
*
* @return array|int|string
*/
- public function save ($uri, $to, $type, $siteId = null, $id = null)
+ public function save ($order, $uri, $to, $type, $siteId = null, $id = null)
{
if ($siteId === 'null')
$siteId = null;
@@ -177,6 +179,7 @@ public function save ($uri, $to, $type, $siteId = null, $id = null)
$record = new RedirectRecord();
}
+ $record->order = $order;
$record->uri = $uri;
$record->to = $to;
$record->type = $type;
@@ -210,9 +213,12 @@ public function bulk ($redirects, $separator, $type, $siteId)
$newFormatted = [];
+ $order = RedirectRecord::find()->where(['siteId' => $siteId])->count();
+
foreach ($rawRedirects as $redirect)
{
$record = new RedirectRecord();
+ $record->order = $order++;
$record->uri = $redirect[0];
$record->to = $redirect[1];
$record->type = array_key_exists(2, $redirect) ? $redirect[2] : $type;
@@ -221,6 +227,7 @@ public function bulk ($redirects, $separator, $type, $siteId)
$newFormatted[] = [
'id' => $record->id,
+ 'order' => $record->order,
'uri' => $record->uri,
'to' => $record->to,
'type' => $record->type,
@@ -231,6 +238,29 @@ public function bulk ($redirects, $separator, $type, $siteId)
return [$newFormatted, false];
}
+ public function sort ($order)
+ {
+ $table = RedirectRecord::$tableName;
+
+ $db = Craft::$app->getDb();
+ $transaction = $db->beginTransaction();
+
+ try {
+ foreach ($order as $row) {
+ $db->createCommand()
+ ->update($table, ['order' => $row['order']], ['id' => $row['id']])
+ ->execute();
+ }
+
+ $transaction->commit();
+ } catch (Exception $e) {
+ $transaction->rollBack();
+ return $e->getMessage();
+ }
+
+ return false;
+ }
+
/**
* Deletes the redirect with the given ID
*
diff --git a/src/templates/redirects.twig b/src/templates/redirects.twig
index 246da05..fc013d8 100644
--- a/src/templates/redirects.twig
+++ b/src/templates/redirects.twig
@@ -158,7 +158,7 @@
To |
Type |
Added |
- |
+ |
@@ -169,13 +169,14 @@
{% endif %}
{% for redirect in siteRedirects %}
-
+
|
+
+
+ |
|
diff --git a/src/web/assets/js/SeoSettings.min.js b/src/web/assets/js/SeoSettings.min.js
index 571b5ed..b19d984 100644
--- a/src/web/assets/js/SeoSettings.min.js
+++ b/src/web/assets/js/SeoSettings.min.js
@@ -1,2 +1,2 @@
-!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/assets/js/",n(n.s="./js/SeoSettings.js")}({"../../../../../../usr/local/lib/node_modules/build/node_modules/@babel/runtime/helpers/defineProperty.js":function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/a-function.js":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/a-possible-prototype.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js");e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/add-to-unscopables.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-create.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-property.js"),l=r("unscopables"),s=Array.prototype;null==s[l]&&i.f(s,l,{configurable:!0,value:o(null)}),e.exports=function(e){s[l][e]=!0}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/advance-string-index.js":function(e,t,n){"use strict";var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/string-multibyte.js").charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/an-object.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js");e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/array-includes.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-indexed-object.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-length.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-absolute-index.js"),l=function(e){return function(t,n,l){var s,a=r(t),u=o(a.length),c=i(l,u);if(e&&n!=n){for(;u>c;)if((s=a[c++])!=s)return!0}else for(;u>c;c++)if((e||c in a)&&a[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:l(!0),indexOf:l(!1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js":function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/copy-constructor-properties.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/own-keys.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-get-own-property-descriptor.js"),l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-property.js");e.exports=function(e,t){for(var n=o(t),s=l.f,a=i.f,u=0;u")})),c="$0"==="a".replace(/./,"$0"),d=i("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),h=!o((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,d){var p=i(e),m=!o((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),g=m&&!o((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[a]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!m||!g||"replace"===e&&(!u||!c||f)||"split"===e&&!h){var v=/./[p],b=n(p,""[e],(function(e,t,n,r,o){return t.exec===l?m&&!o?{done:!0,value:v.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:c,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),y=b[0],x=b[1];r(String.prototype,e,y),r(RegExp.prototype,p,2==t?function(e,t){return x.call(e,this,t)}:function(e){return x.call(e,this)})}d&&s(RegExp.prototype[p],"sham",!0)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/get-built-in.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/path.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),i=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js":function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||Function("return this")()}).call(this,n("../../../../../../usr/local/lib/node_modules/build/node_modules/webpack/buildin/global.js"))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js":function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js":function(e,t){e.exports={}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/html.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/get-built-in.js");e.exports=r("document","documentElement")},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/ie8-dom-define.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/descriptors.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/document-create-element.js");e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/indexed-object.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js"),i="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?i.call(e,""):Object(e)}:Object},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/inspect-source.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-store.js"),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/internal-state.js":function(e,t,n){var r,o,i,l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-weak-map.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/create-non-enumerable-property.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),d=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-key.js"),f=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js"),h=s.WeakMap;if(l){var p=new h,m=p.get,g=p.has,v=p.set;r=function(e,t){return v.call(p,e,t),t},o=function(e){return m.call(p,e)||{}},i=function(e){return g.call(p,e)}}else{var b=d("state");f[b]=!0,r=function(e,t){return u(e,b,t),t},o=function(e){return c(e,b)?e[b]:{}},i=function(e){return c(e,b)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!a(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-forced.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),o=/#|\.prototype\./,i=function(e,t){var n=s[l(e)];return n==u||n!=a&&("function"==typeof t?r(t):!!t)},l=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},s=i.data={},a=i.NATIVE="N",u=i.POLYFILL="P";e.exports=i},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js":function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-pure.js":function(e,t){e.exports=!1},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-regexp.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js")("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/iterators-core.js":function(e,t,n){"use strict";var r,o,i,l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-get-prototype-of.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/create-non-enumerable-property.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-pure.js"),d=u("iterator"),f=!1;[].keys&&("next"in(i=[].keys())?(o=l(l(i)))!==Object.prototype&&(r=o):f=!0),null==r&&(r={}),c||a(r,d)||s(r,d,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:f}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/iterators.js":function(e,t){e.exports={}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-symbol.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js");e.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-weak-map.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/inspect-source.js"),i=r.WeakMap;e.exports="function"==typeof i&&/native code/.test(o(i))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-create.js":function(e,t,n){var r,o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/an-object.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-properties.js"),l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/enum-bug-keys.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/html.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/document-create-element.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-key.js"),d=c("IE_PROTO"),f=function(){},h=function(e){return"