diff --git a/App/CSS/createServo.css b/App/CSS/createServo.css
new file mode 100644
index 0000000..2c6932e
--- /dev/null
+++ b/App/CSS/createServo.css
@@ -0,0 +1,17 @@
+.container {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translateX(-50%) translateY(-50%);
+}
+
+#url {
+ text-align: center;
+ border: 1px solid;
+ padding: 5px;
+}
+
+#download #upload {
+ text-align: center;
+ padding: 5px;
+}
\ No newline at end of file
diff --git a/App/JS/Resources/Servos/ax18a.csv b/App/JS/Resources/Servos/ax18a.csv
new file mode 100644
index 0000000..967b395
--- /dev/null
+++ b/App/JS/Resources/Servos/ax18a.csv
@@ -0,0 +1,33 @@
+Address, Size(Byte), Data Name, Description, Access, InitialValue
+0, 2, Model Number, Model Number, R, 18
+2, 1, Firmware Version, Firmware Version, R, -
+3, 1, ID, DYNAMIXEL ID, RW, 1
+4, 1, Baud Rate, Communication Speed, RW, 1
+5, 1, Return Delay Time, Response Delay Time, RW, 250
+6, 2, CW Angle Limit, Clockwise Angle Limit, RW, 0
+8, 2, CCW Angle Limit, Counter-Clockwise Angle Limit, RW, 1023
+11, 1, Temperature Limit, Maximum Internal Temperature Limit, RW, 75
+12, 1, Min Voltage Limit, Minimum Input Voltage Limit, RW, 60
+13, 1, Max Voltage Limit, Maximum Input Voltage Limit, RW, 140
+14, 2, Max Torque, Maximun Torque, RW, 983
+16, 1, Status Return Level, Select Types of Status Return, RW, 2
+17, 1, Alarm LED, LED for Alarm, RW, 36
+18, 1, Shutdown, Shutdown Error Information, RW, 36
+24, 1, Torque Enable, Motor Torque On/Off, RW, 0
+25, 1, LED, Status LED On/Off, RW, 0
+26, 1, CW Compliance Margin, CW Compliance Margin, RW, 1
+27, 1, CCW Compliance Margin, CCW Compliance Margin, RW, 1
+28, 1, CW Compliance Slope, CW Compliance Slope, RW, 32
+29, 1, CCW Compliance Slope, CCW Compliance Slope, RW, 32
+30, 2, Goal Position, Target Position, RW, -
+32, 2, Moving Speed, Moving Speed, RW, -
+34, 2, Torque Limit, Torque Limit(Goal Torque), RW, ADD 14&15
+36, 2, Present Position, Present Position, R, -
+38, 2, Present Speed, Present Speed, R, -
+40, 2, Present Load, Present Load, R, -
+42, 1, Present Voltage, Present Voltage, R, -
+43, 1, Present Temperature, Present Temperature, R, -
+44, 1, Registered, If Instruction is registered, R, 0
+46, 1, Moving, Movement Status, R, 0
+47, 1, Lock, Locking EEPROM, RW, 0
+48, 2, Punch, Minimum Current Threshold, RW, 32
diff --git a/App/JS/Resources/Servos/xl320.csv b/App/JS/Resources/Servos/xl320.csv
new file mode 100644
index 0000000..9a88966
--- /dev/null
+++ b/App/JS/Resources/Servos/xl320.csv
@@ -0,0 +1,32 @@
+Address, Size(Byte), Data Name, Description, Access, InitialValue, Min, Max
+0, 2, Model Number, Model Number, R, 350, -, -
+2, 1, Firmware Version, Firmware Version, R, -, -, -
+3, 1, ID, DYNAMIXEL ID, RW, 1, 0, 252
+4, 1, Baud Rate, Communication Speed, RW, 3, 0, 3
+5, 1, Return Delay Time, Response Delay Time, RW, 250, 0, 254
+6, 2, CW Angle Limit, Clockwise Angle Limit, RW, 0, 0, 1023
+8, 2, CCW Angle Limit, Counter-Clockwise Angle Limit, RW, 1023, 0, 1023
+11, 1, Control Mode, Control Mode, RW, 2, 1, 2
+12, 1, Temperature Limit, Maximum Internal Temperature Limit, RW, 65, 0, 150
+13, 1, Min Voltage Limit, Minimum Input Voltage Limit, RW, 60, 50, 250
+14, 1, Max Voltage Limit, Maximum Input Voltage Limit, RW, 90, 50, 250
+15, 2, Max Torque, Maximun Torque, RW, 1023, 0, 1023
+17, 1, Status Return Level, Select Types of Status Return, RW, 2, 0, 2
+18, 1, Shutdown, Shutdown Error Information, RW, 3, 0, 7
+24, 1, Torque Enable, Motor Torque On/Off, RW, 0, 0, 1
+25, 1, LED, Status LED On/Off, RW, 0, 0, 7
+27, 1, D Gain, Derivative Gain, RW, 0, 0, 254
+28, 1, I Gain, Integral Gain, RW, 0, 0, 254
+29, 1, P Gain, Proportional Gain, RW, 32, 0, 254
+30, 2, Goal Position, Desired Position, RW, -, 0, 1023
+32, 2, Moving Speed, Moving Speed(Moving Velocity), RW, -, 0, 2047
+35, 2, Torque Limit, Torque Limit(Goal Torque), RW, -, 0, 1023
+37, 2, Present Position, Present Position, R, -, -, -
+39, 2, Present Speed, Present Speed, R, -, -, -
+41, 2, Present Load, Present Load, R, -, -, -
+45, 1, Present Voltage, Present Voltage, R, -, -, -
+46, 1, Present Temperature, Present Temperature, R, -, -, -
+47, 1, Registered, If Instruction is registered, R, 0, -, -
+49, 1, Moving, Movement Status, R, 0, -, -
+50, 1, Hardware Error Status, Hardware Error Status, R, 0, -, -
+51, 2, Punch, Minimum Current Threshold, RW, 32, 0, 1023
diff --git a/App/JS/createServo.js b/App/JS/createServo.js
new file mode 100644
index 0000000..f8f334d
--- /dev/null
+++ b/App/JS/createServo.js
@@ -0,0 +1,154 @@
+const fs = require('fs');
+const rp = require('request-promise');
+const cheerio = require('cheerio');
+const cheerioTableparser = require('cheerio-tableparser');
+const net = require('net');
+let link = '';
+let fileData = '';
+let filename = '';
+
+const client = new net.Socket();
+client.on('error', function(err) {
+ console.error('Unable to connect to the fileserver!' + '\n' +
+ ' Ensure that the robot is powered and active.');
+});
+
+/**
+ * Parses the header of a given table
+ * @param {Array} table
+ * @return {String} The header of the specified table
+ */
+function parseDynamixelHeader(table) {
+ let build = '';
+ for (let col = 0; col < table.length; col++) {
+ build += table[col][0];
+ if (col < table.length - 1) {
+ build += ', ';
+ } else {
+ build += '\n';
+ }
+ }
+ return build;
+}
+
+/**
+ * Parses all elements in a given Dynamixel table and converts them to CSV
+ * @param {Object} table The table returned when executing parsetable
+ * @param {Boolean} includeHeader If the CSV should include headings - use
+ * false if this is not the top item in the table
+ * @return {String} A string of CSV data with the control table
+ */
+function parseDynamixelTable(table) {
+ let build = '';
+ for (let i = 1; i < table[0].length; i++) {
+ for (let x = 0; x < table.length; x++) {
+ build += table[x][i];
+ if (x < table.length - 1) {
+ build += ', ';
+ }
+ }
+ if (i < table[0].length) {
+ build += '\n';
+ }
+ }
+ return build;
+}
+
+/**
+ * Computes all HTML tables from indexes and converts to CSV
+ * @param {String} html The downloaded e-Manual document as HTML
+ * @param {Array} indexes The indexes of all tables involving the control table
+ * @return {String} The CSV-formatted table containing all of the control table
+ */
+function generateCSV(html, indexes) {
+ if (indexes == null || indexes == undefined || indexes.length == 0) {
+ console.error('Invalid argument!' +
+ 'Ensure that the argument "indexes" is valid!');
+ return '';
+ }
+
+ let fileData = '';
+ const $ = cheerio.load(html);
+ cheerioTableparser($);
+ const cheerioTable = $('table');
+
+ fileData += parseDynamixelHeader(cheerioTable.eq(
+ indexes[0]).parsetable(true, true, true));
+ for (let i = 0; i < indexes.length; i++) {
+ fileData += parseDynamixelTable(cheerioTable.eq(
+ indexes[i]).parsetable(true, true, true));
+ }
+
+ return fileData;
+}
+
+/**
+ * Downloads and converts the link to a CSV, saving it to Resources/Servos and
+ * storing it in the variable fileData
+ */
+function getFile() {
+ const url = document.getElementById('url').value;
+ const re = /^https?:\/\/emanual\.robotis\.com\/docs\/en\/dxl\/[a-z0-9]+\/[a-z0-9]+-?[a-z0-9]+/;
+ const res = url.match(re);
+ if (res !== null && res !== undefined) {
+ link = res[0];
+ console.log(`Extracted URL as ${link}`);
+ rp(link)
+ .then(function(html) {
+ console.log('Successfully downloaded the site!' +
+ ' Now scraping the data...');
+ fileData = generateCSV(html, [1, 2]);
+ console.log('Downloaded table!');
+
+ const linkPieces = link.split('/');
+ if (linkPieces[linkPieces.length - 1] == '') {
+ linkPieces.pop(linkPieces.length - 1);
+ }
+ filename = linkPieces[linkPieces.length - 1].replace('-', '');
+
+ fs.writeFile(`App/JS/Resources/Servos/${filename}.csv`,
+ fileData, function(err) {
+ if (err) {
+ console.error('Failed to write file! Do you have access?');
+ }
+ console.log(`Saved the file as ${filename}.csv`);
+ });
+
+ uploadButton = document.getElementById('upload');
+ uploadButton.innerHTML =
+ `Upload ${filename}.csv`;
+ uploadButton.style.display = null;
+ })
+ .catch(function(err) {
+ console.error('An error has occured!' + '\n' +
+ 'Check that you have an active internet connection' + '\n' +
+ 'Additionally, check that you are able to access sites' + '\n' +
+ 'This may be due to you being connected to the robot' + '\n' +
+ `Recieved error: \n${err}`);
+ });
+ } else {
+ console.error('It seems that your URL is invalid!');
+ }
+}
+
+/**
+ * Uploads the data stored in fileData through TCP to a listening fileserver
+ */
+function uploadFile() {
+ if (fileData == null || fileData == undefined || fileData == '') {
+ console.error('There is no downloaded file!');
+ return;
+ }
+
+ client.connect({
+ port: 5004,
+ address: '127.0.0.1',
+ });
+
+ client.on('connect', function() {
+ client.write(`${filename}\n${fileData}`);
+ console.log('Wrote file to server!');
+ });
+
+ console.log('Uploaded table!');
+}
diff --git a/App/createServo.html b/App/createServo.html
new file mode 100644
index 0000000..5c2f7e1
--- /dev/null
+++ b/App/createServo.html
@@ -0,0 +1,19 @@
+
+
+
+
+ Create a new servo type
+
+
+
+
+ Invalid URL!
+
+
+
+
+
+
+
diff --git a/Server/fileServer.js b/Server/fileServer.js
new file mode 100644
index 0000000..419a3f8
--- /dev/null
+++ b/Server/fileServer.js
@@ -0,0 +1,21 @@
+const fs = require('fs');
+const net = require('net');
+const server = net.createServer();
+
+server.on('connection', function(socket) {
+ socket.on('data', function(data) {
+ let fileData = data.toString().split('\n');
+ const filename = fileData[0].replace('-', '');
+ fileData.shift();
+ fileData = fileData.join('\n');
+
+ fs.writeFile(`./Driving/Servos/${filename}.csv`, fileData, function(err) {
+ if (err) {
+ console.error('Failed to write file! Do you have access?');
+ }
+ console.log(`Saved the file as ${filename}.csv`);
+ });
+ });
+});
+
+server.listen(5004, '');
diff --git a/Server/index.js b/Server/index.js
index 339daec..6725321 100644
--- a/Server/index.js
+++ b/Server/index.js
@@ -7,6 +7,10 @@ const commands = {
'Driving': [
'python3',
['-u', './Driving/server.py']
+ ],
+ 'Fileserver': [
+ 'node',
+ ['./fileServer.js']
]
}
diff --git a/main.js b/main.js
index 4001827..bad067c 100644
--- a/main.js
+++ b/main.js
@@ -9,29 +9,16 @@ function createWindow() {
width: 1600,
height: 1200
});
- win.loadFile('App/loading.html');
- setTimeout(function() {
- win.loadFile('App/index.html');
- }, 3000)
+ // win.loadFile('App/loading.html');
+ // setTimeout(function() {
+ win.loadFile('App/createServo.html');
+ // }, 3000)
// win.loadURL('http://localhost:8080')
win.webContents.openDevTools();
win.on('closed', () => {
win = null;
});
- win2 = new BrowserWindow({
- width: 1600,
- height: 1200
- });
- win2.loadFile('App/loading.html');
- setTimeout(function() {
- win2.loadFile('App/charts.html');
- }, 3000)
- // win.loadURL('http://localhost:8080')
-
- win2.on('closed', () => {
- win2 = null;
- });
}
app.on('ready', createWindow);
diff --git a/package.json b/package.json
index 4ac7bc0..9f73409 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,10 @@
"license": "Apache",
"private": false,
"dependencies": {
- "electron": "^6.0.2"
+ "cheerio": "^1.0.0-rc.3",
+ "cheerio-tableparser": "^1.0.1",
+ "electron": "^6.0.2",
+ "eslint-config-google": "^0.13.0",
+ "request-promise": "^4.2.4"
}
}
diff --git a/yarn.lock b/yarn.lock
index 8f75f6e..6240caf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
# yarn lockfile v1
+"@types/node@*":
+ version "12.7.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44"
+ integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==
+
"@types/node@^10.12.18":
version "10.14.15"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.15.tgz#e8f7729b631be1b02ae130ff0b61f3e018000640"
@@ -61,6 +66,16 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
+bluebird@^3.5.0:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
+ integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -84,6 +99,23 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+cheerio-tableparser@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cheerio-tableparser/-/cheerio-tableparser-1.0.1.tgz#e55ad2dcb5361b8c323a6cbb8c0cd46e3cbdf1cd"
+ integrity sha1-5VrS3LU2G4wyOmy7jAzUbjy98c0=
+
+cheerio@^1.0.0-rc.3:
+ version "1.0.0-rc.3"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6"
+ integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.1"
+ entities "~1.1.1"
+ htmlparser2 "^3.9.1"
+ lodash "^4.15.0"
+ parse5 "^3.0.1"
+
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
@@ -111,6 +143,21 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-what@2.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -154,6 +201,55 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+dom-serializer@0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb"
+ integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-serializer@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
+ integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -186,6 +282,16 @@ electron@^6.0.2:
electron-download "^4.1.0"
extract-zip "^1.0.3"
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
+ integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
+
env-paths@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
@@ -198,6 +304,11 @@ error-ex@^1.2.0:
dependencies:
is-arrayish "^0.2.1"
+eslint-config-google@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.13.0.tgz#e277d16d2cb25c1ffd3fd13fb0035ad7421382fe"
+ integrity sha512-ELgMdOIpn0CFdsQS+FuxO+Ttu4p+aLaXHv9wA9yVnzqlUGV7oN/eRRnJekk7TCur6Cu2FXX0fqfIXRBaM14lpQ==
+
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -306,6 +417,18 @@ hosted-git-info@^2.1.4:
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
+htmlparser2@^3.9.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -322,7 +445,7 @@ indent-string@^2.1.0:
dependencies:
repeating "^2.0.0"
-inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -424,6 +547,11 @@ load-json-file@^1.0.0:
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
+lodash@^4.15.0, lodash@^4.17.11:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
+ integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
+
loud-rejection@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
@@ -502,6 +630,13 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
+nth-check@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
nugget@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
@@ -542,6 +677,13 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
+parse5@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+ integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==
+ dependencies:
+ "@types/node" "*"
+
path-exists@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@@ -616,7 +758,7 @@ progress-stream@^1.1.0:
speedometer "~0.1.2"
through2 "~0.2.3"
-psl@^1.1.24:
+psl@^1.1.24, psl@^1.1.28:
version "1.3.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd"
integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==
@@ -626,7 +768,7 @@ punycode@^1.4.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-punycode@^2.1.0:
+punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
@@ -676,6 +818,15 @@ readable-stream@^2.2.2:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
+readable-stream@^3.1.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
+ integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
readable-stream@~1.1.9:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -701,6 +852,23 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
+request-promise-core@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
+ integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
+ dependencies:
+ lodash "^4.17.11"
+
+request-promise@^4.2.4:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.4.tgz#1c5ed0d71441e38ad58c7ce4ea4ea5b06d54b310"
+ integrity sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==
+ dependencies:
+ bluebird "^3.5.0"
+ request-promise-core "1.1.2"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
request@^2.45.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
@@ -734,7 +902,7 @@ resolve@^1.10.0:
dependencies:
path-parse "^1.0.6"
-safe-buffer@^5.0.1, safe-buffer@^5.1.2:
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -812,6 +980,11 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -821,6 +994,13 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -879,6 +1059,14 @@ through2@~0.2.3:
readable-stream "~1.1.9"
xtend "~2.1.1"
+tough-cookie@^2.3.3:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
tough-cookie@~2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
@@ -921,7 +1109,7 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=