From 205277ab63012ddd0ceff4e8c321d0d2ca909f19 Mon Sep 17 00:00:00 2001 From: Erinome Date: Fri, 17 Apr 2020 09:56:30 +0300 Subject: [PATCH 001/172] couple zones and spots with stored maps - save zones when storing a map - load zones when restoring a map - if restored map doesn't have own zones, keep current zones set --- lib/MapManager.js | 102 ++++++++++++++++++++++++------------- lib/MqttClient.js | 41 ++------------- lib/Telegrambot.js | 40 +++++---------- lib/Valetudo.js | 19 +++++-- lib/webserver/WebServer.js | 40 +++------------ 5 files changed, 102 insertions(+), 140 deletions(-) diff --git a/lib/MapManager.js b/lib/MapManager.js index 8f316980..f282f5cf 100644 --- a/lib/MapManager.js +++ b/lib/MapManager.js @@ -1,15 +1,17 @@ const fs = require("fs"); +const { exec } = require("child_process"); const slotNameRegex = /^[a-zа-яё0-9\-_\ ]+$/i; const requiredFiles = ['last_map']; -const optionalFiles = ['ChargerPos.data', 'PersistData_1.data', 'PersistData_2.data', 'PersistData_3.data', 'PersistData_4.data', 'PersistData_5.data']; -const cleanedFiles = ['StartPos.data', 'user_map0', 'user_map1', 'user_map2', 'user_map3', 'user_map4']; +const optionalFiles = ['ChargerPos.data', 'PersistData_1.data']; +const cleanedFiles = ['StartPos.data', 'user_map0', 'user_map1', 'user_map2', 'user_map3', 'PersistData_2.data', 'PersistData_3.data', 'PersistData_4.data', 'PersistData_5.data']; -/*** - * stores current map to a backup folder - * @param name - */ -function storeMap(name, callback) { +const MapManager = function(options) { + this.configuration = options.configuration; + this.vacuum = options.vacuum; +}; + +MapManager.prototype.storeMap = function(name, callback) { try { name = name.trim(); if (!slotNameRegex.test(name)) { @@ -33,18 +35,30 @@ function storeMap(name, callback) { fs.unlinkSync("/mnt/data/valetudo/maps/" + name + "/" + file); } }); + const currentOpts = { + zones: this.configuration.get("areas"), + spots: this.configuration.get("spots") + }; + fs.writeFileSync("/mnt/data/valetudo/maps/" + name + "/valetudo.json",JSON.stringify(currentOpts)); callback(null); } catch(e) { callback(e); } -} - -/*** - * restores backed up map - * @param name - */ -function loadMap(name, callback) { - try { +}; +MapManager.prototype.loadMap = function(name, callback) { + const self = this; + new Promise((resolve,reject) => { + self.vacuum.getCurrentStatus(function (err, data) { + if (err) { + return reject(err.toString()); + } + if (!(data.state === 3 || data.state === 8 || (data.state === 2 && data.in_cleaning === 0))) { + return reject("loading map allowed only when docked or idle"); + } + resolve(data); + }); + }) + .then(data => { name = name.trim(); if (!slotNameRegex.test(name)) { throw "invalid name"; @@ -58,18 +72,39 @@ function loadMap(name, callback) { requiredFiles.concat(optionalFiles).forEach(file => { if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/" + file)) fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/" + file, "/mnt/data/rockrobo/" + file); }); - fs.copyFileSync("/mnt/data/rockrobo/last_map", "/mnt/data/rockrobo/user_map0"); // is it really required? - callback(null, "ok"); - } catch(e) { - callback(e); - }; -} - -/*** - * removes backed up map - * @param name - */ -function removeMap(name, callback) { + fs.copyFileSync("/mnt/data/rockrobo/last_map", "/mnt/data/rockrobo/user_map0"); // for a single backup + if (fs.existsSync("/mnt/data/rockrobo/PersistData_1.data")) { + fs.copyFileSync("/mnt/data/rockrobo/PersistData_1.data", "/mnt/data/rockrobo/PersistData_2.data"); + } + if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/valetudo.json")) { + const loadedOpts = JSON.parse(fs.readFileSync("/mnt/data/valetudo/maps/" + name + "/valetudo.json", "utf8")); + if (loadedOpts.zones) { + this.configuration.set("areas",loadedOpts.zones); + } + if (loadedOpts.spots) { + this.configuration.set("spots",loadedOpts.spots); + } + } + if (data['lab_status'] === 1) { + setTimeout(() => self.vacuum.startCleaning(function (err, data2) { + if (err) { + return Promise.reject(err.toString()); + } + setTimeout(() => self.vacuum.stopCleaning(function (err, data2) { + if (err) { + return Promise.reject(err.toString()); + } + callback(null, "ok"); + }),2e3); + }),1e3); + } else { + exec("/bin/sleep 2 && /sbin/restart rrwatchdoge"); + callback(null, "wait"); + } + }) + .catch(e => callback(e)); +}; +MapManager.prototype.removeMap = function(name, callback) { try { name = name.trim(); if (!slotNameRegex.test(name)) { @@ -85,12 +120,8 @@ function removeMap(name, callback) { } catch(e) { callback(e); }; -} - -/*** - * lists stored maps - */ -function listStoredMaps(callback) { +}; +MapManager.prototype.listStoredMaps = function(callback) { if (!fs.existsSync("/mnt/data/valetudo/maps/")) { callback(null, []); return; @@ -105,6 +136,5 @@ function listStoredMaps(callback) { return slotNameRegex.test(slot) && requiredFiles.every(file => fs.existsSync("/mnt/data/valetudo/maps/" + slot + "/" + file)); })); }); -} - -module.exports = { storeMap, loadMap, removeMap, listStoredMaps }; \ No newline at end of file +}; +module.exports = MapManager; diff --git a/lib/MqttClient.js b/lib/MqttClient.js index 24bbd35a..c3ec77f5 100644 --- a/lib/MqttClient.js +++ b/lib/MqttClient.js @@ -2,8 +2,6 @@ const fs = require("fs"); const mqtt = require("mqtt"); const Tools = require("./Tools"); const Vacuum = require("./miio/Vacuum"); -const MapManager = require('./MapManager'); -const { exec } = require("child_process"); const MQTT_COMMANDS = { START: "start", @@ -98,6 +96,7 @@ const MqttClient = function (options) { this.qos = mqttConfig.qos || 0; this.events = options.events; this.map = options.map; + this.mapManager = options.mapManager; this.topics = { command: this.topicPrefix + "/" + this.identifier + "/command", @@ -567,7 +566,7 @@ MqttClient.prototype.handleCustomCommand = function (message) { */ case CUSTOM_COMMANDS.STORE_MAP: if (msg.name) { - MapManager.storeMap(msg.name, function(err, data) { + this.MapManager.storeMap(msg.name, function(err, data) { if (err) { console.info(new Date(),err); } }); } else { @@ -583,40 +582,8 @@ MqttClient.prototype.handleCustomCommand = function (message) { */ case CUSTOM_COMMANDS.LOAD_MAP: if (msg.name) { - this.vacuum.getCurrentStatus((err, data) => { - if (err) { - console.info(new Date(),err); - return; - } - if (data.state === 3 || data.state === 8) { - MapManager.loadMap(msg.name, (err, data2) => { - if (err) { - console.info(new Date(),err); - return; - } else { - if (data['lab_status'] === 1) { - setTimeout(() => this.vacuum.startCleaning((err, data2) => { - if (err) { - console.info(new Date(),err); - return; - } else { - setTimeout(() => this.vacuum.stopCleaning((err, data2) => { - if (err) { - console.info(new Date(),err); - return; - } - }),2e3); - } - }),1e3); - } else { - exec("/bin/sleep 2 && /sbin/restart rrwatchdoge"); - } - } - }); - } else { - console.info(new Date(),"Restoring map allowed only when docked or idle"); - return; - } + this.mapManager.loadMap(msg.name, function (err, data) { + if (err) { console.info(new Date(),err); } }); } else { console.info(new Date(),"Missing name for mqtt restoring map"); diff --git a/lib/Telegrambot.js b/lib/Telegrambot.js index fda8d1d6..f1e8a1da 100644 --- a/lib/Telegrambot.js +++ b/lib/Telegrambot.js @@ -1,8 +1,7 @@ const fs = require("fs"); const path = require("path"); const Vacuum = require("./miio/Vacuum"); -const MapManager = require('./MapManager'); -const { exec } = require("child_process"); + const SimpleMapDrawer = require("./SimpleMapDrawer"); const SlimbotImproved = require("./telegram/slimbotImproved.js"); @@ -20,7 +19,8 @@ const Telegrambot = function (options) { this.events = options.events; this.vacuum = options.vacuum; this.map = options.map; - this.lastState = {state: -1, error_code: 0, in_cleaning: 0, in_returning: 0}; // todo: update on first start + this.mapManager = options.mapManager; + this.lastState = {state: -1, error_code: 0, in_cleaning: 0, in_returning: 0}; if (process.env.VAC_MODEL) { this.lastState = {state: 8, error_code: 0, in_cleaning: 0, in_returning: 0}; // for development this.debugLogging = true; @@ -641,7 +641,7 @@ Telegrambot.prototype.parseCallbackQuery = function(query) { break; case "maps_run": if ([3,8].includes(self.lastState.state) || (self.lastState.state === 2 && self.lastState.in_cleaning === 0)) { - MapManager.listStoredMaps((err, maps) => { + self.mapManager.listStoredMaps((err, maps) => { if (err) { answerCommandFailed(); return; @@ -657,33 +657,17 @@ Telegrambot.prototype.parseCallbackQuery = function(query) { return; } answerCommandOK(); - new Promise((res,rej) => MapManager.loadMap(hashed[chosen], function (err, data) { + new Promise((res,rej) => self.mapManager.loadMap(hashed[chosen], function (err, data) { if (err) rej(err); - res(); + res(data); })) - .then(() => { - if (self.lastState['lab_status'] === 1) { - return new Promise((res,rej) => { - setTimeout(() => self.vacuum.startCleaning(function (err, data2) { - if (err) rej(err); - res(); - }),1e3); - }) - .then(res => new Promise((res,rej) => { - setTimeout(() => self.vacuum.stopCleaning(function (err, data2) { - if (err) rej(err); - res(); - }),2e3); - })) - .then(res => { - self.deleteMessage(query.message.chat.id, query.message.message_id); - self.sendMessage(query.message.chat.id, self.languageGetter('telegram.mapLoadOK',"Map should be reloaded now.")); - }); - } else { + .then(data => { + if (data === 'wait') { self.deleteMessage(query.message.chat.id, query.message.message_id); self.sendMessage(query.message.chat.id, self.languageGetter('telegram.mapLoadWait',"Map should be reloaded in 30 seconds. Please wait.")); - exec("/bin/sleep 2 && /sbin/restart rrwatchdoge"); - return; + } else { + self.deleteMessage(query.message.chat.id, query.message.message_id); + self.sendMessage(query.message.chat.id, self.languageGetter('telegram.mapLoadOK',"Map should be reloaded now.")); } }) .catch(err => { @@ -698,7 +682,7 @@ Telegrambot.prototype.parseCallbackQuery = function(query) { } break; case "maps_menu": - MapManager.listStoredMaps((err, maps) => { + self.mapManager.listStoredMaps((err, maps) => { if (err) { answerCommandFailed(); return; diff --git a/lib/Valetudo.js b/lib/Valetudo.js index 7b843be9..ce85d8f1 100644 --- a/lib/Valetudo.js +++ b/lib/Valetudo.js @@ -6,7 +6,8 @@ const MqttClient = require("./MqttClient"); const Configuration = require("./Configuration"); const EventEmitter = require('events'); const SSHManager = require('./SSHManager'); -const Telegrambot = require('./Telegrambot'); +const Telegrambot = require('./Telegrambot'); +const MapManager = require('./MapManager'); const CronScheduler = require('./CronScheduler'); const Valetudo = function() { @@ -45,15 +46,21 @@ const Valetudo = function() { this.sshManager = new SSHManager(); + this.mapManager = new MapManager({ + configuration: this.configuration, + vacuum: this.vacuum + }); + this.cronScheduler = new CronScheduler({ configuration: this.configuration, - vacuum: this.vacuum, + vacuum: this.vacuum }); this.telegramBot = new Telegrambot({ vacuum: this.vacuum, events: this.events, map: this.map, + mapManager: this.mapManager, configuration: this.configuration }); @@ -66,8 +73,9 @@ const Valetudo = function() { sshManager: this.sshManager, cronScheduler: this.cronScheduler, events: this.events, - cloud: this.dummycloud, - telegramBot: this.telegramBot + cloud: this.dummycloud, + mapManager: this.mapManager, + telegramBot: this.telegramBot }); if(this.configuration.get("mqtt") && this.configuration.get("mqtt").enabled === true) { @@ -75,7 +83,8 @@ const Valetudo = function() { configuration: this.configuration, vacuum: this.vacuum, events: this.events, - map: this.map + map: this.map, + mapManager: this.mapManager }); } }; diff --git a/lib/webserver/WebServer.js b/lib/webserver/WebServer.js index e5b88d12..bb2e7cf0 100644 --- a/lib/webserver/WebServer.js +++ b/lib/webserver/WebServer.js @@ -17,7 +17,6 @@ const prettyCron = require("prettycron"); const SimpleMapDrawer = require("../SimpleMapDrawer"); const Vacuum = require("../miio/Vacuum"); -const MapManager = require('../MapManager'); const { exec } = require("child_process"); const Request = require('request'); @@ -48,6 +47,7 @@ const WebServer = function (options) { this.cronScheduler = options.cronScheduler; this.events = options.events; this.cloud = options.cloud; + this.mapManager = options.mapManager; this.telegramBot = options.telegramBot; this.map = options.map; @@ -695,7 +695,7 @@ const WebServer = function (options) { this.app.put("/api/store_map", function (req, res) { if (req.body && req.body.name !== undefined) { - MapManager.storeMap(req.body.name, function (err, data) { + self.mapManager.storeMap(req.body.name, function (err, data) { if (err) { res.status(500).send(err.toString()); } else { @@ -709,40 +709,12 @@ const WebServer = function (options) { this.app.put("/api/load_map", function (req, res) { if (req.body && req.body.name !== undefined) { - self.vacuum.getCurrentStatus(function (err, data) { + self.mapManager.loadMap(req.body.name, function (err, data) { if (err) { res.status(500).send(err.toString()); return; } - if (data.state === 3 || data.state === 8 || (data.state === 2 && data.in_cleaning === 0)) { - MapManager.loadMap(req.body.name, function (err, data2) { - if (err) { - res.status(500).send(err.toString()); - } else { - if (data['lab_status'] === 1) { - setTimeout(() => self.vacuum.startCleaning(function (err, data2) { - if (err) { - res.status(500).send(err.toString()); - } else { - setTimeout(() => self.vacuum.stopCleaning(function (err, data2) { - if (err) { - res.status(500).send(err.toString()); - } else { - res.json({message: "ok"}); - } - }),2e3); - } - }),1e3); - } else { - exec("/bin/sleep 2 && /sbin/restart rrwatchdoge"); - res.json({message: "wait"}); - } - } - }); - } else { - res.status(400).send("loading map allowed only when docked or idle"); - return; - } + res.json({message: data}); }); } else { res.status(400).send("name missing"); @@ -751,7 +723,7 @@ const WebServer = function (options) { this.app.put("/api/remove_map", function (req, res) { if (req.body && req.body.name !== undefined) { - MapManager.removeMap(req.body.name, function (err, data) { + self.mapManager.removeMap(req.body.name, function (err, data) { if (err) { res.status(500).send(err.toString()); } else { @@ -764,7 +736,7 @@ const WebServer = function (options) { }); this.app.get("/api/list_maps", function (req, res) { - MapManager.listStoredMaps(function (err, data) { + self.mapManager.listStoredMaps(function (err, data) { if (err) { res.status(500).send(err.toString()); } else { From 6cb6b9913b51316ed4c5be9f184c93415fd82a44 Mon Sep 17 00:00:00 2001 From: Erinome Date: Sat, 18 Apr 2020 21:50:20 +0300 Subject: [PATCH 002/172] ignore status changes while restoring a map on Gen2 --- lib/MapManager.js | 2 ++ lib/Valetudo.js | 3 ++- lib/miio/Dummycloud.js | 25 ++++++++++++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/MapManager.js b/lib/MapManager.js index f282f5cf..01db571d 100644 --- a/lib/MapManager.js +++ b/lib/MapManager.js @@ -9,6 +9,7 @@ const cleanedFiles = ['StartPos.data', 'user_map0', 'user_map1', 'user_map2', 'u const MapManager = function(options) { this.configuration = options.configuration; this.vacuum = options.vacuum; + this.events = options.events; }; MapManager.prototype.storeMap = function(name, callback) { @@ -86,6 +87,7 @@ MapManager.prototype.loadMap = function(name, callback) { } } if (data['lab_status'] === 1) { + self.events.emit("valetudo.dummycloud.lockStatus",1); setTimeout(() => self.vacuum.startCleaning(function (err, data2) { if (err) { return Promise.reject(err.toString()); diff --git a/lib/Valetudo.js b/lib/Valetudo.js index ce85d8f1..47ec7047 100644 --- a/lib/Valetudo.js +++ b/lib/Valetudo.js @@ -48,7 +48,8 @@ const Valetudo = function() { this.mapManager = new MapManager({ configuration: this.configuration, - vacuum: this.vacuum + vacuum: this.vacuum, + events: this.events }); this.cronScheduler = new CronScheduler({ diff --git a/lib/miio/Dummycloud.js b/lib/miio/Dummycloud.js index 08866fc5..f9feb00f 100644 --- a/lib/miio/Dummycloud.js +++ b/lib/miio/Dummycloud.js @@ -33,6 +33,7 @@ const Dummycloud = function (options) { this.socket.bind(8053, this.bindIP); this.lastMapPoll = new Date(0); + this.statusLocked = false; this.connectedRobot = { port: 1, @@ -100,14 +101,11 @@ const Dummycloud = function (options) { }; break; case "props": - Object.assign(this.connectedRobot.status, decodedResponse.msg.params); - this.events.emit("miio.status", this.connectedRobot.status); - + this.updateState(decodedResponse.msg.params); responseJSON = { id: decodedResponse.msg.id, result:"ok" }; - break; case "event.status": if( @@ -115,11 +113,9 @@ const Dummycloud = function (options) { decodedResponse.msg.params[0] && decodedResponse.msg.params[0].state !== undefined ) { - Object.assign(this.connectedRobot.status, decodedResponse.msg.params[0]); this.pollMap(); - this.events.emit("miio.status", this.connectedRobot.status); + this.updateState(decodedResponse.msg.params[0]); } - responseJSON = { id: decodedResponse.msg.id, result:"ok" @@ -248,8 +244,7 @@ const Dummycloud = function (options) { } break; case Dummycloud.SERVER_REQUESTS.STATUS: - Object.assign(this.connectedRobot.status, decodedResponse.msg.result[0]); - this.events.emit("miio.status", this.connectedRobot.status); + this.updateState(decodedResponse.msg.result[0]); break; case Dummycloud.SERVER_REQUESTS.UPDATE: console.log(new Date(), "update request response: ", decodedResponse.msg.result); @@ -282,6 +277,18 @@ const Dummycloud = function (options) { this.events.on("valetudo.dummycloud.sendUpdateRequest", (params) => { this.sendUpdateRequest(params); }); + + this.events.on("valetudo.dummycloud.lockStatus", (params) => { + this.statusLocked = true; + setTimeout(() => this.statusLocked = false, 5e3); + }); +}; + +Dummycloud.prototype.updateState = function(state) { + if (!this.statusLocked) { + Object.assign(this.connectedRobot.status, state); + this.events.emit("miio.status", this.connectedRobot.status); + } }; Dummycloud.prototype.pollMap = function(forced) {//200ms is theoretically possible From e51ecdf3ad39c8ecc07033fe0773bdcce995dd11 Mon Sep 17 00:00:00 2001 From: Erinome Date: Sun, 19 Apr 2020 23:25:08 +0300 Subject: [PATCH 003/172] use better way to restore maps on 2008 fw --- lib/MapManager.js | 36 ++++++++++++++++++++++++++---------- lib/miio/Vacuum.js | 14 +++++++++++++- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/lib/MapManager.js b/lib/MapManager.js index 01db571d..80e1d918 100644 --- a/lib/MapManager.js +++ b/lib/MapManager.js @@ -67,15 +67,24 @@ MapManager.prototype.loadMap = function(name, callback) { if (requiredFiles.some(file => !fs.existsSync("/mnt/data/valetudo/maps/" + name + "/" + file))) { throw "required files at slot '"+name+"' missing"; } - optionalFiles.concat(cleanedFiles).forEach(file => { - if (fs.existsSync("/mnt/data/rockrobo/" + file)) fs.unlinkSync("/mnt/data/rockrobo/" + file); - }); - requiredFiles.concat(optionalFiles).forEach(file => { - if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/" + file)) fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/" + file, "/mnt/data/rockrobo/" + file); - }); - fs.copyFileSync("/mnt/data/rockrobo/last_map", "/mnt/data/rockrobo/user_map0"); // for a single backup - if (fs.existsSync("/mnt/data/rockrobo/PersistData_1.data")) { - fs.copyFileSync("/mnt/data/rockrobo/PersistData_1.data", "/mnt/data/rockrobo/PersistData_2.data"); + if (data['lab_status'] === 1 && data['msg_ver'] === 3) { // for 2008+ fw + fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/last_map", "/mnt/data/rockrobo/user_map2"); + if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/PersistData_1.data")) { + fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/PersistData_1.data", "/mnt/data/rockrobo/PersistData_4.data"); + } else if (fs.existsSync("/mnt/data/rockrobo/PersistData_4.data")) { + fs.unlinkSync("/mnt/data/rockrobo/PersistData_4.data"); + } + } else { + optionalFiles.concat(cleanedFiles).forEach(file => { + if (fs.existsSync("/mnt/data/rockrobo/" + file)) fs.unlinkSync("/mnt/data/rockrobo/" + file); + }); + requiredFiles.concat(optionalFiles).forEach(file => { + if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/" + file)) fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/" + file, "/mnt/data/rockrobo/" + file); + }); + fs.copyFileSync("/mnt/data/rockrobo/last_map", "/mnt/data/rockrobo/user_map0"); // for a single backup + if (fs.existsSync("/mnt/data/rockrobo/PersistData_1.data")) { + fs.copyFileSync("/mnt/data/rockrobo/PersistData_1.data", "/mnt/data/rockrobo/PersistData_2.data"); + } } if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/valetudo.json")) { const loadedOpts = JSON.parse(fs.readFileSync("/mnt/data/valetudo/maps/" + name + "/valetudo.json", "utf8")); @@ -86,7 +95,14 @@ MapManager.prototype.loadMap = function(name, callback) { this.configuration.set("spots",loadedOpts.spots); } } - if (data['lab_status'] === 1) { + if (data['lab_status'] === 1 && data['msg_ver'] === 3) { + self.vacuum.recoverMap(2,function (err, data2) { + if (err) { + return Promise.reject(err.toString()); + } + callback(null, "ok"); + }); + } else if (data['lab_status'] === 1) { self.events.emit("valetudo.dummycloud.lockStatus",1); setTimeout(() => self.vacuum.startCleaning(function (err, data2) { if (err) { diff --git a/lib/miio/Vacuum.js b/lib/miio/Vacuum.js index 617ca9b4..7a290746 100644 --- a/lib/miio/Vacuum.js +++ b/lib/miio/Vacuum.js @@ -622,11 +622,23 @@ Vacuum.prototype.resetMap = function(callback) { this.sendMessage("reset_map", [], {}, callback); }; +/** + * Recovers map by id + * @param {number} id + * @param {(err: Error, res: any) => {}} callback + */ +Vacuum.prototype.recoverMap = function(id, callback) { + this.sendMessage("recover_map", [parseInt(id)], {timeout: 2000}, (err) => { + this.events.emit("valetudo.dummycloud.pollmap"); + callback(err); + }); +}; + /* Some words on coordinates for goTo and startCleaningZone: Coordinates are in mm and need to be in raw and unflipped format. */ Vacuum.prototype.goTo = function(x_coord, y_coord, callback) { - this.sendMessage("app_goto_target", [x_coord, 51200 - y_coord], {}, callback) + this.sendMessage("app_goto_target", [x_coord, Tools.DIMENSION_MM - y_coord], {}, callback) }; /* zones is an array of areas to clean: [[x1, y1, x2, y2, iterations],..] */ From e0caf2d0158e66619fd4b1610cf846d2f09d1404 Mon Sep 17 00:00:00 2001 From: Erinome Date: Sun, 19 Apr 2020 23:26:56 +0300 Subject: [PATCH 004/172] attempt to save map viewport closes #211 --- client/zone/js-modules/fallback-map.js | 4 +-- client/zone/js-modules/rr-map-parser.js | 10 ++++++ client/zone/js-modules/vacuum-map.js | 41 ++++++++++++++++--------- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/client/zone/js-modules/fallback-map.js b/client/zone/js-modules/fallback-map.js index 21d36b49..96318795 100644 --- a/client/zone/js-modules/fallback-map.js +++ b/client/zone/js-modules/fallback-map.js @@ -1,6 +1,6 @@ export function FallbackMap() {}; -// in this old format is requires less space. todo: pack it into binary maybe? -FallbackMap.oldData = {"map_index":0,"map_sequence":0,"image":{"position":{"top":0,"left":0},"dimensions":{"height":1024,"width":1024},"segments":{"count":0,"center":{},"borders":[],"neighbours":{}},"pixels":{"floor":[528892,527868,526844,525820,524796,523772,522748,521724,520700,519676,518652,517628,516604,515580,514556,513532,512508,511484,510460,509436,508412,507388,506364,505340,504316,503292,502268,501244,500220,499196,498172,497148,496124,528893,527869,526845,525821,524797,523773,522749,521725,520701,519677,518653,517629,516605,515581,514557,513533,512509,511485,510461,509437,508413,507389,506365,505341,504317,503293,502269,501245,500221,499197,498173,497149,496125,528894,527870,526846,525822,524798,523774,522750,521726,520702,519678,518654,517630,516606,515582,514558,513534,512510,511486,510462,509438,508414,507390,506366,505342,504318,503294,502270,501246,500222,499198,498174,497150,496126,528895,527871,526847,525823,524799,523775,522751,521727,520703,519679,518655,517631,516607,515583,514559,513535,512511,511487,510463,509439,508415,507391,506367,505343,504319,503295,502271,501247,500223,499199,498175,497151,496127,528896,527872,526848,525824,524800,523776,522752,521728,520704,519680,518656,517632,516608,515584,514560,513536,512512,511488,510464,509440,508416,507392,506368,505344,504320,503296,502272,501248,500224,499200,498176,497152,496128,528897,527873,526849,525825,524801,523777,522753,521729,520705,519681,518657,517633,516609,515585,514561,513537,512513,511489,510465,509441,508417,507393,506369,505345,504321,503297,502273,501249,500225,499201,498177,497153,496129,528898,527874,526850,525826,524802,523778,522754,521730,520706,519682,518658,517634,516610,515586,514562,513538,512514,511490,510466,509442,508418,507394,506370,505346,504322,503298,502274,501250,500226,499202,498178,497154,496130,528899,527875,526851,525827,524803,523779,522755,521731,520707,519683,518659,517635,516611,515587,514563,513539,512515,511491,510467,509443,508419,507395,506371,505347,504323,503299,502275,501251,500227,499203,498179,497155,496131,528900,527876,526852,525828,524804,523780,522756,521732,520708,519684,518660,517636,516612,515588,514564,513540,512516,511492,510468,509444,508420,507396,506372,505348,504324,503300,502276,501252,500228,499204,498180,497156,496132,528901,527877,526853,525829,524805,523781,522757,521733,520709,519685,518661,517637,516613,515589,514565,513541,512517,511493,510469,509445,508421,507397,506373,505349,504325,503301,502277,501253,500229,499205,498181,497157,496133,528902,527878,526854,525830,524806,523782,522758,521734,520710,519686,518662,517638,516614,515590,514566,513542,512518,511494,510470,509446,508422,507398,506374,505350,504326,503302,502278,501254,500230,499206,498182,497158,496134,528903,527879,526855,525831,524807,523783,522759,521735,520711,519687,518663,517639,516615,515591,514567,513543,512519,511495,510471,509447,508423,507399,506375,505351,504327,503303,502279,501255,500231,499207,498183,497159,496135,528904,527880,526856,525832,524808,523784,522760,521736,520712,519688,518664,517640,516616,515592,514568,513544,512520,511496,510472,509448,508424,507400,506376,505352,504328,503304,502280,501256,500232,499208,498184,497160,496136,528905,527881,526857,525833,524809,523785,522761,521737,520713,519689,518665,517641,516617,515593,514569,513545,512521,511497,510473,509449,508425,507401,506377,505353,504329,503305,502281,501257,500233,499209,498185,497161,496137,528906,527882,526858,525834,524810,523786,522762,521738,520714,519690,518666,517642,516618,515594,514570,513546,512522,511498,510474,509450,508426,507402,506378,505354,504330,503306,502282,501258,500234,499210,498186,497162,496138,528907,527883,526859,525835,524811,523787,522763,521739,520715,519691,518667,517643,516619,515595,514571,513547,512523,511499,510475,509451,508427,507403,506379,505355,504331,503307,502283,501259,500235,499211,498187,497163,496139,528908,527884,526860,525836,524812,523788,522764,521740,520716,519692,518668,517644,516620,515596,514572,513548,512524,511500,510476,509452,508428,507404,506380,505356,504332,503308,502284,501260,500236,499212,498188,497164,496140,528909,527885,526861,525837,524813,523789,522765,521741,520717,519693,518669,517645,516621,515597,514573,513549,512525,511501,510477,509453,508429,507405,506381,505357,504333,503309,502285,501261,500237,499213,498189,497165,496141,528910,527886,526862,525838,524814,523790,522766,521742,520718,519694,518670,517646,516622,515598,514574,513550,512526,511502,510478,509454,508430,507406,506382,505358,504334,503310,502286,501262,500238,499214,498190,497166,496142,528911,527887,526863,525839,524815,523791,522767,521743,520719,519695,518671,517647,516623,515599,514575,513551,512527,511503,510479,509455,508431,507407,506383,505359,504335,503311,502287,501263,500239,499215,498191,497167,496143,528912,527888,526864,525840,524816,523792,522768,521744,520720,519696,518672,517648,516624,515600,514576,513552,512528,511504,510480,509456,508432,507408,506384,505360,504336,503312,502288,501264,500240,499216,498192,497168,496144,528913,527889,526865,525841,524817,523793,522769,521745,520721,519697,518673,517649,516625,515601,514577,513553,512529,511505,510481,509457,508433,507409,506385,505361,504337,503313,502289,501265,500241,499217,498193,497169,496145,528914,527890,526866,525842,524818,523794,522770,521746,520722,519698,518674,517650,516626,515602,514578,513554,512530,511506,510482,509458,508434,507410,506386,505362,504338,503314,502290,501266,500242,499218,498194,497170,496146,528915,527891,526867,525843,524819,523795,522771,521747,520723,519699,518675,517651,516627,515603,514579,513555,512531,511507,510483,509459,508435,507411,506387,505363,504339,503315,502291,501267,500243,499219,498195,497171,496147,528916,527892,526868,525844,524820,523796,522772,521748,520724,519700,518676,517652,516628,515604,514580,513556,512532,511508,510484,509460,508436,507412,506388,505364,504340,503316,502292,501268,500244,499220,498196,497172,496148,528917,527893,526869,525845,524821,523797,522773,521749,520725,519701,518677,517653,516629,515605,514581,513557,512533,511509,510485,509461,508437,507413,506389,505365,504341,503317,502293,501269,500245,499221,498197,497173,496149,528918,527894,526870,525846,524822,523798,522774,521750,520726,519702,518678,517654,516630,515606,514582,513558,512534,511510,510486,509462,508438,507414,506390,505366,504342,503318,502294,501270,500246,499222,498198,497174,496150,528919,527895,526871,525847,524823,523799,522775,521751,520727,519703,518679,517655,516631,515607,514583,513559,512535,511511,510487,509463,508439,507415,506391,505367,504343,503319,502295,501271,500247,499223,498199,497175,496151,528920,527896,526872,525848,524824,523800,522776,521752,520728,519704,518680,517656,516632,515608,514584,513560,512536,511512,510488,509464,508440,507416,506392,505368,504344,503320,502296,501272,500248,499224,498200,497176,496152,528921,527897,526873,525849,524825,523801,522777,521753,520729,519705,518681,517657,516633,515609,514585,513561,512537,511513,510489,509465,508441,507417,506393,505369,504345,503321,502297,501273,500249,499225,498201,497177,496153,528922,527898,526874,525850,524826,523802,522778,521754,520730,519706,518682,517658,516634,515610,514586,513562,512538,511514,510490,509466,508442,507418,506394,505370,504346,503322,502298,501274,500250,499226,498202,497178,496154,528923,527899,526875,525851,524827,523803,522779,521755,520731,519707,518683,517659,516635,515611,514587,513563,512539,511515,510491,509467,508443,507419,506395,505371,504347,503323,502299,501275,500251,499227,498203,497179,496155,528924,527900,526876,525852,524828,523804,522780,521756,520732,519708,518684,517660,516636,515612,514588,513564,512540,511516,510492,509468,508444,507420,506396,505372,504348,503324,502300,501276,500252,499228,498204,497180,496156,528925,527901,526877,525853,524829,523805,522781,521757,520733,519709,518685,517661,516637,515613,514589,513565,512541,511517,510493,509469,508445,507421,506397,505373,504349,503325,502301,501277,500253,499229,498205,497181,496157,528926,527902,526878,525854,524830,523806,522782,521758,520734,519710,518686,517662,516638,515614,514590,513566,512542,511518,510494,509470,508446,507422,506398,505374,504350,503326,502302,501278,500254,499230,498206,497182,496158,528927,527903,526879,525855,524831,523807,522783,521759,520735,519711,518687,517663,516639,515615,514591,513567,512543,511519,510495,509471,508447,507423,506399,505375,504351,503327,502303,501279,500255,499231,498207,497183,496159,528928,527904,526880,525856,524832,523808,522784,521760,520736,519712,518688,517664,516640,515616,514592,513568,512544,511520,510496,509472,508448,507424,506400,505376,504352,503328,502304,501280,500256,499232,498208,497184,496160,528929,527905,526881,525857,524833,523809,522785,521761,520737,519713,518689,517665,516641,515617,514593,513569,512545,511521,510497,509473,508449,507425,506401,505377,504353,503329,502305,501281,500257,499233,498209,497185,496161,528930,527906,526882,525858,524834,523810,522786,521762,520738,519714,518690,517666,516642,515618,514594,513570,512546,511522,510498,509474,508450,507426,506402,505378,504354,503330,502306,501282,500258,499234,498210,497186,496162,528931,527907,526883,525859,524835,523811,522787,521763,520739,519715,518691,517667,516643,515619,514595,513571,512547,511523,510499,509475,508451,507427,506403,505379,504355,503331,502307,501283,500259,499235,498211,497187,496163,528932,527908,526884,525860,524836,523812,522788,521764,520740,519716,518692,517668,516644,515620,514596,513572,512548,511524,510500,509476,508452,507428,506404,505380,504356,503332,502308,501284,500260,499236,498212,497188,496164,528933,527909,526885,525861,524837,523813,522789,521765,520741,519717,518693,517669,516645,515621,514597,513573,512549,511525,510501,509477,508453,507429,506405,505381,504357,503333,502309,501285,500261,499237,498213,497189,496165,528934,527910,526886,525862,524838,523814,522790,521766,520742,519718,518694,517670,516646,515622,514598,513574,512550,511526,510502,509478,508454,507430,506406,505382,504358,503334,502310,501286,500262,499238,498214,497190,496166,528935,527911,526887,525863,524839,523815,522791,521767,520743,519719,518695,517671,516647,515623,514599,513575,512551,511527,510503,509479,508455,507431,506407,505383,504359,503335,502311,501287,500263,499239,498215,497191,496167,528936,527912,526888,525864,524840,523816,522792,521768,520744,519720,518696,517672,516648,515624,514600,513576,512552,511528,510504,509480,508456,507432,506408,505384,504360,503336,502312,501288,500264,499240,498216,497192,496168,528937,527913,526889,525865,524841,523817,522793,521769,520745,519721,518697,517673,516649,515625,514601,513577,512553,511529,510505,509481,508457,507433,506409,505385,504361,503337,502313,501289,500265,499241,498217,497193,496169,528938,527914,526890,525866,524842,523818,522794,521770,520746,519722,518698,517674,516650,515626,514602,513578,512554,511530,510506,509482,508458,507434,506410,505386,504362,503338,502314,501290,500266,499242,498218,497194,496170,528939,527915,526891,525867,524843,523819,522795,521771,520747,519723,518699,517675,516651,515627,514603,513579,512555,511531,510507,509483,508459,507435,506411,505387,504363,503339,502315,501291,500267,499243,498219,497195,496171,528940,527916,526892,525868,524844,523820,522796,521772,520748,519724,518700,517676,516652,515628,514604,513580,512556,511532,510508,509484,508460,507436,506412,505388,504364,503340,502316,501292,500268,499244,498220,497196,496172,528941,527917,526893,525869,524845,523821,522797,521773,520749,519725,518701,517677,516653,515629,514605,513581,512557,511533,510509,509485,508461,507437,506413,505389,504365,503341,502317,501293,500269,499245,498221,497197,496173,528942,527918,526894,525870,524846,523822,522798,521774,520750,519726,518702,517678,516654,515630,514606,513582,512558,511534,510510,509486,508462,507438,506414,505390,504366,503342,502318,501294,500270,499246,498222,497198,496174,528943,527919,526895,525871,524847,523823,522799,521775,520751,519727,518703,517679,516655,515631,514607,513583,512559,511535,510511,509487,508463,507439,506415,505391,504367,503343,502319,501295,500271,499247,498223,497199,496175,528944,527920,526896,525872,524848,523824,522800,521776,520752,519728,518704,517680,516656,515632,514608,513584,512560,511536,510512,509488,508464,507440,506416,505392,504368,503344,502320,501296,500272,499248,498224,497200,496176,528945,527921,526897,525873,524849,523825,522801,521777,520753,519729,518705,517681,516657,515633,514609,513585,512561,511537,510513,509489,508465,507441,506417,505393,504369,503345,502321,501297,500273,499249,498225,497201,496177,528946,527922,526898,525874,524850,523826,522802,521778,520754,519730,518706,517682,516658,515634,514610,513586,512562,511538,510514,509490,508466,507442,506418,505394,504370,503346,502322,501298,500274,499250,498226,497202,496178,528947,527923,526899,525875,524851,523827,522803,521779,520755,519731,518707,517683,516659,515635,514611,513587,512563,511539,510515,509491,508467,507443,506419,505395,504371,503347,502323,501299,500275,499251,498227,497203,496179,528948,527924,526900,525876,524852,523828,522804,521780,520756,519732,518708,517684,516660,515636,514612,513588,512564,511540,510516,509492,508468,507444,506420,505396,504372,503348,502324,501300,500276,499252,498228,497204,496180,528949,527925,526901,525877,524853,523829,522805,521781,520757,519733,518709,517685,516661,515637,514613,513589,512565,511541,510517,509493,508469,507445,506421,505397,504373,503349,502325,501301,500277,499253,498229,497205,496181,528950,527926,526902,525878,524854,523830,522806,521782,520758,519734,518710,517686,516662,515638,514614,513590,512566,511542,510518,509494,508470,507446,506422,505398,504374,503350,502326,501302,500278,499254,498230,497206,496182,528951,527927,526903,525879,524855,523831,522807,521783,520759,519735,518711,517687,516663,515639,514615,513591,512567,511543,510519,509495,508471,507447,506423,505399,504375,503351,502327,501303,500279,499255,498231,497207,496183,528952,527928,526904,525880,524856,523832,522808,521784,520760,519736,518712,517688,516664,515640,514616,513592,512568,511544,510520,509496,508472,507448,506424,505400,504376,503352,502328,501304,500280,499256,498232,497208,496184,528953,527929,526905,525881,524857,523833,522809,521785,520761,519737,518713,517689,516665,515641,514617,513593,512569,511545,510521,509497,508473,507449,506425,505401,504377,503353,502329,501305,500281,499257,498233,497209,496185,528954,527930,526906,525882,524858,523834,522810,521786,520762,519738,518714,517690,516666,515642,514618,513594,512570,511546,510522,509498,508474,507450,506426,505402,504378,503354,502330,501306,500282,499258,498234,497210,496186,528955,527931,526907,525883,524859,523835,522811,521787,520763,519739,518715,517691,516667,515643,514619,513595,512571,511547,510523,509499,508475,507451,506427,505403,504379,503355,502331,501307,500283,499259,498235,497211,496187,528956,527932,526908,525884,524860,523836,522812,521788,520764,519740,518716,517692,516668,515644,514620,513596,512572,511548,510524,509500,508476,507452,506428,505404,504380,503356,502332,501308,500284,499260,498236,497212,496188,528957,527933,526909,525885,524861,523837,522813,521789,520765,519741,518717,517693,516669,515645,514621,513597,512573,511549,510525,509501,508477,507453,506429,505405,504381,503357,502333,501309,500285,499261,498237,497213,496189,528958,527934,526910,525886,524862,523838,522814,521790,520766,519742,518718,517694,516670,515646,514622,513598,512574,511550,510526,509502,508478,507454,506430,505406,504382,503358,502334,501310,500286,499262,498238,497214,496190,528959,527935,526911,525887,524863,523839,522815,521791,520767,519743,518719,517695,516671,515647,514623,513599,512575,511551,510527,509503,508479,507455,506431,505407,504383,503359,502335,501311,500287,499263,498239,497215,496191,528960,527936,526912,525888,524864,523840,522816,521792,520768,519744,518720,517696,516672,515648,514624,513600,512576,511552,510528,509504,508480,507456,506432,505408,504384,503360,502336,501312,500288,499264,498240,497216,496192,528961,527937,526913,525889,524865,523841,522817,521793,520769,519745,518721,517697,516673,515649,514625,513601,512577,511553,510529,509505,508481,507457,506433,505409,504385,503361,502337,501313,500289,499265,498241,497217,496193,528962,527938,526914,525890,524866,523842,522818,521794,520770,519746,518722,517698,516674,515650,514626,513602,512578,511554,510530,509506,508482,507458,506434,505410,504386,503362,502338,501314,500290,499266,498242,497218,496194,528963,527939,526915,525891,524867,523843,522819,521795,520771,519747,518723,517699,516675,515651,514627,513603,512579,511555,510531,509507,508483,507459,506435,505411,504387,503363,502339,501315,500291,499267,498243,497219,496195,528964,527940,526916,525892,524868,523844,522820,521796,520772,519748,518724,517700,516676,515652,514628,513604,512580,511556,510532,509508,508484,507460,506436,505412,504388,503364,502340,501316,500292,499268,498244,497220,496196,528965,527941,526917,525893,524869,523845,522821,521797,520773,519749,518725,517701,516677,515653,514629,513605,512581,511557,510533,509509,508485,507461,506437,505413,504389,503365,502341,501317,500293,499269,498245,497221,496197,528966,527942,526918,525894,524870,523846,522822,521798,520774,519750,518726,517702,516678,515654,514630,513606,512582,511558,510534,509510,508486,507462,506438,505414,504390,503366,502342,501318,500294,499270,498246,497222,496198,528967,527943,526919,525895,524871,523847,522823,521799,520775,519751,518727,517703,516679,515655,514631,513607,512583,511559,510535,509511,508487,507463,506439,505415,504391,503367,502343,501319,500295,499271,498247,497223,496199,528968,527944,526920,525896,524872,523848,522824,521800,520776,519752,518728,517704,516680,515656,514632,513608,512584,511560,510536,509512,508488,507464,506440,505416,504392,503368,502344,501320,500296,499272,498248,497224,496200,528969,527945,526921,525897,524873,523849,522825,521801,520777,519753,518729,517705,516681,515657,514633,513609,512585,511561,510537,509513,508489,507465,506441,505417,504393,503369,502345,501321,500297,499273,498249,497225,496201,528970,527946,526922,525898,524874,523850,522826,521802,520778,519754,518730,517706,516682,515658,514634,513610,512586,511562,510538,509514,508490,507466,506442,505418,504394,503370,502346,501322,500298,499274,498250,497226,496202,528971,527947,526923,525899,524875,523851,522827,521803,520779,519755,518731,517707,516683,515659,514635,513611,512587,511563,510539,509515,508491,507467,506443,505419,504395,503371,502347,501323,500299,499275,498251,497227,496203,528972,527948,526924,525900,524876,523852,522828,521804,520780,519756,518732,517708,516684,515660,514636,513612,512588,511564,510540,509516,508492,507468,506444,505420,504396,503372,502348,501324,500300,499276,498252,497228,496204,528973,527949,526925,525901,524877,523853,522829,521805,520781,519757,518733,517709,516685,515661,514637,513613,512589,511565,510541,509517,508493,507469,506445,505421,504397,503373,502349,501325,500301,499277,498253,497229,496205,528974,527950,526926,525902,524878,523854,522830,521806,520782,519758,518734,517710,516686,515662,514638,513614,512590,511566,510542,509518,508494,507470,506446,505422,504398,503374,502350,501326,500302,499278,498254,497230,496206,528975,527951,526927,525903,524879,523855,522831,521807,520783,519759,518735,517711,516687,515663,514639,513615,512591,511567,510543,509519,508495,507471,506447,505423,504399,503375,502351,501327,500303,499279,498255,497231,496207,528976,527952,526928,525904,524880,523856,522832,521808,520784,519760,518736,517712,516688,515664,514640,513616,512592,511568,510544,509520,508496,507472,506448,505424,504400,503376,502352,501328,500304,499280,498256,497232,496208,528977,527953,526929,525905,524881,523857,522833,521809,520785,519761,518737,517713,516689,515665,514641,513617,512593,511569,510545,509521,508497,507473,506449,505425,504401,503377,502353,501329,500305,499281,498257,497233,496209,528978,527954,526930,525906,524882,523858,522834,521810,520786,519762,518738,517714,516690,515666,514642,513618,512594,511570,510546,509522,508498,507474,506450,505426,504402,503378,502354,501330,500306,499282,498258,497234,496210,528979,527955,526931,525907,524883,523859,522835,521811,520787,519763,518739,517715,516691,515667,514643,513619,512595,511571,510547,509523,508499,507475,506451,505427,504403,503379,502355,501331,500307,499283,498259,497235,496211,528980,527956,526932,525908,524884,523860,522836,521812,520788,519764,518740,517716,516692,515668,514644,513620,512596,511572,510548,509524,508500,507476,506452,505428,504404,503380,502356,501332,500308,499284,498260,497236,496212,528981,527957,526933,525909,524885,523861,522837,521813,520789,519765,518741,517717,516693,515669,514645,513621,512597,511573,510549,509525,508501,507477,506453,505429,504405,503381,502357,501333,500309,499285,498261,497237,496213,528982,527958,526934,525910,524886,523862,522838,521814,520790,519766,518742,517718,516694,515670,514646,513622,512598,511574,510550,509526,508502,507478,506454,505430,504406,503382,502358,501334,500310,499286,498262,497238,496214,528983,527959,526935,525911,524887,523863,522839,521815,520791,519767,518743,517719,516695,515671,514647,513623,512599,511575,510551,509527,508503,507479,506455,505431,504407,503383,502359,501335,500311,499287,498263,497239,496215,528984,527960,526936,525912,524888,523864,522840,521816,520792,519768,518744,517720,516696,515672,514648,513624,512600,511576,510552,509528,508504,507480,506456,505432,504408,503384,502360,501336,500312,499288,498264,497240,496216,528985,527961,526937,525913,524889,523865,522841,521817,520793,519769,518745,517721,516697,515673,514649,513625,512601,511577,510553,509529,508505,507481,506457,505433,504409,503385,502361,501337,500313,499289,498265,497241,496217,528986,527962,526938,525914,524890,523866,522842,521818,520794,519770,518746,517722,516698,515674,514650,513626,512602,511578,510554,509530,508506,507482,506458,505434,504410,503386,502362,501338,500314,499290,498266,497242,496218,528987,527963,526939,525915,524891,523867,522843,521819,520795,519771,518747,517723,516699,515675,514651,513627,512603,511579,510555,509531,508507,507483,506459,505435,504411,503387,502363,501339,500315,499291,498267,497243,496219,528988,527964,526940,525916,524892,523868,522844,521820,520796,519772,518748,517724,516700,515676,514652,513628,512604,511580,510556,509532,508508,507484,506460,505436,504412,503388,502364,501340,500316,499292,498268,497244,496220,528989,527965,526941,525917,524893,523869,522845,521821,520797,519773,518749,517725,516701,515677,514653,513629,512605,511581,510557,509533,508509,507485,506461,505437,504413,503389,502365,501341,500317,499293,498269,497245,496221,528990,527966,526942,525918,524894,523870,522846,521822,520798,519774,518750,517726,516702,515678,514654,513630,512606,511582,510558,509534,508510,507486,506462,505438,504414,503390,502366,501342,500318,499294,498270,497246,496222,528991,527967,526943,525919,524895,523871,522847,521823,520799,519775,518751,517727,516703,515679,514655,513631,512607,511583,510559,509535,508511,507487,506463,505439,504415,503391,502367,501343,500319,499295,498271,497247,496223,528992,527968,526944,525920,524896,523872,522848,521824,520800,519776,518752,517728,516704,515680,514656,513632,512608,511584,510560,509536,508512,507488,506464,505440,504416,503392,502368,501344,500320,499296,498272,497248,496224,528993,527969,526945,525921,524897,523873,522849,521825,520801,519777,518753,517729,516705,515681,514657,513633,512609,511585,510561,509537,508513,507489,506465,505441,504417,503393,502369,501345,500321,499297,498273,497249,496225,528994,527970,526946,525922,524898,523874,522850,521826,520802,519778,518754,517730,516706,515682,514658,513634,512610,511586,510562,509538,508514,507490,506466,505442,504418,503394,502370,501346,500322,499298,498274,497250,496226,528995,527971,526947,525923,524899,523875,522851,521827,520803,519779,518755,517731,516707,515683,514659,513635,512611,511587,510563,509539,508515,507491,506467,505443,504419,503395,502371,501347,500323,499299,498275,497251,496227,528996,527972,526948,525924,524900,523876,522852,521828,520804,519780,518756,517732,516708,515684,514660,513636,512612,511588,510564,509540,508516,507492,506468,505444,504420,503396,502372,501348,500324,499300,498276,497252,496228,528997,527973,526949,525925,524901,523877,522853,521829,520805,519781,518757,517733,516709,515685,514661,513637,512613,511589,510565,509541,508517,507493,506469,505445,504421,503397,502373,501349,500325,499301,498277,497253,496229,528998,527974,526950,525926,524902,523878,522854,521830,520806,519782,518758,517734,516710,515686,514662,513638,512614,511590,510566,509542,508518,507494,506470,505446,504422,503398,502374,501350,500326,499302,498278,497254,496230,528999,527975,526951,525927,524903,523879,522855,521831,520807,519783,518759,517735,516711,515687,514663,513639,512615,511591,510567,509543,508519,507495,506471,505447,504423,503399,502375,501351,500327,499303,498279,497255,496231,529000,527976,526952,525928,524904,523880,522856,521832,520808,519784,518760,517736,516712,515688,514664,513640,512616,511592,510568,509544,508520,507496,506472,505448,504424,503400,502376,501352,500328,499304,498280,497256,496232,529001,527977,526953,525929,524905,523881,522857,521833,520809,519785,518761,517737,516713,515689,514665,513641,512617,511593,510569,509545,508521,507497,506473,505449,504425,503401,502377,501353,500329,499305,498281,497257,496233,529002,527978,526954,525930,524906,523882,522858,521834,520810,519786,518762,517738,516714,515690,514666,513642,512618,511594,510570,509546,508522,507498,506474,505450,504426,503402,502378,501354,500330,499306,498282,497258,496234,529003,527979,526955,525931,524907,523883,522859,521835,520811,519787,518763,517739,516715,515691,514667,513643,512619,511595,510571,509547,508523,507499,506475,505451,504427,503403,502379,501355,500331,499307,498283,497259,496235,529004,527980,526956,525932,524908,523884,522860,521836,520812,519788,518764,517740,516716,515692,514668,513644,512620,511596,510572,509548,508524,507500,506476,505452,504428,503404,502380,501356,500332,499308,498284,497260,496236,529005,527981,526957,525933,524909,523885,522861,521837,520813,519789,518765,517741,516717,515693,514669,513645,512621,511597,510573,509549,508525,507501,506477,505453,504429,503405,502381,501357,500333,499309,498285,497261,496237,529006,527982,526958,525934,524910,523886,522862,521838,520814,519790,518766,517742,516718,515694,514670,513646,512622,511598,510574,509550,508526,507502,506478,505454,504430,503406,502382,501358,500334,499310,498286,497262,496238,529007,527983,526959,525935,524911,523887,522863,521839,520815,519791,518767,517743,516719,515695,514671,513647,512623,511599,510575,509551,508527,507503,506479,505455,504431,503407,502383,501359,500335,499311,498287,497263,496239,529008,527984,526960,525936,524912,523888,522864,521840,520816,519792,518768,517744,516720,515696,514672,513648,512624,511600,510576,509552,508528,507504,506480,505456,504432,503408,502384,501360,500336,499312,498288,497264,496240,529009,527985,526961,525937,524913,523889,522865,521841,520817,519793,518769,517745,516721,515697,514673,513649,512625,511601,510577,509553,508529,507505,506481,505457,504433,503409,502385,501361,500337,499313,498289,497265,496241,529010,527986,526962,525938,524914,523890,522866,521842,520818,519794,518770,517746,516722,515698,514674,513650,512626,511602,510578,509554,508530,507506,506482,505458,504434,503410,502386,501362,500338,499314,498290,497266,496242,529011,527987,526963,525939,524915,523891,522867,521843,520819,519795,518771,517747,516723,515699,514675,513651,512627,511603,510579,509555,508531,507507,506483,505459,504435,503411,502387,501363,500339,499315,498291,497267,496243,529012,527988,526964,525940,524916,523892,522868,521844,520820,519796,518772,517748,516724,515700,514676,513652,512628,511604,510580,509556,508532,507508,506484,505460,504436,503412,502388,501364,500340,499316,498292,497268,496244,529013,527989,526965,525941,524917,523893,522869,521845,520821,519797,518773,517749,516725,515701,514677,513653,512629,511605,510581,509557,508533,507509,506485,505461,504437,503413,502389,501365,500341,499317,498293,497269,496245,529014,527990,526966,525942,524918,523894,522870,521846,520822,519798,518774,517750,516726,515702,514678,513654,512630,511606,510582,509558,508534,507510,506486,505462,504438,503414,502390,501366,500342,499318,498294,497270,496246,529015,527991,526967,525943,524919,523895,522871,521847,520823,519799,518775,517751,516727,515703,514679,513655,512631,511607,510583,509559,508535,507511,506487,505463,504439,503415,502391,501367,500343,499319,498295,497271,496247,529016,527992,526968,525944,524920,523896,522872,521848,520824,519800,518776,517752,516728,515704,514680,513656,512632,511608,510584,509560,508536,507512,506488,505464,504440,503416,502392,501368,500344,499320,498296,497272,496248,529017,527993,526969,525945,524921,523897,522873,521849,520825,519801,518777,517753,516729,515705,514681,513657,512633,511609,510585,509561,508537,507513,506489,505465,504441,503417,502393,501369,500345,499321,498297,497273,496249,529018,527994,526970,525946,524922,523898,522874,521850,520826,519802,518778,517754,516730,515706,514682,513658,512634,511610,510586,509562,508538,507514,506490,505466,504442,503418,502394,501370,500346,499322,498298,497274,496250,529019,527995,526971,525947,524923,523899,522875,521851,520827,519803,518779,517755,516731,515707,514683,513659,512635,511611,510587,509563,508539,507515,506491,505467,504443,503419,502395,501371,500347,499323,498299,497275,496251,529020,527996,526972,525948,524924,523900,522876,521852,520828,519804,518780,517756,516732,515708,514684,513660,512636,511612,510588,509564,508540,507516,506492,505468,504444,503420,502396,501372,500348,499324,498300,497276,496252,529021,527997,526973,525949,524925,523901,522877,521853,520829,519805,518781,517757,516733,515709,514685,513661,512637,511613,510589,509565,508541,507517,506493,505469,504445,503421,502397,501373,500349,499325,498301,497277,496253,529022,527998,526974,525950,524926,523902,522878,521854,520830,519806,518782,517758,516734,515710,514686,513662,512638,511614,510590,509566,508542,507518,506494,505470,504446,503422,502398,501374,500350,499326,498302,497278,496254,529023,527999,526975,525951,524927,523903,522879,521855,520831,519807,518783,517759,516735,515711,514687,513663,512639,511615,510591,509567,508543,507519,506495,505471,504447,503423,502399,501375,500351,499327,498303,497279,496255,529024,528000,526976,525952,524928,523904,522880,521856,520832,519808,518784,517760,516736,515712,514688,513664,512640,511616,510592,509568,508544,507520,506496,505472,504448,503424,502400,501376,500352,499328,498304,497280,496256,529025,528001,526977,525953,524929,523905,522881,521857,520833,519809,518785,517761,516737,515713,514689,513665,512641,511617,510593,509569,508545,507521,506497,505473,504449,503425,502401,501377,500353,499329,498305,497281,496257,529026,528002,526978,525954,524930,523906,522882,521858,520834,519810,518786,517762,516738,515714,514690,513666,512642,511618,510594,509570,508546,507522,506498,505474,504450,503426,502402,501378,500354,499330,498306,497282,496258,529027,528003,526979,525955,524931,523907,522883,521859,520835,519811,518787,517763,516739,515715,514691,513667,512643,511619,510595,509571,508547,507523,506499,505475,504451,503427,502403,501379,500355,499331,498307,497283,496259,529028,528004,526980,525956,524932,523908,522884,521860,520836,519812,518788,517764,516740,515716,514692,513668,512644,511620,510596,509572,508548,507524,506500,505476,504452,503428,502404,501380,500356,499332,498308,497284,496260,529029,528005,526981,525957,524933,523909,522885,521861,520837,519813,518789,517765,516741,515717,514693,513669,512645,511621,510597,509573,508549,507525,506501,505477,504453,503429,502405,501381,500357,499333,498309,497285,496261,529030,528006,526982,525958,524934,523910,522886,521862,520838,519814,518790,517766,516742,515718,514694,513670,512646,511622,510598,509574,508550,507526,506502,505478,504454,503430,502406,501382,500358,499334,498310,497286,496262,529031,528007,526983,525959,524935,523911,522887,521863,520839,519815,518791,517767,516743,515719,514695,513671,512647,511623,510599,509575,508551,507527,506503,505479,504455,503431,502407,501383,500359,499335,498311,497287,496263,529032,528008,526984,525960,524936,523912,522888,521864,520840,519816,518792,517768,516744,515720,514696,513672,512648,511624,510600,509576,508552,507528,506504,505480,504456,503432,502408,501384,500360,499336,498312,497288,496264,529033,528009,526985,525961,524937,523913,522889,521865,520841,519817,518793,517769,516745,515721,514697,513673,512649,511625,510601,509577,508553,507529,506505,505481,504457,503433,502409,501385,500361,499337,498313,497289,496265,529034,528010,526986,525962,524938,523914,522890,521866,520842,519818,518794,517770,516746,515722,514698,513674,512650,511626,510602,509578,508554,507530,506506,505482,504458,503434,502410,501386,500362,499338,498314,497290,496266,529035,528011,526987,525963,524939,523915,522891,521867,520843,519819,518795,517771,516747,515723,514699,513675,512651,511627,510603,509579,508555,507531,506507,505483,504459,503435,502411,501387,500363,499339,498315,497291,496267,529036,528012,526988,525964,524940,523916,522892,521868,520844,519820,518796,517772,516748,515724,514700,513676,512652,511628,510604,509580,508556,507532,506508,505484,504460,503436,502412,501388,500364,499340,498316,497292,496268,529037,528013,526989,525965,524941,523917,522893,521869,520845,519821,518797,517773,516749,515725,514701,513677,512653,511629,510605,509581,508557,507533,506509,505485,504461,503437,502413,501389,500365,499341,498317,497293,496269,529038,528014,526990,525966,524942,523918,522894,521870,520846,519822,518798,517774,516750,515726,514702,513678,512654,511630,510606,509582,508558,507534,506510,505486,504462,503438,502414,501390,500366,499342,498318,497294,496270,529039,528015,526991,525967,524943,523919,522895,521871,520847,519823,518799,517775,516751,515727,514703,513679,512655,511631,510607,509583,508559,507535,506511,505487,504463,503439,502415,501391,500367,499343,498319,497295,496271,529040,528016,526992,525968,524944,523920,522896,521872,520848,519824,518800,517776,516752,515728,514704,513680,512656,511632,510608,509584,508560,507536,506512,505488,504464,503440,502416,501392,500368,499344,498320,497296,496272,529041,528017,526993,525969,524945,523921,522897,521873,520849,519825,518801,517777,516753,515729,514705,513681,512657,511633,510609,509585,508561,507537,506513,505489,504465,503441,502417,501393,500369,499345,498321,497297,496273,529042,528018,526994,525970,524946,523922,522898,521874,520850,519826,518802,517778,516754,515730,514706,513682,512658,511634,510610,509586,508562,507538,506514,505490,504466,503442,502418,501394,500370,499346,498322,497298,496274,529043,528019,526995,525971,524947,523923,522899,521875,520851,519827,518803,517779,516755,515731,514707,513683,512659,511635,510611,509587,508563,507539,506515,505491,504467,503443,502419,501395,500371,499347,498323,497299,496275,529044,528020,526996,525972,524948,523924,522900,521876,520852,519828,518804,517780,516756,515732,514708,513684,512660,511636,510612,509588,508564,507540,506516,505492,504468,503444,502420,501396,500372,499348,498324,497300,496276,529045,528021,526997,525973,524949,523925,522901,521877,520853,519829,518805,517781,516757,515733,514709,513685,512661,511637,510613,509589,508565,507541,506517,505493,504469,503445,502421,501397,500373,499349,498325,497301,496277,529046,528022,526998,525974,524950,523926,522902,521878,520854,519830,518806,517782,516758,515734,514710,513686,512662,511638,510614,509590,508566,507542,506518,505494,504470,503446,502422,501398,500374,499350,498326,497302,496278,529047,528023,526999,525975,524951,523927,522903,521879,520855,519831,518807,517783,516759,515735,514711,513687,512663,511639,510615,509591,508567,507543,506519,505495,504471,503447,502423,501399,500375,499351,498327,497303,496279,529048,528024,527000,525976,524952,523928,522904,521880,520856,519832,518808,517784,516760,515736,514712,513688,512664,511640,510616,509592,508568,507544,506520,505496,504472,503448,502424,501400,500376,499352,498328,497304,496280,529049,528025,527001,525977,524953,523929,522905,521881,520857,519833,518809,517785,516761,515737,514713,513689,512665,511641,510617,509593,508569,507545,506521,505497,504473,503449,502425,501401,500377,499353,498329,497305,496281,529050,528026,527002,525978,524954,523930,522906,521882,520858,519834,518810,517786,516762,515738,514714,513690,512666,511642,510618,509594,508570,507546,506522,505498,504474,503450,502426,501402,500378,499354,498330,497306,496282,529051,528027,527003,525979,524955,523931,522907,521883,520859,519835,518811,517787,516763,515739,514715,513691,512667,511643,510619,509595,508571,507547,506523,505499,504475,503451,502427,501403,500379,499355,498331,497307,496283,529052,528028,527004,525980,524956,523932,522908,521884,520860,519836,518812,517788,516764,515740,514716,513692,512668,511644,510620,509596,508572,507548,506524,505500,504476,503452,502428,501404,500380,499356,498332,497308,496284,529053,528029,527005,525981,524957,523933,522909,521885,520861,519837,518813,517789,516765,515741,514717,513693,512669,511645,510621,509597,508573,507549,506525,505501,504477,503453,502429,501405,500381,499357,498333,497309,496285,529054,528030,527006,525982,524958,523934,522910,521886,520862,519838,518814,517790,516766,515742,514718,513694,512670,511646,510622,509598,508574,507550,506526,505502,504478,503454,502430,501406,500382,499358,498334,497310,496286,529055,528031,527007,525983,524959,523935,522911,521887,520863,519839,518815,517791,516767,515743,514719,513695,512671,511647,510623,509599,508575,507551,506527,505503,504479,503455,502431,501407,500383,499359,498335,497311,496287,529056,528032,527008,525984,524960,523936,522912,521888,520864,519840,518816,517792,516768,515744,514720,513696,512672,511648,510624,509600,508576,507552,506528,505504,504480,503456,502432,501408,500384,499360,498336,497312,496288,529057,528033,527009,525985,524961,523937,522913,521889,520865,519841,518817,517793,516769,515745,514721,513697,512673,511649,510625,509601,508577,507553,506529,505505,504481,503457,502433,501409,500385,499361,498337,497313,496289,529058,528034,527010,525986,524962,523938,522914,521890,520866,519842,518818,517794,516770,515746,514722,513698,512674,511650,510626,509602,508578,507554,506530,505506,504482,503458,502434,501410,500386,499362,498338,497314,496290,529059,528035,527011,525987,524963,523939,522915,521891,520867,519843,518819,517795,516771,515747,514723,513699,512675,511651,510627,509603,508579,507555,506531,505507,504483,503459,502435,501411,500387,499363,498339,497315,496291,529060,528036,527012,525988,524964,523940,522916,521892,520868,519844,518820,517796,516772,515748,514724,513700,512676,511652,510628,509604,508580,507556,506532,505508,504484,503460,502436,501412,500388,499364,498340,497316,496292,529061,528037,527013,525989,524965,523941,522917,521893,520869,519845,518821,517797,516773,515749,514725,513701,512677,511653,510629,509605,508581,507557,506533,505509,504485,503461,502437,501413,500389,499365,498341,497317,496293,529062,528038,527014,525990,524966,523942,522918,521894,520870,519846,518822,517798,516774,515750,514726,513702,512678,511654,510630,509606,508582,507558,506534,505510,504486,503462,502438,501414,500390,499366,498342,497318,496294,529063,528039,527015,525991,524967,523943,522919,521895,520871,519847,518823,517799,516775,515751,514727,513703,512679,511655,510631,509607,508583,507559,506535,505511,504487,503463,502439,501415,500391,499367,498343,497319,496295,529064,528040,527016,525992,524968,523944,522920,521896,520872,519848,518824,517800,516776,515752,514728,513704,512680,511656,510632,509608,508584,507560,506536,505512,504488,503464,502440,501416,500392,499368,498344,497320,496296,529065,528041,527017,525993,524969,523945,522921,521897,520873,519849,518825,517801,516777,515753,514729,513705,512681,511657,510633,509609,508585,507561,506537,505513,504489,503465,502441,501417,500393,499369,498345,497321,496297,529066,528042,527018,525994,524970,523946,522922,521898,520874,519850,518826,517802,516778,515754,514730,513706,512682,511658,510634,509610,508586,507562,506538,505514,504490,503466,502442,501418,500394,499370,498346,497322,496298,529067,528043,527019,525995,524971,523947,522923,521899,520875,519851,518827,517803,516779,515755,514731,513707,512683,511659,510635,509611,508587,507563,506539,505515,504491,503467,502443,501419,500395,499371,498347,497323,496299,529068,528044,527020,525996,524972,523948,522924,521900,520876,519852,518828,517804,516780,515756,514732,513708,512684,511660,510636,509612,508588,507564,506540,505516,504492,503468,502444,501420,500396,499372,498348,497324,496300,529069,528045,527021,525997,524973,523949,522925,521901,520877,519853,518829,517805,516781,515757,514733,513709,512685,511661,510637,509613,508589,507565,506541,505517,504493,503469,502445,501421,500397,499373,498349,497325,496301,529070,528046,527022,525998,524974,523950,522926,521902,520878,519854,518830,517806,516782,515758,514734,513710,512686,511662,510638,509614,508590,507566,506542,505518,504494,503470,502446,501422,500398,499374,498350,497326,496302,529071,528047,527023,525999,524975,523951,522927,521903,520879,519855,518831,517807,516783,515759,514735,513711,512687,511663,510639,509615,508591,507567,506543,505519,504495,503471,502447,501423,500399,499375,498351,497327,496303,529072,528048,527024,526000,524976,523952,522928,521904,520880,519856,518832,517808,516784,515760,514736,513712,512688,511664,510640,509616,508592,507568,506544,505520,504496,503472,502448,501424,500400,499376,498352,497328,496304,529073,528049,527025,526001,524977,523953,522929,521905,520881,519857,518833,517809,516785,515761,514737,513713,512689,511665,510641,509617,508593,507569,506545,505521,504497,503473,502449,501425,500401,499377,498353,497329,496305,529074,528050,527026,526002,524978,523954,522930,521906,520882,519858,518834,517810,516786,515762,514738,513714,512690,511666,510642,509618,508594,507570,506546,505522,504498,503474,502450,501426,500402,499378,498354,497330,496306,529075,528051,527027,526003,524979,523955,522931,521907,520883,519859,518835,517811,516787,515763,514739,513715,512691,511667,510643,509619,508595,507571,506547,505523,504499,503475,502451,501427,500403,499379,498355,497331,496307,529076,528052,527028,526004,524980,523956,522932,521908,520884,519860,518836,517812,516788,515764,514740,513716,512692,511668,510644,509620,508596,507572,506548,505524,504500,503476,502452,501428,500404,499380,498356,497332,496308,529077,528053,527029,526005,524981,523957,522933,521909,520885,519861,518837,517813,516789,515765,514741,513717,512693,511669,510645,509621,508597,507573,506549,505525,504501,503477,502453,501429,500405,499381,498357,497333,496309,529078,528054,527030,526006,524982,523958,522934,521910,520886,519862,518838,517814,516790,515766,514742,513718,512694,511670,510646,509622,508598,507574,506550,505526,504502,503478,502454,501430,500406,499382,498358,497334,496310,529079,528055,527031,526007,524983,523959,522935,521911,520887,519863,518839,517815,516791,515767,514743,513719,512695,511671,510647,509623,508599,507575,506551,505527,504503,503479,502455,501431,500407,499383,498359,497335,496311,529080,528056,527032,526008,524984,523960,522936,521912,520888,519864,518840,517816,516792,515768,514744,513720,512696,511672,510648,509624,508600,507576,506552,505528,504504,503480,502456,501432,500408,499384,498360,497336,496312,529081,528057,527033,526009,524985,523961,522937,521913,520889,519865,518841,517817,516793,515769,514745,513721,512697,511673,510649,509625,508601,507577,506553,505529,504505,503481,502457,501433,500409,499385,498361,497337,496313,529082,528058,527034,526010,524986,523962,522938,521914,520890,519866,518842,517818,516794,515770,514746,513722,512698,511674,510650,509626,508602,507578,506554,505530,504506,503482,502458,501434,500410,499386,498362,497338,496314,529083,528059,527035,526011,524987,523963,522939,521915,520891,519867,518843,517819,516795,515771,514747,513723,512699,511675,510651,509627,508603,507579,506555,505531,504507,503483,502459,501435,500411,499387,498363,497339,496315,529084,528060,527036,526012,524988,523964,522940,521916,520892,519868,518844,517820,516796,515772,514748,513724,512700,511676,510652,509628,508604,507580,506556,505532,504508,503484,502460,501436,500412,499388,498364,497340,496316,529085,528061,527037,526013,524989,523965,522941,521917,520893,519869,518845,517821,516797,515773,514749,513725,512701,511677,510653,509629,508605,507581,506557,505533,504509,503485,502461,501437,500413,499389,498365,497341,496317,529086,528062,527038,526014,524990,523966,522942,521918,520894,519870,518846,517822,516798,515774,514750,513726,512702,511678,510654,509630,508606,507582,506558,505534,504510,503486,502462,501438,500414,499390,498366,497342,496318,529087,528063,527039,526015,524991,523967,522943,521919,520895,519871,518847,517823,516799,515775,514751,513727,512703,511679,510655,509631,508607,507583,506559,505535,504511,503487,502463,501439,500415,499391,498367,497343,496319,529088,528064,527040,526016,524992,523968,522944,521920,520896,519872,518848,517824,516800,515776,514752,513728,512704,511680,510656,509632,508608,507584,506560,505536,504512,503488,502464,501440,500416,499392,498368,497344,496320,529089,528065,527041,526017,524993,523969,522945,521921,520897,519873,518849,517825,516801,515777,514753,513729,512705,511681,510657,509633,508609,507585,506561,505537,504513,503489,502465,501441,500417,499393,498369,497345,496321,529090,528066,527042,526018,524994,523970,522946,521922,520898,519874,518850,517826,516802,515778,514754,513730,512706,511682,510658,509634,508610,507586,506562,505538,504514,503490,502466,501442,500418,499394,498370,497346,496322,529091,528067,527043,526019,524995,523971,522947,521923,520899,519875,518851,517827,516803,515779,514755,513731,512707,511683,510659,509635,508611,507587,506563,505539,504515,503491,502467,501443,500419,499395,498371,497347,496323,529092,528068,527044,526020,524996,523972,522948,521924,520900,519876,518852,517828,516804,515780,514756,513732,512708,511684,510660,509636,508612,507588,506564,505540,504516,503492,502468,501444,500420,499396,498372,497348,496324,529093,528069,527045,526021,524997,523973,522949,521925,520901,519877,518853,517829,516805,515781,514757,513733,512709,511685,510661,509637,508613,507589,506565,505541,504517,503493,502469,501445,500421,499397,498373,497349,496325,529094,528070,527046,526022,524998,523974,522950,521926,520902,519878,518854,517830,516806,515782,514758,513734,512710,511686,510662,509638,508614,507590,506566,505542,504518,503494,502470,501446,500422,499398,498374,497350,496326,529095,528071,527047,526023,524999,523975,522951,521927,520903,519879,518855,517831,516807,515783,514759,513735,512711,511687,510663,509639,508615,507591,506567,505543,504519,503495,502471,501447,500423,499399,498375,497351,496327,529096,528072,527048,526024,525000,523976,522952,521928,520904,519880,518856,517832,516808,515784,514760,513736,512712,511688,510664,509640,508616,507592,506568,505544,504520,503496,502472,501448,500424,499400,498376,497352,496328,529097,528073,527049,526025,525001,523977,522953,521929,520905,519881,518857,517833,516809,515785,514761,513737,512713,511689,510665,509641,508617,507593,506569,505545,504521,503497,502473,501449,500425,499401,498377,497353,496329,529098,528074,527050,526026,525002,523978,522954,521930,520906,519882,518858,517834,516810,515786,514762,513738,512714,511690,510666,509642,508618,507594,506570,505546,504522,503498,502474,501450,500426,499402,498378,497354,496330,529099,528075,527051,526027,525003,523979,522955,521931,520907,519883,518859,517835,516811,515787,514763,513739,512715,511691,510667,509643,508619,507595,506571,505547,504523,503499,502475,501451,500427,499403,498379,497355,496331,529100,528076,527052,526028,525004,523980,522956,521932,520908,519884,518860,517836,516812,515788,514764,513740,512716,511692,510668,509644,508620,507596,506572,505548,504524,503500,502476,501452,500428,499404,498380,497356,496332,529101,528077,527053,526029,525005,523981,522957,521933,520909,519885,518861,517837,516813,515789,514765,513741,512717,511693,510669,509645,508621,507597,506573,505549,504525,503501,502477,501453,500429,499405,498381,497357,496333,529102,528078,527054,526030,525006,523982,522958,521934,520910,519886,518862,517838,516814,515790,514766,513742,512718,511694,510670,509646,508622,507598,506574,505550,504526,503502,502478,501454,500430,499406,498382,497358,496334,529103,528079,527055,526031,525007,523983,522959,521935,520911,519887,518863,517839,516815,515791,514767,513743,512719,511695,510671,509647,508623,507599,506575,505551,504527,503503,502479,501455,500431,499407,498383,497359,496335,529104,528080,527056,526032,525008,523984,522960,521936,520912,519888,518864,517840,516816,515792,514768,513744,512720,511696,510672,509648,508624,507600,506576,505552,504528,503504,502480,501456,500432,499408,498384,497360,496336,529105,528081,527057,526033,525009,523985,522961,521937,520913,519889,518865,517841,516817,515793,514769,513745,512721,511697,510673,509649,508625,507601,506577,505553,504529,503505,502481,501457,500433,499409,498385,497361,496337,529106,528082,527058,526034,525010,523986,522962,521938,520914,519890,518866,517842,516818,515794,514770,513746,512722,511698,510674,509650,508626,507602,506578,505554,504530,503506,502482,501458,500434,499410,498386,497362,496338,529107,528083,527059,526035,525011,523987,522963,521939,520915,519891,518867,517843,516819,515795,514771,513747,512723,511699,510675,509651,508627,507603,506579,505555,504531,503507,502483,501459,500435,499411,498387,497363,496339,529108,528084,527060,526036,525012,523988,522964,521940,520916,519892,518868,517844,516820,515796,514772,513748,512724,511700,510676,509652,508628,507604,506580,505556,504532,503508,502484,501460,500436,499412,498388,497364,496340,529109,528085,527061,526037,525013,523989,522965,521941,520917,519893,518869,517845,516821,515797,514773,513749,512725,511701,510677,509653,508629,507605,506581,505557,504533,503509,502485,501461,500437,499413,498389,497365,496341,529110,528086,527062,526038,525014,523990,522966,521942,520918,519894,518870,517846,516822,515798,514774,513750,512726,511702,510678,509654,508630,507606,506582,505558,504534,503510,502486,501462,500438,499414,498390,497366,496342,529111,528087,527063,526039,525015,523991,522967,521943,520919,519895,518871,517847,516823,515799,514775,513751,512727,511703,510679,509655,508631,507607,506583,505559,504535,503511,502487,501463,500439,499415,498391,497367,496343,529112,528088,527064,526040,525016,523992,522968,521944,520920,519896,518872,517848,516824,515800,514776,513752,512728,511704,510680,509656,508632,507608,506584,505560,504536,503512,502488,501464,500440,499416,498392,497368,496344,529113,528089,527065,526041,525017,523993,522969,521945,520921,519897,518873,517849,516825,515801,514777,513753,512729,511705,510681,509657,508633,507609,506585,505561,504537,503513,502489,501465,500441,499417,498393,497369,496345,529114,528090,527066,526042,525018,523994,522970,521946,520922,519898,518874,517850,516826,515802,514778,513754,512730,511706,510682,509658,508634,507610,506586,505562,504538,503514,502490,501466,500442,499418,498394,497370,496346,529115,528091,527067,526043,525019,523995,522971,521947,520923,519899,518875,517851,516827,515803,514779,513755,512731,511707,510683,509659,508635,507611,506587,505563,504539,503515,502491,501467,500443,499419,498395,497371,496347,529116,528092,527068,526044,525020,523996,522972,521948,520924,519900,518876,517852,516828,515804,514780,513756,512732,511708,510684,509660,508636,507612,506588,505564,504540,503516,502492,501468,500444,499420,498396,497372,496348,529117,528093,527069,526045,525021,523997,522973,521949,520925,519901,518877,517853,516829,515805,514781,513757,512733,511709,510685,509661,508637,507613,506589,505565,504541,503517,502493,501469,500445,499421,498397,497373,496349,529118,528094,527070,526046,525022,523998,522974,521950,520926,519902,518878,517854,516830,515806,514782,513758,512734,511710,510686,509662,508638,507614,506590,505566,504542,503518,502494,501470,500446,499422,498398,497374,496350,529119,528095,527071,526047,525023,523999,522975,521951,520927,519903,518879,517855,516831,515807,514783,513759,512735,511711,510687,509663,508639,507615,506591,505567,504543,503519,502495,501471,500447,499423,498399,497375,496351,529120,528096,527072,526048,525024,524000,522976,521952,520928,519904,518880,517856,516832,515808,514784,513760,512736,511712,510688,509664,508640,507616,506592,505568,504544,503520,502496,501472,500448,499424,498400,497376,496352,529121,528097,527073,526049,525025,524001,522977,521953,520929,519905,518881,517857,516833,515809,514785,513761,512737,511713,510689,509665,508641,507617,506593,505569,504545,503521,502497,501473,500449,499425,498401,497377,496353,529122,528098,527074,526050,525026,524002,522978,521954,520930,519906,518882,517858,516834,515810,514786,513762,512738,511714,510690,509666,508642,507618,506594,505570,504546,503522,502498,501474,500450,499426,498402,497378,496354,529123,528099,527075,526051,525027,524003,522979,521955,520931,519907,518883,517859,516835,515811,514787,513763,512739,511715,510691,509667,508643,507619,506595,505571,504547,503523,502499,501475,500451,499427,498403,497379,496355,529124,528100,527076,526052,525028,524004,522980,521956,520932,519908,518884,517860,516836,515812,514788,513764,512740,511716,510692,509668,508644,507620,506596,505572,504548,503524,502500,501476,500452,499428,498404,497380,496356,529125,528101,527077,526053,525029,524005,522981,521957,520933,519909,518885,517861,516837,515813,514789,513765,512741,511717,510693,509669,508645,507621,506597,505573,504549,503525,502501,501477,500453,499429,498405,497381,496357,529126,528102,527078,526054,525030,524006,522982,521958,520934,519910,518886,517862,516838,515814,514790,513766,512742,511718,510694,509670,508646,507622,506598,505574,504550,503526,502502,501478,500454,499430,498406,497382,496358,529127,528103,527079,526055,525031,524007,522983,521959,520935,519911,518887,517863,516839,515815,514791,513767,512743,511719,510695,509671,508647,507623,506599,505575,504551,503527,502503,501479,500455,499431,498407,497383,496359,529128,528104,527080,526056,525032,524008,522984,521960,520936,519912,518888,517864,516840,515816,514792,513768,512744,511720,510696,509672,508648,507624,506600,505576,504552,503528,502504,501480,500456,499432,498408,497384,496360,529129,528105,527081,526057,525033,524009,522985,521961,520937,519913,518889,517865,516841,515817,514793,513769,512745,511721,510697,509673,508649,507625,506601,505577,504553,503529,502505,501481,500457,499433,498409,497385,496361,529130,528106,527082,526058,525034,524010,522986,521962,520938,519914,518890,517866,516842,515818,514794,513770,512746,511722,510698,509674,508650,507626,506602,505578,504554,503530,502506,501482,500458,499434,498410,497386,496362,529131,528107,527083,526059,525035,524011,522987,521963,520939,519915,518891,517867,516843,515819,514795,513771,512747,511723,510699,509675,508651,507627,506603,505579,504555,503531,502507,501483,500459,499435,498411,497387,496363,529132,528108,527084,526060,525036,524012,522988,521964,520940,519916,518892,517868,516844,515820,514796,513772,512748,511724,510700,509676,508652,507628,506604,505580,504556,503532,502508,501484,500460,499436,498412,497388,496364,529133,528109,527085,526061,525037,524013,522989,521965,520941,519917,518893,517869,516845,515821,514797,513773,512749,511725,510701,509677,508653,507629,506605,505581,504557,503533,502509,501485,500461,499437,498413,497389,496365,529134,528110,527086,526062,525038,524014,522990,521966,520942,519918,518894,517870,516846,515822,514798,513774,512750,511726,510702,509678,508654,507630,506606,505582,504558,503534,502510,501486,500462,499438,498414,497390,496366,529135,528111,527087,526063,525039,524015,522991,521967,520943,519919,518895,517871,516847,515823,514799,513775,512751,511727,510703,509679,508655,507631,506607,505583,504559,503535,502511,501487,500463,499439,498415,497391,496367,529136,528112,527088,526064,525040,524016,522992,521968,520944,519920,518896,517872,516848,515824,514800,513776,512752,511728,510704,509680,508656,507632,506608,505584,504560,503536,502512,501488,500464,499440,498416,497392,496368,529137,528113,527089,526065,525041,524017,522993,521969,520945,519921,518897,517873,516849,515825,514801,513777,512753,511729,510705,509681,508657,507633,506609,505585,504561,503537,502513,501489,500465,499441,498417,497393,496369,529138,528114,527090,526066,525042,524018,522994,521970,520946,519922,518898,517874,516850,515826,514802,513778,512754,511730,510706,509682,508658,507634,506610,505586,504562,503538,502514,501490,500466,499442,498418,497394,496370,529139,528115,527091,526067,525043,524019,522995,521971,520947,519923,518899,517875,516851,515827,514803,513779,512755,511731,510707,509683,508659,507635,506611,505587,504563,503539,502515,501491,500467,499443,498419,497395,496371,529140,528116,527092,526068,525044,524020,522996,521972,520948,519924,518900,517876,516852,515828,514804,513780,512756,511732,510708,509684,508660,507636,506612,505588,504564,503540,502516,501492,500468,499444,498420,497396,496372,529141,528117,527093,526069,525045,524021,522997,521973,520949,519925,518901,517877,516853,515829,514805,513781,512757,511733,510709,509685,508661,507637,506613,505589,504565,503541,502517,501493,500469,499445,498421,497397,496373,529142,528118,527094,526070,525046,524022,522998,521974,520950,519926,518902,517878,516854,515830,514806,513782,512758,511734,510710,509686,508662,507638,506614,505590,504566,503542,502518,501494,500470,499446,498422,497398,496374,529143,528119,527095,526071,525047,524023,522999,521975,520951,519927,518903,517879,516855,515831,514807,513783,512759,511735,510711,509687,508663,507639,506615,505591,504567,503543,502519,501495,500471,499447,498423,497399,496375,529144,528120,527096,526072,525048,524024,523000,521976,520952,519928,518904,517880,516856,515832,514808,513784,512760,511736,510712,509688,508664,507640,506616,505592,504568,503544,502520,501496,500472,499448,498424,497400,496376,529145,528121,527097,526073,525049,524025,523001,521977,520953,519929,518905,517881,516857,515833,514809,513785,512761,511737,510713,509689,508665,507641,506617,505593,504569,503545,502521,501497,500473,499449,498425,497401,496377,529146,528122,527098,526074,525050,524026,523002,521978,520954,519930,518906,517882,516858,515834,514810,513786,512762,511738,510714,509690,508666,507642,506618,505594,504570,503546,502522,501498,500474,499450,498426,497402,496378,529147,528123,527099,526075,525051,524027,523003,521979,520955,519931,518907,517883,516859,515835,514811,513787,512763,511739,510715,509691,508667,507643,506619,505595,504571,503547,502523,501499,500475,499451,498427,497403,496379,529148,528124,527100,526076,525052,524028,523004,521980,520956,519932,518908,517884,516860,515836,514812,513788,512764,511740,510716,509692,508668,507644,506620,505596,504572,503548,502524,501500,500476,499452,498428,497404,496380,529149,528125,527101,526077,525053,524029,523005,521981,520957,519933,518909,517885,516861,515837,514813,513789,512765,511741,510717,509693,508669,507645,506621,505597,504573,503549,502525,501501,500477,499453,498429,497405,496381,529150,528126,527102,526078,525054,524030,523006,521982,520958,519934,518910,517886,516862,515838,514814,513790,512766,511742,510718,509694,508670,507646,506622,505598,504574,503550,502526,501502,500478,499454,498430,497406,496382,529151,528127,527103,526079,525055,524031,523007,521983,520959,519935,518911,517887,516863,515839,514815,513791,512767,511743,510719,509695,508671,507647,506623,505599,504575,503551,502527,501503,500479,499455,498431,497407,496383,529152,528128,527104,526080,525056,524032,523008,521984,520960,519936,518912,517888,516864,515840,514816,513792,512768,511744,510720,509696,508672,507648,506624,505600,504576,503552,502528,501504,500480,499456,498432,497408,496384,529153,528129,527105,526081,525057,524033,523009,521985,520961,519937,518913,517889,516865,515841,514817,513793,512769,511745,510721,509697,508673,507649,506625,505601,504577,503553,502529,501505,500481,499457,498433,497409,496385,529154,528130,527106,526082,525058,524034,523010,521986,520962,519938,518914,517890,516866,515842,514818,513794,512770,511746,510722,509698,508674,507650,506626,505602,504578,503554,502530,501506,500482,499458,498434,497410,496386,529155,528131,527107,526083,525059,524035,523011,521987,520963,519939,518915,517891,516867,515843,514819,513795,512771,511747,510723,509699,508675,507651,506627,505603,504579,503555,502531,501507,500483,499459,498435,497411,496387,529156,528132,527108,526084,525060,524036,523012,521988,520964,519940,518916,517892,516868,515844,514820,513796,512772,511748,510724,509700,508676,507652,506628,505604,504580,503556,502532,501508,500484,499460,498436,497412,496388,529157,528133,527109,526085,525061,524037,523013,521989,520965,519941,518917,517893,516869,515845,514821,513797,512773,511749,510725,509701,508677,507653,506629,505605,504581,503557,502533,501509,500485,499461,498437,497413,496389,529158,528134,527110,526086,525062,524038,523014,521990,520966,519942,518918,517894,516870,515846,514822,513798,512774,511750,510726,509702,508678,507654,506630,505606,504582,503558,502534,501510,500486,499462,498438,497414,496390,529159,528135,527111,526087,525063,524039,523015,521991,520967,519943,518919,517895,516871,515847,514823,513799,512775,511751,510727,509703,508679,507655,506631,505607,504583,503559,502535,501511,500487,499463,498439,497415,496391,529160,528136,527112,526088,525064,524040,523016,521992,520968,519944,518920,517896,516872,515848,514824,513800,512776,511752,510728,509704,508680,507656,506632,505608,504584,503560,502536,501512,500488,499464,498440,497416,496392,529161,528137,527113,526089,525065,524041,523017,521993,520969,519945,518921,517897,516873,515849,514825,513801,512777,511753,510729,509705,508681,507657,506633,505609,504585,503561,502537,501513,500489,499465,498441,497417,496393,529162,528138,527114,526090,525066,524042,523018,521994,520970,519946,518922,517898,516874,515850,514826,513802,512778,511754,510730,509706,508682,507658,506634,505610,504586,503562,502538,501514,500490,499466,498442,497418,496394,529163,528139,527115,526091,525067,524043,523019,521995,520971,519947,518923,517899,516875,515851,514827,513803,512779,511755,510731,509707,508683,507659,506635,505611,504587,503563,502539,501515,500491,499467,498443,497419,496395,529164,528140,527116,526092,525068,524044,523020,521996,520972,519948,518924,517900,516876,515852,514828,513804,512780,511756,510732,509708,508684,507660,506636,505612,504588,503564,502540,501516,500492,499468,498444,497420,496396,529165,528141,527117,526093,525069,524045,523021,521997,520973,519949,518925,517901,516877,515853,514829,513805,512781,511757,510733,509709,508685,507661,506637,505613,504589,503565,502541,501517,500493,499469,498445,497421,496397,529166,528142,527118,526094,525070,524046,523022,521998,520974,519950,518926,517902,516878,515854,514830,513806,512782,511758,510734,509710,508686,507662,506638,505614,504590,503566,502542,501518,500494,499470,498446,497422,496398,529167,528143,527119,526095,525071,524047,523023,521999,520975,519951,518927,517903,516879,515855,514831,513807,512783,511759,510735,509711,508687,507663,506639,505615,504591,503567,502543,501519,500495,499471,498447,497423,496399,529168,528144,527120,526096,525072,524048,523024,522000,520976,519952,518928,517904,516880,515856,514832,513808,512784,511760,510736,509712,508688,507664,506640,505616,504592,503568,502544,501520,500496,499472,498448,497424,496400,529169,528145,527121,526097,525073,524049,523025,522001,520977,519953,518929,517905,516881,515857,514833,513809,512785,511761,510737,509713,508689,507665,506641,505617,504593,503569,502545,501521,500497,499473,498449,497425,496401,529170,528146,527122,526098,525074,524050,523026,522002,520978,519954,518930,517906,516882,515858,514834,513810,512786,511762,510738,509714,508690,507666,506642,505618,504594,503570,502546,501522,500498,499474,498450,497426,496402,529171,528147,527123,526099,525075,524051,523027,522003,520979,519955,518931,517907,516883,515859,514835,513811,512787,511763,510739,509715,508691,507667,506643,505619,504595,503571,502547,501523,500499,499475,498451,497427,496403,529172,528148,527124,526100,525076,524052,523028,522004,520980,519956,518932,517908,516884,515860,514836,513812,512788,511764,510740,509716,508692,507668,506644,505620,504596,503572,502548,501524,500500,499476,498452,497428,496404,529173,528149,527125,526101,525077,524053,523029,522005,520981,519957,518933,517909,516885,515861,514837,513813,512789,511765,510741,509717,508693,507669,506645,505621,504597,503573,502549,501525,500501,499477,498453,497429,496405,529174,528150,527126,526102,525078,524054,523030,522006,520982,519958,518934,517910,516886,515862,514838,513814,512790,511766,510742,509718,508694,507670,506646,505622,504598,503574,502550,501526,500502,499478,498454,497430,496406,529175,528151,527127,526103,525079,524055,523031,522007,520983,519959,518935,517911,516887,515863,514839,513815,512791,511767,510743,509719,508695,507671,506647,505623,504599,503575,502551,501527,500503,499479,498455,497431,496407,529176,528152,527128,526104,525080,524056,523032,522008,520984,519960,518936,517912,516888,515864,514840,513816,512792,511768,510744,509720,508696,507672,506648,505624,504600,503576,502552,501528,500504,499480,498456,497432,496408,529177,528153,527129,526105,525081,524057,523033,522009,520985,519961,518937,517913,516889,515865,514841,513817,512793,511769,510745,509721,508697,507673,506649,505625,504601,503577,502553,501529,500505,499481,498457,497433,496409,529178,528154,527130,526106,525082,524058,523034,522010,520986,519962,518938,517914,516890,515866,514842,513818,512794,511770,510746,509722,508698,507674,506650,505626,504602,503578,502554,501530,500506,499482,498458,497434,496410,529179,528155,527131,526107,525083,524059,523035,522011,520987,519963,518939,517915,516891,515867,514843,513819,512795,511771,510747,509723,508699,507675,506651,505627,504603,503579,502555,501531,500507,499483,498459,497435,496411,529180,528156,527132,526108,525084,524060,523036,522012,520988,519964,518940,517916,516892,515868,514844,513820,512796,511772,510748,509724,508700,507676,506652,505628,504604,503580,502556,501532,500508,499484,498460,497436,496412,529181,528157,527133,526109,525085,524061,523037,522013,520989,519965,518941,517917,516893,515869,514845,513821,512797,511773,510749,509725,508701,507677,506653,505629,504605,503581,502557,501533,500509,499485,498461,497437,496413,529182,528158,527134,526110,525086,524062,523038,522014,520990,519966,518942,517918,516894,515870,514846,513822,512798,511774,510750,509726,508702,507678,506654,505630,504606,503582,502558,501534,500510,499486,498462,497438,496414,529183,528159,527135,526111,525087,524063,523039,522015,520991,519967,518943,517919,516895,515871,514847,513823,512799,511775,510751,509727,508703,507679,506655,505631,504607,503583,502559,501535,500511,499487,498463,497439,496415,529184,528160,527136,526112,525088,524064,523040,522016,520992,519968,518944,517920,516896,515872,514848,513824,512800,511776,510752,509728,508704,507680,506656,505632,504608,503584,502560,501536,500512,499488,498464,497440,496416,529185,528161,527137,526113,525089,524065,523041,522017,520993,519969,518945,517921,516897,515873,514849,513825,512801,511777,510753,509729,508705,507681,506657,505633,504609,503585,502561,501537,500513,499489,498465,497441,496417,529186,528162,527138,526114,525090,524066,523042,522018,520994,519970,518946,517922,516898,515874,514850,513826,512802,511778,510754,509730,508706,507682,506658,505634,504610,503586,502562,501538,500514,499490,498466,497442,496418,529187,528163,527139,526115,525091,524067,523043,522019,520995,519971,518947,517923,516899,515875,514851,513827,512803,511779,510755,509731,508707,507683,506659,505635,504611,503587,502563,501539,500515,499491,498467,497443,496419,529188,528164,527140,526116,525092,524068,523044,522020,520996,519972,518948,517924,516900,515876,514852,513828,512804,511780,510756,509732,508708,507684,506660,505636,504612,503588,502564,501540,500516,499492,498468,497444,496420,529189,528165,527141,526117,525093,524069,523045,522021,520997,519973,518949,517925,516901,515877,514853,513829,512805,511781,510757,509733,508709,507685,506661,505637,504613,503589,502565,501541,500517,499493,498469,497445,496421,529190,528166,527142,526118,525094,524070,523046,522022,520998,519974,518950,517926,516902,515878,514854,513830,512806,511782,510758,509734,508710,507686,506662,505638,504614,503590,502566,501542,500518,499494,498470,497446,496422,529191,528167,527143,526119,525095,524071,523047,522023,520999,519975,518951,517927,516903,515879,514855,513831,512807,511783,510759,509735,508711,507687,506663,505639,504615,503591,502567,501543,500519,499495,498471,497447,496423,529192,528168,527144,526120,525096,524072,523048,522024,521000,519976,518952,517928,516904,515880,514856,513832,512808,511784,510760,509736,508712,507688,506664,505640,504616,503592,502568,501544,500520,499496,498472,497448,496424,529193,528169,527145,526121,525097,524073,523049,522025,521001,519977,518953,517929,516905,515881,514857,513833,512809,511785,510761,509737,508713,507689,506665,505641,504617,503593,502569,501545,500521,499497,498473,497449,496425,529194,528170,527146,526122,525098,524074,523050,522026,521002,519978,518954,517930,516906,515882,514858,513834,512810,511786,510762,509738,508714,507690,506666,505642,504618,503594,502570,501546,500522,499498,498474,497450,496426,529195,528171,527147,526123,525099,524075,523051,522027,521003,519979,518955,517931,516907,515883,514859,513835,512811,511787,510763,509739,508715,507691,506667,505643,504619,503595,502571,501547,500523,499499,498475,497451,496427,529196,528172,527148,526124,525100,524076,523052,522028,521004,519980,518956,517932,516908,515884,514860,513836,512812,511788,510764,509740,508716,507692,506668,505644,504620,503596,502572,501548,500524,499500,498476,497452,496428,529197,528173,527149,526125,525101,524077,523053,522029,521005,519981,518957,517933,516909,515885,514861,513837,512813,511789,510765,509741,508717,507693,506669,505645,504621,503597,502573,501549,500525,499501,498477,497453,496429,529198,528174,527150,526126,525102,524078,523054,522030,521006,519982,518958,517934,516910,515886,514862,513838,512814,511790,510766,509742,508718,507694,506670,505646,504622,503598,502574,501550,500526,499502,498478,497454,496430,529199,528175,527151,526127,525103,524079,523055,522031,521007,519983,518959,517935,516911,515887,514863,513839,512815,511791,510767,509743,508719,507695,506671,505647,504623,503599,502575,501551,500527,499503,498479,497455,496431,529200,528176,527152,526128,525104,524080,523056,522032,521008,519984,518960,517936,516912,515888,514864,513840,512816,511792,510768,509744,508720,507696,506672,505648,504624,503600,502576,501552,500528,499504,498480,497456,496432,529201,528177,527153,526129,525105,524081,523057,522033,521009,519985,518961,517937,516913,515889,514865,513841,512817,511793,510769,509745,508721,507697,506673,505649,504625,503601,502577,501553,500529,499505,498481,497457,496433,529202,528178,527154,526130,525106,524082,523058,522034,521010,519986,518962,517938,516914,515890,514866,513842,512818,511794,510770,509746,508722,507698,506674,505650,504626,503602,502578,501554,500530,499506,498482,497458,496434,529203,528179,527155,526131,525107,524083,523059,522035,521011,519987,518963,517939,516915,515891,514867,513843,512819,511795,510771,509747,508723,507699,506675,505651,504627,503603,502579,501555,500531,499507,498483,497459,496435,529204,528180,527156,526132,525108,524084,523060,522036,521012,519988,518964,517940,516916,515892,514868,513844,512820,511796,510772,509748,508724,507700,506676,505652,504628,503604,502580,501556,500532,499508,498484,497460,496436,529205,528181,527157,526133,525109,524085,523061,522037,521013,519989,518965,517941,516917,515893,514869,513845,512821,511797,510773,509749,508725,507701,506677,505653,504629,503605,502581,501557,500533,499509,498485,497461,496437,529206,528182,527158,526134,525110,524086,523062,522038,521014,519990,518966,517942,516918,515894,514870,513846,512822,511798,510774,509750,508726,507702,506678,505654,504630,503606,502582,501558,500534,499510,498486,497462,496438,529207,528183,527159,526135,525111,524087,523063,522039,521015,519991,518967,517943,516919,515895,514871,513847,512823,511799,510775,509751,508727,507703,506679,505655,504631,503607,502583,501559,500535,499511,498487,497463,496439,529208,528184,527160,526136,525112,524088,523064,522040,521016,519992,518968,517944,516920,515896,514872,513848,512824,511800,510776,509752,508728,507704,506680,505656,504632,503608,502584,501560,500536,499512,498488,497464,496440,529209,528185,527161,526137,525113,524089,523065,522041,521017,519993,518969,517945,516921,515897,514873,513849,512825,511801,510777,509753,508729,507705,506681,505657,504633,503609,502585,501561,500537,499513,498489,497465,496441,529210,528186,527162,526138,525114,524090,523066,522042,521018,519994,518970,517946,516922,515898,514874,513850,512826,511802,510778,509754,508730,507706,506682,505658,504634,503610,502586,501562,500538,499514,498490,497466,496442,529211,528187,527163,526139,525115,524091,523067,522043,521019,519995,518971,517947,516923,515899,514875,513851,512827,511803,510779,509755,508731,507707,506683,505659,504635,503611,502587,501563,500539,499515,498491,497467,496443,529212,528188,527164,526140,525116,524092,523068,522044,521020,519996,518972,517948,516924,515900,514876,513852,512828,511804,510780,509756,508732,507708,506684,505660,504636,503612,502588,501564,500540,499516,498492,497468,496444,529213,528189,527165,526141,525117,524093,523069,522045,521021,519997,518973,517949,516925,515901,514877,513853,512829,511805,510781,509757,508733,507709,506685,505661,504637,503613,502589,501565,500541,499517,498493,497469,496445,529214,528190,527166,526142,525118,524094,523070,522046,521022,519998,518974,517950,516926,515902,514878,513854,512830,511806,510782,509758,508734,507710,506686,505662,504638,503614,502590,501566,500542,499518,498494,497470,496446,529215,528191,527167,526143,525119,524095,523071,522047,521023,519999,518975,517951,516927,515903,514879,513855,512831,511807,510783,509759,508735,507711,506687,505663,504639,503615,502591,501567,500543,499519,498495,497471,496447,529216,528192,527168,526144,525120,524096,523072,522048,521024,520000,518976,517952,516928,515904,514880,513856,512832,511808,510784,509760,508736,507712,506688,505664,504640,503616,502592,501568,500544,499520,498496,497472,496448,529217,528193,527169,526145,525121,524097,523073,522049,521025,520001,518977,517953,516929,515905,514881,513857,512833,511809,510785,509761,508737,507713,506689,505665,504641,503617,502593,501569,500545,499521,498497,497473,496449,529218,528194,527170,526146,525122,524098,523074,522050,521026,520002,518978,517954,516930,515906,514882,513858,512834,511810,510786,509762,508738,507714,506690,505666,504642,503618,502594,501570,500546,499522,498498,497474,496450,529219,528195,527171,526147,525123,524099,523075,522051,521027,520003,518979,517955,516931,515907,514883,513859,512835,511811,510787,509763,508739,507715,506691,505667,504643,503619,502595,501571,500547,499523,498499,497475,496451,529220,528196,527172,526148,525124,524100,523076,522052,521028,520004,518980,517956,516932,515908,514884,513860,512836,511812,510788,509764,508740,507716,506692,505668,504644,503620,502596,501572,500548,499524,498500,497476,496452,529221,528197,527173,526149,525125,524101,523077,522053,521029,520005,518981,517957,516933,515909,514885,513861,512837,511813,510789,509765,508741,507717,506693,505669,504645,503621,502597,501573,500549,499525,498501,497477,496453,529222,528198,527174,526150,525126,524102,523078,522054,521030,520006,518982,517958,516934,515910,514886,513862,512838,511814,510790,509766,508742,507718,506694,505670,504646,503622,502598,501574,500550,499526,498502,497478,496454,529223,528199,527175,526151,525127,524103,523079,522055,521031,520007,518983,517959,516935,515911,514887,513863,512839,511815,510791,509767,508743,507719,506695,505671,504647,503623,502599,501575,500551,499527,498503,497479,496455,529224,528200,527176,526152,525128,524104,523080,522056,521032,520008,518984,517960,516936,515912,514888,513864,512840,511816,510792,509768,508744,507720,506696,505672,504648,503624,502600,501576,500552,499528,498504,497480,496456,529225,528201,527177,526153,525129,524105,523081,522057,521033,520009,518985,517961,516937,515913,514889,513865,512841,511817,510793,509769,508745,507721,506697,505673,504649,503625,502601,501577,500553,499529,498505,497481,496457,529226,528202,527178,526154,525130,524106,523082,522058,521034,520010,518986,517962,516938,515914,514890,513866,512842,511818,510794,509770,508746,507722,506698,505674,504650,503626,502602,501578,500554,499530,498506,497482,496458,529227,528203,527179,526155,525131,524107,523083,522059,521035,520011,518987,517963,516939,515915,514891,513867,512843,511819,510795,509771,508747,507723,506699,505675,504651,503627,502603,501579,500555,499531,498507,497483,496459,529228,528204,527180,526156,525132,524108,523084,522060,521036,520012,518988,517964,516940,515916,514892,513868,512844,511820,510796,509772,508748,507724,506700,505676,504652,503628,502604,501580,500556,499532,498508,497484,496460,529229,528205,527181,526157,525133,524109,523085,522061,521037,520013,518989,517965,516941,515917,514893,513869,512845,511821,510797,509773,508749,507725,506701,505677,504653,503629,502605,501581,500557,499533,498509,497485,496461,529230,528206,527182,526158,525134,524110,523086,522062,521038,520014,518990,517966,516942,515918,514894,513870,512846,511822,510798,509774,508750,507726,506702,505678,504654,503630,502606,501582,500558,499534,498510,497486,496462,529231,528207,527183,526159,525135,524111,523087,522063,521039,520015,518991,517967,516943,515919,514895,513871,512847,511823,510799,509775,508751,507727,506703,505679,504655,503631,502607,501583,500559,499535,498511,497487,496463,529232,528208,527184,526160,525136,524112,523088,522064,521040,520016,518992,517968,516944,515920,514896,513872,512848,511824,510800,509776,508752,507728,506704,505680,504656,503632,502608,501584,500560,499536,498512,497488,496464,529233,528209,527185,526161,525137,524113,523089,522065,521041,520017,518993,517969,516945,515921,514897,513873,512849,511825,510801,509777,508753,507729,506705,505681,504657,503633,502609,501585,500561,499537,498513,497489,496465,529234,528210,527186,526162,525138,524114,523090,522066,521042,520018,518994,517970,516946,515922,514898,513874,512850,511826,510802,509778,508754,507730,506706,505682,504658,503634,502610,501586,500562,499538,498514,497490,496466,529235,528211,527187,526163,525139,524115,523091,522067,521043,520019,518995,517971,516947,515923,514899,513875,512851,511827,510803,509779,508755,507731,506707,505683,504659,503635,502611,501587,500563,499539,498515,497491,496467,529236,528212,527188,526164,525140,524116,523092,522068,521044,520020,518996,517972,516948,515924,514900,513876,512852,511828,510804,509780,508756,507732,506708,505684,504660,503636,502612,501588,500564,499540,498516,497492,496468,529237,528213,527189,526165,525141,524117,523093,522069,521045,520021,518997,517973,516949,515925,514901,513877,512853,511829,510805,509781,508757,507733,506709,505685,504661,503637,502613,501589,500565,499541,498517,497493,496469,529238,528214,527190,526166,525142,524118,523094,522070,521046,520022,518998,517974,516950,515926,514902,513878,512854,511830,510806,509782,508758,507734,506710,505686,504662,503638,502614,501590,500566,499542,498518,497494,496470,529239,528215,527191,526167,525143,524119,523095,522071,521047,520023,518999,517975,516951,515927,514903,513879,512855,511831,510807,509783,508759,507735,506711,505687,504663,503639,502615,501591,500567,499543,498519,497495,496471,529240,528216,527192,526168,525144,524120,523096,522072,521048,520024,519000,517976,516952,515928,514904,513880,512856,511832,510808,509784,508760,507736,506712,505688,504664,503640,502616,501592,500568,499544,498520,497496,496472,529241,528217,527193,526169,525145,524121,523097,522073,521049,520025,519001,517977,516953,515929,514905,513881,512857,511833,510809,509785,508761,507737,506713,505689,504665,503641,502617,501593,500569,499545,498521,497497,496473,529242,528218,527194,526170,525146,524122,523098,522074,521050,520026,519002,517978,516954,515930,514906,513882,512858,511834,510810,509786,508762,507738,506714,505690,504666,503642,502618,501594,500570,499546,498522,497498,496474,529243,528219,527195,526171,525147,524123,523099,522075,521051,520027,519003,517979,516955,515931,514907,513883,512859,511835,510811,509787,508763,507739,506715,505691,504667,503643,502619,501595,500571,499547,498523,497499,496475,529244,528220,527196,526172,525148,524124,523100,522076,521052,520028,519004,517980,516956,515932,514908,513884,512860,511836,510812,509788,508764,507740,506716,505692,504668,503644,502620,501596,500572,499548,498524,497500,496476,529245,528221,527197,526173,525149,524125,523101,522077,521053,520029,519005,517981,516957,515933,514909,513885,512861,511837,510813,509789,508765,507741,506717,505693,504669,503645,502621,501597,500573,499549,498525,497501,496477,529246,528222,527198,526174,525150,524126,523102,522078,521054,520030,519006,517982,516958,515934,514910,513886,512862,511838,510814,509790,508766,507742,506718,505694,504670,503646,502622,501598,500574,499550,498526,497502,496478,529247,528223,527199,526175,525151,524127,523103,522079,521055,520031,519007,517983,516959,515935,514911,513887,512863,511839,510815,509791,508767,507743,506719,505695,504671,503647,502623,501599,500575,499551,498527,497503,496479,529248,528224,527200,526176,525152,524128,523104,522080,521056,520032,519008,517984,516960,515936,514912,513888,512864,511840,510816,509792,508768,507744,506720,505696,504672,503648,502624,501600,500576,499552,498528,497504,496480,529249,528225,527201,526177,525153,524129,523105,522081,521057,520033,519009,517985,516961,515937,514913,513889,512865,511841,510817,509793,508769,507745,506721,505697,504673,503649,502625,501601,500577,499553,498529,497505,496481,529250,528226,527202,526178,525154,524130,523106,522082,521058,520034,519010,517986,516962,515938,514914,513890,512866,511842,510818,509794,508770,507746,506722,505698,504674,503650,502626,501602,500578,499554,498530,497506,496482,529251,528227,527203,526179,525155,524131,523107,522083,521059,520035,519011,517987,516963,515939,514915,513891,512867,511843,510819,509795,508771,507747,506723,505699,504675,503651,502627,501603,500579,499555,498531,497507,496483,529252,528228,527204,526180,525156,524132,523108,522084,521060,520036,519012,517988,516964,515940,514916,513892,512868,511844,510820,509796,508772,507748,506724,505700,504676,503652,502628,501604,500580,499556,498532,497508,496484,529253,528229,527205,526181,525157,524133,523109,522085,521061,520037,519013,517989,516965,515941,514917,513893,512869,511845,510821,509797,508773,507749,506725,505701,504677,503653,502629,501605,500581,499557,498533,497509,496485,529254,528230,527206,526182,525158,524134,523110,522086,521062,520038,519014,517990,516966,515942,514918,513894,512870,511846,510822,509798,508774,507750,506726,505702,504678,503654,502630,501606,500582,499558,498534,497510,496486,529255,528231,527207,526183,525159,524135,523111,522087,521063,520039,519015,517991,516967,515943,514919,513895,512871,511847,510823,509799,508775,507751,506727,505703,504679,503655,502631,501607,500583,499559,498535,497511,496487,529256,528232,527208,526184,525160,524136,523112,522088,521064,520040,519016,517992,516968,515944,514920,513896,512872,511848,510824,509800,508776,507752,506728,505704,504680,503656,502632,501608,500584,499560,498536,497512,496488,529257,528233,527209,526185,525161,524137,523113,522089,521065,520041,519017,517993,516969,515945,514921,513897,512873,511849,510825,509801,508777,507753,506729,505705,504681,503657,502633,501609,500585,499561,498537,497513,496489,529258,528234,527210,526186,525162,524138,523114,522090,521066,520042,519018,517994,516970,515946,514922,513898,512874,511850,510826,509802,508778,507754,506730,505706,504682,503658,502634,501610,500586,499562,498538,497514,496490,529259,528235,527211,526187,525163,524139,523115,522091,521067,520043,519019,517995,516971,515947,514923,513899,512875,511851,510827,509803,508779,507755,506731,505707,504683,503659,502635,501611,500587,499563,498539,497515,496491,529260,528236,527212,526188,525164,524140,523116,522092,521068,520044,519020,517996,516972,515948,514924,513900,512876,511852,510828,509804,508780,507756,506732,505708,504684,503660,502636,501612,500588,499564,498540,497516,496492,529261,528237,527213,526189,525165,524141,523117,522093,521069,520045,519021,517997,516973,515949,514925,513901,512877,511853,510829,509805,508781,507757,506733,505709,504685,503661,502637,501613,500589,499565,498541,497517,496493,529262,528238,527214,526190,525166,524142,523118,522094,521070,520046,519022,517998,516974,515950,514926,513902,512878,511854,510830,509806,508782,507758,506734,505710,504686,503662,502638,501614,500590,499566,498542,497518,496494,529263,528239,527215,526191,525167,524143,523119,522095,521071,520047,519023,517999,516975,515951,514927,513903,512879,511855,510831,509807,508783,507759,506735,505711,504687,503663,502639,501615,500591,499567,498543,497519,496495,529264,528240,527216,526192,525168,524144,523120,522096,521072,520048,519024,518000,516976,515952,514928,513904,512880,511856,510832,509808,508784,507760,506736,505712,504688,503664,502640,501616,500592,499568,498544,497520,496496,529265,528241,527217,526193,525169,524145,523121,522097,521073,520049,519025,518001,516977,515953,514929,513905,512881,511857,510833,509809,508785,507761,506737,505713,504689,503665,502641,501617,500593,499569,498545,497521,496497,529266,528242,527218,526194,525170,524146,523122,522098,521074,520050,519026,518002,516978,515954,514930,513906,512882,511858,510834,509810,508786,507762,506738,505714,504690,503666,502642,501618,500594,499570,498546,497522,496498,529267,528243,527219,526195,525171,524147,523123,522099,521075,520051,519027,518003,516979,515955,514931,513907,512883,511859,510835,509811,508787,507763,506739,505715,504691,503667,502643,501619,500595,499571,498547,497523,496499,529268,528244,527220,526196,525172,524148,523124,522100,521076,520052,519028,518004,516980,515956,514932,513908,512884,511860,510836,509812,508788,507764,506740,505716,504692,503668,502644,501620,500596,499572,498548,497524,496500,529269,528245,527221,526197,525173,524149,523125,522101,521077,520053,519029,518005,516981,515957,514933,513909,512885,511861,510837,509813,508789,507765,506741,505717,504693,503669,502645,501621,500597,499573,498549,497525,496501,529270,528246,527222,526198,525174,524150,523126,522102,521078,520054,519030,518006,516982,515958,514934,513910,512886,511862,510838,509814,508790,507766,506742,505718,504694,503670,502646,501622,500598,499574,498550,497526,496502,529271,528247,527223,526199,525175,524151,523127,522103,521079,520055,519031,518007,516983,515959,514935,513911,512887,511863,510839,509815,508791,507767,506743,505719,504695,503671,502647,501623,500599,499575,498551,497527,496503,529272,528248,527224,526200,525176,524152,523128,522104,521080,520056,519032,518008,516984,515960,514936,513912,512888,511864,510840,509816,508792,507768,506744,505720,504696,503672,502648,501624,500600,499576,498552,497528,496504],"obstacle":[529915,495099,529916,495100,529917,495101,529918,495102,529919,495103,529920,495104,529921,495105,529922,495106,529923,495107,529924,495108,529925,495109,529926,495110,529927,495111,529928,495112,529929,495113,529930,495114,529931,495115,529932,495116,529933,495117,529934,495118,529935,495119,529936,495120,529937,495121,529938,495122,529939,495123,529940,495124,529941,495125,529942,495126,529943,495127,529944,495128,529945,495129,529946,495130,529947,495131,529948,495132,529949,495133,529950,495134,529951,495135,529952,495136,529953,495137,529954,495138,529955,495139,529956,495140,529957,495141,529958,495142,529959,495143,529960,495144,529961,495145,529962,495146,529963,495147,529964,495148,529965,495149,529966,495150,529967,495151,529968,495152,529969,495153,529970,495154,529971,495155,529972,495156,529973,495157,529974,495158,529975,495159,529976,495160,529977,495161,529978,495162,529979,495163,529980,495164,529981,495165,529982,495166,529983,495167,529984,495168,529985,495169,529986,495170,529987,495171,529988,495172,529989,495173,529990,495174,529991,495175,529992,495176,529993,495177,529994,495178,529995,495179,529996,495180,529997,495181,529998,495182,529999,495183,530000,495184,530001,495185,530002,495186,530003,495187,530004,495188,530005,495189,530006,495190,530007,495191,530008,495192,530009,495193,530010,495194,530011,495195,530012,495196,530013,495197,530014,495198,530015,495199,530016,495200,530017,495201,530018,495202,530019,495203,530020,495204,530021,495205,530022,495206,530023,495207,530024,495208,530025,495209,530026,495210,530027,495211,530028,495212,530029,495213,530030,495214,530031,495215,530032,495216,530033,495217,530034,495218,530035,495219,530036,495220,530037,495221,530038,495222,530039,495223,530040,495224,530041,495225,530042,495226,530043,495227,530044,495228,530045,495229,530046,495230,530047,495231,530048,495232,530049,495233,530050,495234,530051,495235,530052,495236,530053,495237,530054,495238,530055,495239,530056,495240,530057,495241,530058,495242,530059,495243,530060,495244,530061,495245,530062,495246,530063,495247,530064,495248,530065,495249,530066,495250,530067,495251,530068,495252,530069,495253,530070,495254,530071,495255,530072,495256,530073,495257,530074,495258,530075,495259,530076,495260,530077,495261,530078,495262,530079,495263,530080,495264,530081,495265,530082,495266,530083,495267,530084,495268,530085,495269,530086,495270,530087,495271,530088,495272,530089,495273,530090,495274,530091,495275,530092,495276,530093,495277,530094,495278,530095,495279,530096,495280,530097,495281,530098,495282,530099,495283,530100,495284,530101,495285,530102,495286,530103,495287,530104,495288,530105,495289,530106,495290,530107,495291,530108,495292,530109,495293,530110,495294,530111,495295,530112,495296,530113,495297,530114,495298,530115,495299,530116,495300,530117,495301,530118,495302,530119,495303,530120,495304,530121,495305,530122,495306,530123,495307,530124,495308,530125,495309,530126,495310,530127,495311,530128,495312,530129,495313,530130,495314,530131,495315,530132,495316,530133,495317,530134,495318,530135,495319,530136,495320,530137,495321,530138,495322,530139,495323,530140,495324,530141,495325,530142,495326,530143,495327,530144,495328,530145,495329,530146,495330,530147,495331,530148,495332,530149,495333,530150,495334,530151,495335,530152,495336,530153,495337,530154,495338,530155,495339,530156,495340,530157,495341,530158,495342,530159,495343,530160,495344,530161,495345,530162,495346,530163,495347,530164,495348,530165,495349,530166,495350,530167,495351,530168,495352,530169,495353,530170,495354,530171,495355,530172,495356,530173,495357,530174,495358,530175,495359,530176,495360,530177,495361,530178,495362,530179,495363,530180,495364,530181,495365,530182,495366,530183,495367,530184,495368,530185,495369,530186,495370,530187,495371,530188,495372,530189,495373,530190,495374,530191,495375,530192,495376,530193,495377,530194,495378,530195,495379,530196,495380,530197,495381,530198,495382,530199,495383,530200,495384,530201,495385,530202,495386,530203,495387,530204,495388,530205,495389,530206,495390,530207,495391,530208,495392,530209,495393,530210,495394,530211,495395,530212,495396,530213,495397,530214,495398,530215,495399,530216,495400,530217,495401,530218,495402,530219,495403,530220,495404,530221,495405,530222,495406,530223,495407,530224,495408,530225,495409,530226,495410,530227,495411,530228,495412,530229,495413,530230,495414,530231,495415,530232,495416,530233,495417,530234,495418,530235,495419,530236,495420,530237,495421,530238,495422,530239,495423,530240,495424,530241,495425,530242,495426,530243,495427,530244,495428,530245,495429,530246,495430,530247,495431,530248,495432,530249,495433,530250,495434,530251,495435,530252,495436,530253,495437,530254,495438,530255,495439,530256,495440,530257,495441,530258,495442,530259,495443,530260,495444,530261,495445,530262,495446,530263,495447,530264,495448,530265,495449,530266,495450,530267,495451,530268,495452,530269,495453,530270,495454,530271,495455,530272,495456,530273,495457,530274,495458,530275,495459,530276,495460,530277,495461,530278,495462,530279,495463,530280,495464,530281,495465,530282,495466,530283,495467,530284,495468,530285,495469,530286,495470,530287,495471,530288,495472,530289,495473,530290,495474,530291,495475,530292,495476,530293,495477,530294,495478,530295,495479,530296,495480,530297,495481,529915,530297,528891,529273,527867,528249,526843,527225,525819,526201,524795,525177,523771,524153,522747,523129,521723,522105,520699,521081,519675,520057,518651,519033,517627,518009,516603,516985,515579,515961,514555,514937,513531,513913,512507,512889,511483,511865,510459,510841,509435,509817,508411,508793,507387,507769,506363,506745,505339,505721,504315,504697,503291,503673,502267,502649,501243,501625,500219,500601,499195,499577,498171,498553,497147,497529,496123,496505,495099,495481]}},"path":{"current_angle":0,"points":[25600,25600,26400,25600,26400,24400,27600,25600,27600,24400,27600,25600,28200,25600,28400,25600,28400,24400,29200,24400,29200,25600,28400,25600,29400,25600,30000,25600,30800,25600,31000,24400,31400,25200,31800,24400,32000,25600,32600,25600,33200,24400,33800,25600,33600,25200,32800,25200,33600,25200,33800,25600,34400,25600,34400,24400,34800,24400,35200,24800,34800,25200,34400,25200,34400,25600,35600,25600,36200,25600,37000,25600,37000,24400,37800,24400,38200,25000,37800,25600,37000,25600,38200,25600,38800,25600,39400,24400,40000,25600,39800,25200,39000,25200,39800,25200,40000,25600,40600,25600,41200,25600,41200,24400,40600,24400,41800,24400,41200,24400,41200,25600,41800,25600,42400,25600,43000,24400,43600,25600,43400,25200,42600,25200,43400,25200,43600,25600,44200,25600]},"charger":[25600,25600],"robot":[44200,25600],"isDefaultMap":true} +// in this old format it requires less space. todo: pack it into binary maybe? +FallbackMap.oldData = {"map_index":0,"map_sequence":0,"image":{"position":{"top":0,"left":0},"dimensions":{"height":1024,"width":1024},"box":{"minX":300,"maxX":700,"minY":300,"maxY":700},"segments":{"count":0,"center":{},"borders":[],"neighbours":{}},"pixels":{"floor":[528892,527868,526844,525820,524796,523772,522748,521724,520700,519676,518652,517628,516604,515580,514556,513532,512508,511484,510460,509436,508412,507388,506364,505340,504316,503292,502268,501244,500220,499196,498172,497148,496124,528893,527869,526845,525821,524797,523773,522749,521725,520701,519677,518653,517629,516605,515581,514557,513533,512509,511485,510461,509437,508413,507389,506365,505341,504317,503293,502269,501245,500221,499197,498173,497149,496125,528894,527870,526846,525822,524798,523774,522750,521726,520702,519678,518654,517630,516606,515582,514558,513534,512510,511486,510462,509438,508414,507390,506366,505342,504318,503294,502270,501246,500222,499198,498174,497150,496126,528895,527871,526847,525823,524799,523775,522751,521727,520703,519679,518655,517631,516607,515583,514559,513535,512511,511487,510463,509439,508415,507391,506367,505343,504319,503295,502271,501247,500223,499199,498175,497151,496127,528896,527872,526848,525824,524800,523776,522752,521728,520704,519680,518656,517632,516608,515584,514560,513536,512512,511488,510464,509440,508416,507392,506368,505344,504320,503296,502272,501248,500224,499200,498176,497152,496128,528897,527873,526849,525825,524801,523777,522753,521729,520705,519681,518657,517633,516609,515585,514561,513537,512513,511489,510465,509441,508417,507393,506369,505345,504321,503297,502273,501249,500225,499201,498177,497153,496129,528898,527874,526850,525826,524802,523778,522754,521730,520706,519682,518658,517634,516610,515586,514562,513538,512514,511490,510466,509442,508418,507394,506370,505346,504322,503298,502274,501250,500226,499202,498178,497154,496130,528899,527875,526851,525827,524803,523779,522755,521731,520707,519683,518659,517635,516611,515587,514563,513539,512515,511491,510467,509443,508419,507395,506371,505347,504323,503299,502275,501251,500227,499203,498179,497155,496131,528900,527876,526852,525828,524804,523780,522756,521732,520708,519684,518660,517636,516612,515588,514564,513540,512516,511492,510468,509444,508420,507396,506372,505348,504324,503300,502276,501252,500228,499204,498180,497156,496132,528901,527877,526853,525829,524805,523781,522757,521733,520709,519685,518661,517637,516613,515589,514565,513541,512517,511493,510469,509445,508421,507397,506373,505349,504325,503301,502277,501253,500229,499205,498181,497157,496133,528902,527878,526854,525830,524806,523782,522758,521734,520710,519686,518662,517638,516614,515590,514566,513542,512518,511494,510470,509446,508422,507398,506374,505350,504326,503302,502278,501254,500230,499206,498182,497158,496134,528903,527879,526855,525831,524807,523783,522759,521735,520711,519687,518663,517639,516615,515591,514567,513543,512519,511495,510471,509447,508423,507399,506375,505351,504327,503303,502279,501255,500231,499207,498183,497159,496135,528904,527880,526856,525832,524808,523784,522760,521736,520712,519688,518664,517640,516616,515592,514568,513544,512520,511496,510472,509448,508424,507400,506376,505352,504328,503304,502280,501256,500232,499208,498184,497160,496136,528905,527881,526857,525833,524809,523785,522761,521737,520713,519689,518665,517641,516617,515593,514569,513545,512521,511497,510473,509449,508425,507401,506377,505353,504329,503305,502281,501257,500233,499209,498185,497161,496137,528906,527882,526858,525834,524810,523786,522762,521738,520714,519690,518666,517642,516618,515594,514570,513546,512522,511498,510474,509450,508426,507402,506378,505354,504330,503306,502282,501258,500234,499210,498186,497162,496138,528907,527883,526859,525835,524811,523787,522763,521739,520715,519691,518667,517643,516619,515595,514571,513547,512523,511499,510475,509451,508427,507403,506379,505355,504331,503307,502283,501259,500235,499211,498187,497163,496139,528908,527884,526860,525836,524812,523788,522764,521740,520716,519692,518668,517644,516620,515596,514572,513548,512524,511500,510476,509452,508428,507404,506380,505356,504332,503308,502284,501260,500236,499212,498188,497164,496140,528909,527885,526861,525837,524813,523789,522765,521741,520717,519693,518669,517645,516621,515597,514573,513549,512525,511501,510477,509453,508429,507405,506381,505357,504333,503309,502285,501261,500237,499213,498189,497165,496141,528910,527886,526862,525838,524814,523790,522766,521742,520718,519694,518670,517646,516622,515598,514574,513550,512526,511502,510478,509454,508430,507406,506382,505358,504334,503310,502286,501262,500238,499214,498190,497166,496142,528911,527887,526863,525839,524815,523791,522767,521743,520719,519695,518671,517647,516623,515599,514575,513551,512527,511503,510479,509455,508431,507407,506383,505359,504335,503311,502287,501263,500239,499215,498191,497167,496143,528912,527888,526864,525840,524816,523792,522768,521744,520720,519696,518672,517648,516624,515600,514576,513552,512528,511504,510480,509456,508432,507408,506384,505360,504336,503312,502288,501264,500240,499216,498192,497168,496144,528913,527889,526865,525841,524817,523793,522769,521745,520721,519697,518673,517649,516625,515601,514577,513553,512529,511505,510481,509457,508433,507409,506385,505361,504337,503313,502289,501265,500241,499217,498193,497169,496145,528914,527890,526866,525842,524818,523794,522770,521746,520722,519698,518674,517650,516626,515602,514578,513554,512530,511506,510482,509458,508434,507410,506386,505362,504338,503314,502290,501266,500242,499218,498194,497170,496146,528915,527891,526867,525843,524819,523795,522771,521747,520723,519699,518675,517651,516627,515603,514579,513555,512531,511507,510483,509459,508435,507411,506387,505363,504339,503315,502291,501267,500243,499219,498195,497171,496147,528916,527892,526868,525844,524820,523796,522772,521748,520724,519700,518676,517652,516628,515604,514580,513556,512532,511508,510484,509460,508436,507412,506388,505364,504340,503316,502292,501268,500244,499220,498196,497172,496148,528917,527893,526869,525845,524821,523797,522773,521749,520725,519701,518677,517653,516629,515605,514581,513557,512533,511509,510485,509461,508437,507413,506389,505365,504341,503317,502293,501269,500245,499221,498197,497173,496149,528918,527894,526870,525846,524822,523798,522774,521750,520726,519702,518678,517654,516630,515606,514582,513558,512534,511510,510486,509462,508438,507414,506390,505366,504342,503318,502294,501270,500246,499222,498198,497174,496150,528919,527895,526871,525847,524823,523799,522775,521751,520727,519703,518679,517655,516631,515607,514583,513559,512535,511511,510487,509463,508439,507415,506391,505367,504343,503319,502295,501271,500247,499223,498199,497175,496151,528920,527896,526872,525848,524824,523800,522776,521752,520728,519704,518680,517656,516632,515608,514584,513560,512536,511512,510488,509464,508440,507416,506392,505368,504344,503320,502296,501272,500248,499224,498200,497176,496152,528921,527897,526873,525849,524825,523801,522777,521753,520729,519705,518681,517657,516633,515609,514585,513561,512537,511513,510489,509465,508441,507417,506393,505369,504345,503321,502297,501273,500249,499225,498201,497177,496153,528922,527898,526874,525850,524826,523802,522778,521754,520730,519706,518682,517658,516634,515610,514586,513562,512538,511514,510490,509466,508442,507418,506394,505370,504346,503322,502298,501274,500250,499226,498202,497178,496154,528923,527899,526875,525851,524827,523803,522779,521755,520731,519707,518683,517659,516635,515611,514587,513563,512539,511515,510491,509467,508443,507419,506395,505371,504347,503323,502299,501275,500251,499227,498203,497179,496155,528924,527900,526876,525852,524828,523804,522780,521756,520732,519708,518684,517660,516636,515612,514588,513564,512540,511516,510492,509468,508444,507420,506396,505372,504348,503324,502300,501276,500252,499228,498204,497180,496156,528925,527901,526877,525853,524829,523805,522781,521757,520733,519709,518685,517661,516637,515613,514589,513565,512541,511517,510493,509469,508445,507421,506397,505373,504349,503325,502301,501277,500253,499229,498205,497181,496157,528926,527902,526878,525854,524830,523806,522782,521758,520734,519710,518686,517662,516638,515614,514590,513566,512542,511518,510494,509470,508446,507422,506398,505374,504350,503326,502302,501278,500254,499230,498206,497182,496158,528927,527903,526879,525855,524831,523807,522783,521759,520735,519711,518687,517663,516639,515615,514591,513567,512543,511519,510495,509471,508447,507423,506399,505375,504351,503327,502303,501279,500255,499231,498207,497183,496159,528928,527904,526880,525856,524832,523808,522784,521760,520736,519712,518688,517664,516640,515616,514592,513568,512544,511520,510496,509472,508448,507424,506400,505376,504352,503328,502304,501280,500256,499232,498208,497184,496160,528929,527905,526881,525857,524833,523809,522785,521761,520737,519713,518689,517665,516641,515617,514593,513569,512545,511521,510497,509473,508449,507425,506401,505377,504353,503329,502305,501281,500257,499233,498209,497185,496161,528930,527906,526882,525858,524834,523810,522786,521762,520738,519714,518690,517666,516642,515618,514594,513570,512546,511522,510498,509474,508450,507426,506402,505378,504354,503330,502306,501282,500258,499234,498210,497186,496162,528931,527907,526883,525859,524835,523811,522787,521763,520739,519715,518691,517667,516643,515619,514595,513571,512547,511523,510499,509475,508451,507427,506403,505379,504355,503331,502307,501283,500259,499235,498211,497187,496163,528932,527908,526884,525860,524836,523812,522788,521764,520740,519716,518692,517668,516644,515620,514596,513572,512548,511524,510500,509476,508452,507428,506404,505380,504356,503332,502308,501284,500260,499236,498212,497188,496164,528933,527909,526885,525861,524837,523813,522789,521765,520741,519717,518693,517669,516645,515621,514597,513573,512549,511525,510501,509477,508453,507429,506405,505381,504357,503333,502309,501285,500261,499237,498213,497189,496165,528934,527910,526886,525862,524838,523814,522790,521766,520742,519718,518694,517670,516646,515622,514598,513574,512550,511526,510502,509478,508454,507430,506406,505382,504358,503334,502310,501286,500262,499238,498214,497190,496166,528935,527911,526887,525863,524839,523815,522791,521767,520743,519719,518695,517671,516647,515623,514599,513575,512551,511527,510503,509479,508455,507431,506407,505383,504359,503335,502311,501287,500263,499239,498215,497191,496167,528936,527912,526888,525864,524840,523816,522792,521768,520744,519720,518696,517672,516648,515624,514600,513576,512552,511528,510504,509480,508456,507432,506408,505384,504360,503336,502312,501288,500264,499240,498216,497192,496168,528937,527913,526889,525865,524841,523817,522793,521769,520745,519721,518697,517673,516649,515625,514601,513577,512553,511529,510505,509481,508457,507433,506409,505385,504361,503337,502313,501289,500265,499241,498217,497193,496169,528938,527914,526890,525866,524842,523818,522794,521770,520746,519722,518698,517674,516650,515626,514602,513578,512554,511530,510506,509482,508458,507434,506410,505386,504362,503338,502314,501290,500266,499242,498218,497194,496170,528939,527915,526891,525867,524843,523819,522795,521771,520747,519723,518699,517675,516651,515627,514603,513579,512555,511531,510507,509483,508459,507435,506411,505387,504363,503339,502315,501291,500267,499243,498219,497195,496171,528940,527916,526892,525868,524844,523820,522796,521772,520748,519724,518700,517676,516652,515628,514604,513580,512556,511532,510508,509484,508460,507436,506412,505388,504364,503340,502316,501292,500268,499244,498220,497196,496172,528941,527917,526893,525869,524845,523821,522797,521773,520749,519725,518701,517677,516653,515629,514605,513581,512557,511533,510509,509485,508461,507437,506413,505389,504365,503341,502317,501293,500269,499245,498221,497197,496173,528942,527918,526894,525870,524846,523822,522798,521774,520750,519726,518702,517678,516654,515630,514606,513582,512558,511534,510510,509486,508462,507438,506414,505390,504366,503342,502318,501294,500270,499246,498222,497198,496174,528943,527919,526895,525871,524847,523823,522799,521775,520751,519727,518703,517679,516655,515631,514607,513583,512559,511535,510511,509487,508463,507439,506415,505391,504367,503343,502319,501295,500271,499247,498223,497199,496175,528944,527920,526896,525872,524848,523824,522800,521776,520752,519728,518704,517680,516656,515632,514608,513584,512560,511536,510512,509488,508464,507440,506416,505392,504368,503344,502320,501296,500272,499248,498224,497200,496176,528945,527921,526897,525873,524849,523825,522801,521777,520753,519729,518705,517681,516657,515633,514609,513585,512561,511537,510513,509489,508465,507441,506417,505393,504369,503345,502321,501297,500273,499249,498225,497201,496177,528946,527922,526898,525874,524850,523826,522802,521778,520754,519730,518706,517682,516658,515634,514610,513586,512562,511538,510514,509490,508466,507442,506418,505394,504370,503346,502322,501298,500274,499250,498226,497202,496178,528947,527923,526899,525875,524851,523827,522803,521779,520755,519731,518707,517683,516659,515635,514611,513587,512563,511539,510515,509491,508467,507443,506419,505395,504371,503347,502323,501299,500275,499251,498227,497203,496179,528948,527924,526900,525876,524852,523828,522804,521780,520756,519732,518708,517684,516660,515636,514612,513588,512564,511540,510516,509492,508468,507444,506420,505396,504372,503348,502324,501300,500276,499252,498228,497204,496180,528949,527925,526901,525877,524853,523829,522805,521781,520757,519733,518709,517685,516661,515637,514613,513589,512565,511541,510517,509493,508469,507445,506421,505397,504373,503349,502325,501301,500277,499253,498229,497205,496181,528950,527926,526902,525878,524854,523830,522806,521782,520758,519734,518710,517686,516662,515638,514614,513590,512566,511542,510518,509494,508470,507446,506422,505398,504374,503350,502326,501302,500278,499254,498230,497206,496182,528951,527927,526903,525879,524855,523831,522807,521783,520759,519735,518711,517687,516663,515639,514615,513591,512567,511543,510519,509495,508471,507447,506423,505399,504375,503351,502327,501303,500279,499255,498231,497207,496183,528952,527928,526904,525880,524856,523832,522808,521784,520760,519736,518712,517688,516664,515640,514616,513592,512568,511544,510520,509496,508472,507448,506424,505400,504376,503352,502328,501304,500280,499256,498232,497208,496184,528953,527929,526905,525881,524857,523833,522809,521785,520761,519737,518713,517689,516665,515641,514617,513593,512569,511545,510521,509497,508473,507449,506425,505401,504377,503353,502329,501305,500281,499257,498233,497209,496185,528954,527930,526906,525882,524858,523834,522810,521786,520762,519738,518714,517690,516666,515642,514618,513594,512570,511546,510522,509498,508474,507450,506426,505402,504378,503354,502330,501306,500282,499258,498234,497210,496186,528955,527931,526907,525883,524859,523835,522811,521787,520763,519739,518715,517691,516667,515643,514619,513595,512571,511547,510523,509499,508475,507451,506427,505403,504379,503355,502331,501307,500283,499259,498235,497211,496187,528956,527932,526908,525884,524860,523836,522812,521788,520764,519740,518716,517692,516668,515644,514620,513596,512572,511548,510524,509500,508476,507452,506428,505404,504380,503356,502332,501308,500284,499260,498236,497212,496188,528957,527933,526909,525885,524861,523837,522813,521789,520765,519741,518717,517693,516669,515645,514621,513597,512573,511549,510525,509501,508477,507453,506429,505405,504381,503357,502333,501309,500285,499261,498237,497213,496189,528958,527934,526910,525886,524862,523838,522814,521790,520766,519742,518718,517694,516670,515646,514622,513598,512574,511550,510526,509502,508478,507454,506430,505406,504382,503358,502334,501310,500286,499262,498238,497214,496190,528959,527935,526911,525887,524863,523839,522815,521791,520767,519743,518719,517695,516671,515647,514623,513599,512575,511551,510527,509503,508479,507455,506431,505407,504383,503359,502335,501311,500287,499263,498239,497215,496191,528960,527936,526912,525888,524864,523840,522816,521792,520768,519744,518720,517696,516672,515648,514624,513600,512576,511552,510528,509504,508480,507456,506432,505408,504384,503360,502336,501312,500288,499264,498240,497216,496192,528961,527937,526913,525889,524865,523841,522817,521793,520769,519745,518721,517697,516673,515649,514625,513601,512577,511553,510529,509505,508481,507457,506433,505409,504385,503361,502337,501313,500289,499265,498241,497217,496193,528962,527938,526914,525890,524866,523842,522818,521794,520770,519746,518722,517698,516674,515650,514626,513602,512578,511554,510530,509506,508482,507458,506434,505410,504386,503362,502338,501314,500290,499266,498242,497218,496194,528963,527939,526915,525891,524867,523843,522819,521795,520771,519747,518723,517699,516675,515651,514627,513603,512579,511555,510531,509507,508483,507459,506435,505411,504387,503363,502339,501315,500291,499267,498243,497219,496195,528964,527940,526916,525892,524868,523844,522820,521796,520772,519748,518724,517700,516676,515652,514628,513604,512580,511556,510532,509508,508484,507460,506436,505412,504388,503364,502340,501316,500292,499268,498244,497220,496196,528965,527941,526917,525893,524869,523845,522821,521797,520773,519749,518725,517701,516677,515653,514629,513605,512581,511557,510533,509509,508485,507461,506437,505413,504389,503365,502341,501317,500293,499269,498245,497221,496197,528966,527942,526918,525894,524870,523846,522822,521798,520774,519750,518726,517702,516678,515654,514630,513606,512582,511558,510534,509510,508486,507462,506438,505414,504390,503366,502342,501318,500294,499270,498246,497222,496198,528967,527943,526919,525895,524871,523847,522823,521799,520775,519751,518727,517703,516679,515655,514631,513607,512583,511559,510535,509511,508487,507463,506439,505415,504391,503367,502343,501319,500295,499271,498247,497223,496199,528968,527944,526920,525896,524872,523848,522824,521800,520776,519752,518728,517704,516680,515656,514632,513608,512584,511560,510536,509512,508488,507464,506440,505416,504392,503368,502344,501320,500296,499272,498248,497224,496200,528969,527945,526921,525897,524873,523849,522825,521801,520777,519753,518729,517705,516681,515657,514633,513609,512585,511561,510537,509513,508489,507465,506441,505417,504393,503369,502345,501321,500297,499273,498249,497225,496201,528970,527946,526922,525898,524874,523850,522826,521802,520778,519754,518730,517706,516682,515658,514634,513610,512586,511562,510538,509514,508490,507466,506442,505418,504394,503370,502346,501322,500298,499274,498250,497226,496202,528971,527947,526923,525899,524875,523851,522827,521803,520779,519755,518731,517707,516683,515659,514635,513611,512587,511563,510539,509515,508491,507467,506443,505419,504395,503371,502347,501323,500299,499275,498251,497227,496203,528972,527948,526924,525900,524876,523852,522828,521804,520780,519756,518732,517708,516684,515660,514636,513612,512588,511564,510540,509516,508492,507468,506444,505420,504396,503372,502348,501324,500300,499276,498252,497228,496204,528973,527949,526925,525901,524877,523853,522829,521805,520781,519757,518733,517709,516685,515661,514637,513613,512589,511565,510541,509517,508493,507469,506445,505421,504397,503373,502349,501325,500301,499277,498253,497229,496205,528974,527950,526926,525902,524878,523854,522830,521806,520782,519758,518734,517710,516686,515662,514638,513614,512590,511566,510542,509518,508494,507470,506446,505422,504398,503374,502350,501326,500302,499278,498254,497230,496206,528975,527951,526927,525903,524879,523855,522831,521807,520783,519759,518735,517711,516687,515663,514639,513615,512591,511567,510543,509519,508495,507471,506447,505423,504399,503375,502351,501327,500303,499279,498255,497231,496207,528976,527952,526928,525904,524880,523856,522832,521808,520784,519760,518736,517712,516688,515664,514640,513616,512592,511568,510544,509520,508496,507472,506448,505424,504400,503376,502352,501328,500304,499280,498256,497232,496208,528977,527953,526929,525905,524881,523857,522833,521809,520785,519761,518737,517713,516689,515665,514641,513617,512593,511569,510545,509521,508497,507473,506449,505425,504401,503377,502353,501329,500305,499281,498257,497233,496209,528978,527954,526930,525906,524882,523858,522834,521810,520786,519762,518738,517714,516690,515666,514642,513618,512594,511570,510546,509522,508498,507474,506450,505426,504402,503378,502354,501330,500306,499282,498258,497234,496210,528979,527955,526931,525907,524883,523859,522835,521811,520787,519763,518739,517715,516691,515667,514643,513619,512595,511571,510547,509523,508499,507475,506451,505427,504403,503379,502355,501331,500307,499283,498259,497235,496211,528980,527956,526932,525908,524884,523860,522836,521812,520788,519764,518740,517716,516692,515668,514644,513620,512596,511572,510548,509524,508500,507476,506452,505428,504404,503380,502356,501332,500308,499284,498260,497236,496212,528981,527957,526933,525909,524885,523861,522837,521813,520789,519765,518741,517717,516693,515669,514645,513621,512597,511573,510549,509525,508501,507477,506453,505429,504405,503381,502357,501333,500309,499285,498261,497237,496213,528982,527958,526934,525910,524886,523862,522838,521814,520790,519766,518742,517718,516694,515670,514646,513622,512598,511574,510550,509526,508502,507478,506454,505430,504406,503382,502358,501334,500310,499286,498262,497238,496214,528983,527959,526935,525911,524887,523863,522839,521815,520791,519767,518743,517719,516695,515671,514647,513623,512599,511575,510551,509527,508503,507479,506455,505431,504407,503383,502359,501335,500311,499287,498263,497239,496215,528984,527960,526936,525912,524888,523864,522840,521816,520792,519768,518744,517720,516696,515672,514648,513624,512600,511576,510552,509528,508504,507480,506456,505432,504408,503384,502360,501336,500312,499288,498264,497240,496216,528985,527961,526937,525913,524889,523865,522841,521817,520793,519769,518745,517721,516697,515673,514649,513625,512601,511577,510553,509529,508505,507481,506457,505433,504409,503385,502361,501337,500313,499289,498265,497241,496217,528986,527962,526938,525914,524890,523866,522842,521818,520794,519770,518746,517722,516698,515674,514650,513626,512602,511578,510554,509530,508506,507482,506458,505434,504410,503386,502362,501338,500314,499290,498266,497242,496218,528987,527963,526939,525915,524891,523867,522843,521819,520795,519771,518747,517723,516699,515675,514651,513627,512603,511579,510555,509531,508507,507483,506459,505435,504411,503387,502363,501339,500315,499291,498267,497243,496219,528988,527964,526940,525916,524892,523868,522844,521820,520796,519772,518748,517724,516700,515676,514652,513628,512604,511580,510556,509532,508508,507484,506460,505436,504412,503388,502364,501340,500316,499292,498268,497244,496220,528989,527965,526941,525917,524893,523869,522845,521821,520797,519773,518749,517725,516701,515677,514653,513629,512605,511581,510557,509533,508509,507485,506461,505437,504413,503389,502365,501341,500317,499293,498269,497245,496221,528990,527966,526942,525918,524894,523870,522846,521822,520798,519774,518750,517726,516702,515678,514654,513630,512606,511582,510558,509534,508510,507486,506462,505438,504414,503390,502366,501342,500318,499294,498270,497246,496222,528991,527967,526943,525919,524895,523871,522847,521823,520799,519775,518751,517727,516703,515679,514655,513631,512607,511583,510559,509535,508511,507487,506463,505439,504415,503391,502367,501343,500319,499295,498271,497247,496223,528992,527968,526944,525920,524896,523872,522848,521824,520800,519776,518752,517728,516704,515680,514656,513632,512608,511584,510560,509536,508512,507488,506464,505440,504416,503392,502368,501344,500320,499296,498272,497248,496224,528993,527969,526945,525921,524897,523873,522849,521825,520801,519777,518753,517729,516705,515681,514657,513633,512609,511585,510561,509537,508513,507489,506465,505441,504417,503393,502369,501345,500321,499297,498273,497249,496225,528994,527970,526946,525922,524898,523874,522850,521826,520802,519778,518754,517730,516706,515682,514658,513634,512610,511586,510562,509538,508514,507490,506466,505442,504418,503394,502370,501346,500322,499298,498274,497250,496226,528995,527971,526947,525923,524899,523875,522851,521827,520803,519779,518755,517731,516707,515683,514659,513635,512611,511587,510563,509539,508515,507491,506467,505443,504419,503395,502371,501347,500323,499299,498275,497251,496227,528996,527972,526948,525924,524900,523876,522852,521828,520804,519780,518756,517732,516708,515684,514660,513636,512612,511588,510564,509540,508516,507492,506468,505444,504420,503396,502372,501348,500324,499300,498276,497252,496228,528997,527973,526949,525925,524901,523877,522853,521829,520805,519781,518757,517733,516709,515685,514661,513637,512613,511589,510565,509541,508517,507493,506469,505445,504421,503397,502373,501349,500325,499301,498277,497253,496229,528998,527974,526950,525926,524902,523878,522854,521830,520806,519782,518758,517734,516710,515686,514662,513638,512614,511590,510566,509542,508518,507494,506470,505446,504422,503398,502374,501350,500326,499302,498278,497254,496230,528999,527975,526951,525927,524903,523879,522855,521831,520807,519783,518759,517735,516711,515687,514663,513639,512615,511591,510567,509543,508519,507495,506471,505447,504423,503399,502375,501351,500327,499303,498279,497255,496231,529000,527976,526952,525928,524904,523880,522856,521832,520808,519784,518760,517736,516712,515688,514664,513640,512616,511592,510568,509544,508520,507496,506472,505448,504424,503400,502376,501352,500328,499304,498280,497256,496232,529001,527977,526953,525929,524905,523881,522857,521833,520809,519785,518761,517737,516713,515689,514665,513641,512617,511593,510569,509545,508521,507497,506473,505449,504425,503401,502377,501353,500329,499305,498281,497257,496233,529002,527978,526954,525930,524906,523882,522858,521834,520810,519786,518762,517738,516714,515690,514666,513642,512618,511594,510570,509546,508522,507498,506474,505450,504426,503402,502378,501354,500330,499306,498282,497258,496234,529003,527979,526955,525931,524907,523883,522859,521835,520811,519787,518763,517739,516715,515691,514667,513643,512619,511595,510571,509547,508523,507499,506475,505451,504427,503403,502379,501355,500331,499307,498283,497259,496235,529004,527980,526956,525932,524908,523884,522860,521836,520812,519788,518764,517740,516716,515692,514668,513644,512620,511596,510572,509548,508524,507500,506476,505452,504428,503404,502380,501356,500332,499308,498284,497260,496236,529005,527981,526957,525933,524909,523885,522861,521837,520813,519789,518765,517741,516717,515693,514669,513645,512621,511597,510573,509549,508525,507501,506477,505453,504429,503405,502381,501357,500333,499309,498285,497261,496237,529006,527982,526958,525934,524910,523886,522862,521838,520814,519790,518766,517742,516718,515694,514670,513646,512622,511598,510574,509550,508526,507502,506478,505454,504430,503406,502382,501358,500334,499310,498286,497262,496238,529007,527983,526959,525935,524911,523887,522863,521839,520815,519791,518767,517743,516719,515695,514671,513647,512623,511599,510575,509551,508527,507503,506479,505455,504431,503407,502383,501359,500335,499311,498287,497263,496239,529008,527984,526960,525936,524912,523888,522864,521840,520816,519792,518768,517744,516720,515696,514672,513648,512624,511600,510576,509552,508528,507504,506480,505456,504432,503408,502384,501360,500336,499312,498288,497264,496240,529009,527985,526961,525937,524913,523889,522865,521841,520817,519793,518769,517745,516721,515697,514673,513649,512625,511601,510577,509553,508529,507505,506481,505457,504433,503409,502385,501361,500337,499313,498289,497265,496241,529010,527986,526962,525938,524914,523890,522866,521842,520818,519794,518770,517746,516722,515698,514674,513650,512626,511602,510578,509554,508530,507506,506482,505458,504434,503410,502386,501362,500338,499314,498290,497266,496242,529011,527987,526963,525939,524915,523891,522867,521843,520819,519795,518771,517747,516723,515699,514675,513651,512627,511603,510579,509555,508531,507507,506483,505459,504435,503411,502387,501363,500339,499315,498291,497267,496243,529012,527988,526964,525940,524916,523892,522868,521844,520820,519796,518772,517748,516724,515700,514676,513652,512628,511604,510580,509556,508532,507508,506484,505460,504436,503412,502388,501364,500340,499316,498292,497268,496244,529013,527989,526965,525941,524917,523893,522869,521845,520821,519797,518773,517749,516725,515701,514677,513653,512629,511605,510581,509557,508533,507509,506485,505461,504437,503413,502389,501365,500341,499317,498293,497269,496245,529014,527990,526966,525942,524918,523894,522870,521846,520822,519798,518774,517750,516726,515702,514678,513654,512630,511606,510582,509558,508534,507510,506486,505462,504438,503414,502390,501366,500342,499318,498294,497270,496246,529015,527991,526967,525943,524919,523895,522871,521847,520823,519799,518775,517751,516727,515703,514679,513655,512631,511607,510583,509559,508535,507511,506487,505463,504439,503415,502391,501367,500343,499319,498295,497271,496247,529016,527992,526968,525944,524920,523896,522872,521848,520824,519800,518776,517752,516728,515704,514680,513656,512632,511608,510584,509560,508536,507512,506488,505464,504440,503416,502392,501368,500344,499320,498296,497272,496248,529017,527993,526969,525945,524921,523897,522873,521849,520825,519801,518777,517753,516729,515705,514681,513657,512633,511609,510585,509561,508537,507513,506489,505465,504441,503417,502393,501369,500345,499321,498297,497273,496249,529018,527994,526970,525946,524922,523898,522874,521850,520826,519802,518778,517754,516730,515706,514682,513658,512634,511610,510586,509562,508538,507514,506490,505466,504442,503418,502394,501370,500346,499322,498298,497274,496250,529019,527995,526971,525947,524923,523899,522875,521851,520827,519803,518779,517755,516731,515707,514683,513659,512635,511611,510587,509563,508539,507515,506491,505467,504443,503419,502395,501371,500347,499323,498299,497275,496251,529020,527996,526972,525948,524924,523900,522876,521852,520828,519804,518780,517756,516732,515708,514684,513660,512636,511612,510588,509564,508540,507516,506492,505468,504444,503420,502396,501372,500348,499324,498300,497276,496252,529021,527997,526973,525949,524925,523901,522877,521853,520829,519805,518781,517757,516733,515709,514685,513661,512637,511613,510589,509565,508541,507517,506493,505469,504445,503421,502397,501373,500349,499325,498301,497277,496253,529022,527998,526974,525950,524926,523902,522878,521854,520830,519806,518782,517758,516734,515710,514686,513662,512638,511614,510590,509566,508542,507518,506494,505470,504446,503422,502398,501374,500350,499326,498302,497278,496254,529023,527999,526975,525951,524927,523903,522879,521855,520831,519807,518783,517759,516735,515711,514687,513663,512639,511615,510591,509567,508543,507519,506495,505471,504447,503423,502399,501375,500351,499327,498303,497279,496255,529024,528000,526976,525952,524928,523904,522880,521856,520832,519808,518784,517760,516736,515712,514688,513664,512640,511616,510592,509568,508544,507520,506496,505472,504448,503424,502400,501376,500352,499328,498304,497280,496256,529025,528001,526977,525953,524929,523905,522881,521857,520833,519809,518785,517761,516737,515713,514689,513665,512641,511617,510593,509569,508545,507521,506497,505473,504449,503425,502401,501377,500353,499329,498305,497281,496257,529026,528002,526978,525954,524930,523906,522882,521858,520834,519810,518786,517762,516738,515714,514690,513666,512642,511618,510594,509570,508546,507522,506498,505474,504450,503426,502402,501378,500354,499330,498306,497282,496258,529027,528003,526979,525955,524931,523907,522883,521859,520835,519811,518787,517763,516739,515715,514691,513667,512643,511619,510595,509571,508547,507523,506499,505475,504451,503427,502403,501379,500355,499331,498307,497283,496259,529028,528004,526980,525956,524932,523908,522884,521860,520836,519812,518788,517764,516740,515716,514692,513668,512644,511620,510596,509572,508548,507524,506500,505476,504452,503428,502404,501380,500356,499332,498308,497284,496260,529029,528005,526981,525957,524933,523909,522885,521861,520837,519813,518789,517765,516741,515717,514693,513669,512645,511621,510597,509573,508549,507525,506501,505477,504453,503429,502405,501381,500357,499333,498309,497285,496261,529030,528006,526982,525958,524934,523910,522886,521862,520838,519814,518790,517766,516742,515718,514694,513670,512646,511622,510598,509574,508550,507526,506502,505478,504454,503430,502406,501382,500358,499334,498310,497286,496262,529031,528007,526983,525959,524935,523911,522887,521863,520839,519815,518791,517767,516743,515719,514695,513671,512647,511623,510599,509575,508551,507527,506503,505479,504455,503431,502407,501383,500359,499335,498311,497287,496263,529032,528008,526984,525960,524936,523912,522888,521864,520840,519816,518792,517768,516744,515720,514696,513672,512648,511624,510600,509576,508552,507528,506504,505480,504456,503432,502408,501384,500360,499336,498312,497288,496264,529033,528009,526985,525961,524937,523913,522889,521865,520841,519817,518793,517769,516745,515721,514697,513673,512649,511625,510601,509577,508553,507529,506505,505481,504457,503433,502409,501385,500361,499337,498313,497289,496265,529034,528010,526986,525962,524938,523914,522890,521866,520842,519818,518794,517770,516746,515722,514698,513674,512650,511626,510602,509578,508554,507530,506506,505482,504458,503434,502410,501386,500362,499338,498314,497290,496266,529035,528011,526987,525963,524939,523915,522891,521867,520843,519819,518795,517771,516747,515723,514699,513675,512651,511627,510603,509579,508555,507531,506507,505483,504459,503435,502411,501387,500363,499339,498315,497291,496267,529036,528012,526988,525964,524940,523916,522892,521868,520844,519820,518796,517772,516748,515724,514700,513676,512652,511628,510604,509580,508556,507532,506508,505484,504460,503436,502412,501388,500364,499340,498316,497292,496268,529037,528013,526989,525965,524941,523917,522893,521869,520845,519821,518797,517773,516749,515725,514701,513677,512653,511629,510605,509581,508557,507533,506509,505485,504461,503437,502413,501389,500365,499341,498317,497293,496269,529038,528014,526990,525966,524942,523918,522894,521870,520846,519822,518798,517774,516750,515726,514702,513678,512654,511630,510606,509582,508558,507534,506510,505486,504462,503438,502414,501390,500366,499342,498318,497294,496270,529039,528015,526991,525967,524943,523919,522895,521871,520847,519823,518799,517775,516751,515727,514703,513679,512655,511631,510607,509583,508559,507535,506511,505487,504463,503439,502415,501391,500367,499343,498319,497295,496271,529040,528016,526992,525968,524944,523920,522896,521872,520848,519824,518800,517776,516752,515728,514704,513680,512656,511632,510608,509584,508560,507536,506512,505488,504464,503440,502416,501392,500368,499344,498320,497296,496272,529041,528017,526993,525969,524945,523921,522897,521873,520849,519825,518801,517777,516753,515729,514705,513681,512657,511633,510609,509585,508561,507537,506513,505489,504465,503441,502417,501393,500369,499345,498321,497297,496273,529042,528018,526994,525970,524946,523922,522898,521874,520850,519826,518802,517778,516754,515730,514706,513682,512658,511634,510610,509586,508562,507538,506514,505490,504466,503442,502418,501394,500370,499346,498322,497298,496274,529043,528019,526995,525971,524947,523923,522899,521875,520851,519827,518803,517779,516755,515731,514707,513683,512659,511635,510611,509587,508563,507539,506515,505491,504467,503443,502419,501395,500371,499347,498323,497299,496275,529044,528020,526996,525972,524948,523924,522900,521876,520852,519828,518804,517780,516756,515732,514708,513684,512660,511636,510612,509588,508564,507540,506516,505492,504468,503444,502420,501396,500372,499348,498324,497300,496276,529045,528021,526997,525973,524949,523925,522901,521877,520853,519829,518805,517781,516757,515733,514709,513685,512661,511637,510613,509589,508565,507541,506517,505493,504469,503445,502421,501397,500373,499349,498325,497301,496277,529046,528022,526998,525974,524950,523926,522902,521878,520854,519830,518806,517782,516758,515734,514710,513686,512662,511638,510614,509590,508566,507542,506518,505494,504470,503446,502422,501398,500374,499350,498326,497302,496278,529047,528023,526999,525975,524951,523927,522903,521879,520855,519831,518807,517783,516759,515735,514711,513687,512663,511639,510615,509591,508567,507543,506519,505495,504471,503447,502423,501399,500375,499351,498327,497303,496279,529048,528024,527000,525976,524952,523928,522904,521880,520856,519832,518808,517784,516760,515736,514712,513688,512664,511640,510616,509592,508568,507544,506520,505496,504472,503448,502424,501400,500376,499352,498328,497304,496280,529049,528025,527001,525977,524953,523929,522905,521881,520857,519833,518809,517785,516761,515737,514713,513689,512665,511641,510617,509593,508569,507545,506521,505497,504473,503449,502425,501401,500377,499353,498329,497305,496281,529050,528026,527002,525978,524954,523930,522906,521882,520858,519834,518810,517786,516762,515738,514714,513690,512666,511642,510618,509594,508570,507546,506522,505498,504474,503450,502426,501402,500378,499354,498330,497306,496282,529051,528027,527003,525979,524955,523931,522907,521883,520859,519835,518811,517787,516763,515739,514715,513691,512667,511643,510619,509595,508571,507547,506523,505499,504475,503451,502427,501403,500379,499355,498331,497307,496283,529052,528028,527004,525980,524956,523932,522908,521884,520860,519836,518812,517788,516764,515740,514716,513692,512668,511644,510620,509596,508572,507548,506524,505500,504476,503452,502428,501404,500380,499356,498332,497308,496284,529053,528029,527005,525981,524957,523933,522909,521885,520861,519837,518813,517789,516765,515741,514717,513693,512669,511645,510621,509597,508573,507549,506525,505501,504477,503453,502429,501405,500381,499357,498333,497309,496285,529054,528030,527006,525982,524958,523934,522910,521886,520862,519838,518814,517790,516766,515742,514718,513694,512670,511646,510622,509598,508574,507550,506526,505502,504478,503454,502430,501406,500382,499358,498334,497310,496286,529055,528031,527007,525983,524959,523935,522911,521887,520863,519839,518815,517791,516767,515743,514719,513695,512671,511647,510623,509599,508575,507551,506527,505503,504479,503455,502431,501407,500383,499359,498335,497311,496287,529056,528032,527008,525984,524960,523936,522912,521888,520864,519840,518816,517792,516768,515744,514720,513696,512672,511648,510624,509600,508576,507552,506528,505504,504480,503456,502432,501408,500384,499360,498336,497312,496288,529057,528033,527009,525985,524961,523937,522913,521889,520865,519841,518817,517793,516769,515745,514721,513697,512673,511649,510625,509601,508577,507553,506529,505505,504481,503457,502433,501409,500385,499361,498337,497313,496289,529058,528034,527010,525986,524962,523938,522914,521890,520866,519842,518818,517794,516770,515746,514722,513698,512674,511650,510626,509602,508578,507554,506530,505506,504482,503458,502434,501410,500386,499362,498338,497314,496290,529059,528035,527011,525987,524963,523939,522915,521891,520867,519843,518819,517795,516771,515747,514723,513699,512675,511651,510627,509603,508579,507555,506531,505507,504483,503459,502435,501411,500387,499363,498339,497315,496291,529060,528036,527012,525988,524964,523940,522916,521892,520868,519844,518820,517796,516772,515748,514724,513700,512676,511652,510628,509604,508580,507556,506532,505508,504484,503460,502436,501412,500388,499364,498340,497316,496292,529061,528037,527013,525989,524965,523941,522917,521893,520869,519845,518821,517797,516773,515749,514725,513701,512677,511653,510629,509605,508581,507557,506533,505509,504485,503461,502437,501413,500389,499365,498341,497317,496293,529062,528038,527014,525990,524966,523942,522918,521894,520870,519846,518822,517798,516774,515750,514726,513702,512678,511654,510630,509606,508582,507558,506534,505510,504486,503462,502438,501414,500390,499366,498342,497318,496294,529063,528039,527015,525991,524967,523943,522919,521895,520871,519847,518823,517799,516775,515751,514727,513703,512679,511655,510631,509607,508583,507559,506535,505511,504487,503463,502439,501415,500391,499367,498343,497319,496295,529064,528040,527016,525992,524968,523944,522920,521896,520872,519848,518824,517800,516776,515752,514728,513704,512680,511656,510632,509608,508584,507560,506536,505512,504488,503464,502440,501416,500392,499368,498344,497320,496296,529065,528041,527017,525993,524969,523945,522921,521897,520873,519849,518825,517801,516777,515753,514729,513705,512681,511657,510633,509609,508585,507561,506537,505513,504489,503465,502441,501417,500393,499369,498345,497321,496297,529066,528042,527018,525994,524970,523946,522922,521898,520874,519850,518826,517802,516778,515754,514730,513706,512682,511658,510634,509610,508586,507562,506538,505514,504490,503466,502442,501418,500394,499370,498346,497322,496298,529067,528043,527019,525995,524971,523947,522923,521899,520875,519851,518827,517803,516779,515755,514731,513707,512683,511659,510635,509611,508587,507563,506539,505515,504491,503467,502443,501419,500395,499371,498347,497323,496299,529068,528044,527020,525996,524972,523948,522924,521900,520876,519852,518828,517804,516780,515756,514732,513708,512684,511660,510636,509612,508588,507564,506540,505516,504492,503468,502444,501420,500396,499372,498348,497324,496300,529069,528045,527021,525997,524973,523949,522925,521901,520877,519853,518829,517805,516781,515757,514733,513709,512685,511661,510637,509613,508589,507565,506541,505517,504493,503469,502445,501421,500397,499373,498349,497325,496301,529070,528046,527022,525998,524974,523950,522926,521902,520878,519854,518830,517806,516782,515758,514734,513710,512686,511662,510638,509614,508590,507566,506542,505518,504494,503470,502446,501422,500398,499374,498350,497326,496302,529071,528047,527023,525999,524975,523951,522927,521903,520879,519855,518831,517807,516783,515759,514735,513711,512687,511663,510639,509615,508591,507567,506543,505519,504495,503471,502447,501423,500399,499375,498351,497327,496303,529072,528048,527024,526000,524976,523952,522928,521904,520880,519856,518832,517808,516784,515760,514736,513712,512688,511664,510640,509616,508592,507568,506544,505520,504496,503472,502448,501424,500400,499376,498352,497328,496304,529073,528049,527025,526001,524977,523953,522929,521905,520881,519857,518833,517809,516785,515761,514737,513713,512689,511665,510641,509617,508593,507569,506545,505521,504497,503473,502449,501425,500401,499377,498353,497329,496305,529074,528050,527026,526002,524978,523954,522930,521906,520882,519858,518834,517810,516786,515762,514738,513714,512690,511666,510642,509618,508594,507570,506546,505522,504498,503474,502450,501426,500402,499378,498354,497330,496306,529075,528051,527027,526003,524979,523955,522931,521907,520883,519859,518835,517811,516787,515763,514739,513715,512691,511667,510643,509619,508595,507571,506547,505523,504499,503475,502451,501427,500403,499379,498355,497331,496307,529076,528052,527028,526004,524980,523956,522932,521908,520884,519860,518836,517812,516788,515764,514740,513716,512692,511668,510644,509620,508596,507572,506548,505524,504500,503476,502452,501428,500404,499380,498356,497332,496308,529077,528053,527029,526005,524981,523957,522933,521909,520885,519861,518837,517813,516789,515765,514741,513717,512693,511669,510645,509621,508597,507573,506549,505525,504501,503477,502453,501429,500405,499381,498357,497333,496309,529078,528054,527030,526006,524982,523958,522934,521910,520886,519862,518838,517814,516790,515766,514742,513718,512694,511670,510646,509622,508598,507574,506550,505526,504502,503478,502454,501430,500406,499382,498358,497334,496310,529079,528055,527031,526007,524983,523959,522935,521911,520887,519863,518839,517815,516791,515767,514743,513719,512695,511671,510647,509623,508599,507575,506551,505527,504503,503479,502455,501431,500407,499383,498359,497335,496311,529080,528056,527032,526008,524984,523960,522936,521912,520888,519864,518840,517816,516792,515768,514744,513720,512696,511672,510648,509624,508600,507576,506552,505528,504504,503480,502456,501432,500408,499384,498360,497336,496312,529081,528057,527033,526009,524985,523961,522937,521913,520889,519865,518841,517817,516793,515769,514745,513721,512697,511673,510649,509625,508601,507577,506553,505529,504505,503481,502457,501433,500409,499385,498361,497337,496313,529082,528058,527034,526010,524986,523962,522938,521914,520890,519866,518842,517818,516794,515770,514746,513722,512698,511674,510650,509626,508602,507578,506554,505530,504506,503482,502458,501434,500410,499386,498362,497338,496314,529083,528059,527035,526011,524987,523963,522939,521915,520891,519867,518843,517819,516795,515771,514747,513723,512699,511675,510651,509627,508603,507579,506555,505531,504507,503483,502459,501435,500411,499387,498363,497339,496315,529084,528060,527036,526012,524988,523964,522940,521916,520892,519868,518844,517820,516796,515772,514748,513724,512700,511676,510652,509628,508604,507580,506556,505532,504508,503484,502460,501436,500412,499388,498364,497340,496316,529085,528061,527037,526013,524989,523965,522941,521917,520893,519869,518845,517821,516797,515773,514749,513725,512701,511677,510653,509629,508605,507581,506557,505533,504509,503485,502461,501437,500413,499389,498365,497341,496317,529086,528062,527038,526014,524990,523966,522942,521918,520894,519870,518846,517822,516798,515774,514750,513726,512702,511678,510654,509630,508606,507582,506558,505534,504510,503486,502462,501438,500414,499390,498366,497342,496318,529087,528063,527039,526015,524991,523967,522943,521919,520895,519871,518847,517823,516799,515775,514751,513727,512703,511679,510655,509631,508607,507583,506559,505535,504511,503487,502463,501439,500415,499391,498367,497343,496319,529088,528064,527040,526016,524992,523968,522944,521920,520896,519872,518848,517824,516800,515776,514752,513728,512704,511680,510656,509632,508608,507584,506560,505536,504512,503488,502464,501440,500416,499392,498368,497344,496320,529089,528065,527041,526017,524993,523969,522945,521921,520897,519873,518849,517825,516801,515777,514753,513729,512705,511681,510657,509633,508609,507585,506561,505537,504513,503489,502465,501441,500417,499393,498369,497345,496321,529090,528066,527042,526018,524994,523970,522946,521922,520898,519874,518850,517826,516802,515778,514754,513730,512706,511682,510658,509634,508610,507586,506562,505538,504514,503490,502466,501442,500418,499394,498370,497346,496322,529091,528067,527043,526019,524995,523971,522947,521923,520899,519875,518851,517827,516803,515779,514755,513731,512707,511683,510659,509635,508611,507587,506563,505539,504515,503491,502467,501443,500419,499395,498371,497347,496323,529092,528068,527044,526020,524996,523972,522948,521924,520900,519876,518852,517828,516804,515780,514756,513732,512708,511684,510660,509636,508612,507588,506564,505540,504516,503492,502468,501444,500420,499396,498372,497348,496324,529093,528069,527045,526021,524997,523973,522949,521925,520901,519877,518853,517829,516805,515781,514757,513733,512709,511685,510661,509637,508613,507589,506565,505541,504517,503493,502469,501445,500421,499397,498373,497349,496325,529094,528070,527046,526022,524998,523974,522950,521926,520902,519878,518854,517830,516806,515782,514758,513734,512710,511686,510662,509638,508614,507590,506566,505542,504518,503494,502470,501446,500422,499398,498374,497350,496326,529095,528071,527047,526023,524999,523975,522951,521927,520903,519879,518855,517831,516807,515783,514759,513735,512711,511687,510663,509639,508615,507591,506567,505543,504519,503495,502471,501447,500423,499399,498375,497351,496327,529096,528072,527048,526024,525000,523976,522952,521928,520904,519880,518856,517832,516808,515784,514760,513736,512712,511688,510664,509640,508616,507592,506568,505544,504520,503496,502472,501448,500424,499400,498376,497352,496328,529097,528073,527049,526025,525001,523977,522953,521929,520905,519881,518857,517833,516809,515785,514761,513737,512713,511689,510665,509641,508617,507593,506569,505545,504521,503497,502473,501449,500425,499401,498377,497353,496329,529098,528074,527050,526026,525002,523978,522954,521930,520906,519882,518858,517834,516810,515786,514762,513738,512714,511690,510666,509642,508618,507594,506570,505546,504522,503498,502474,501450,500426,499402,498378,497354,496330,529099,528075,527051,526027,525003,523979,522955,521931,520907,519883,518859,517835,516811,515787,514763,513739,512715,511691,510667,509643,508619,507595,506571,505547,504523,503499,502475,501451,500427,499403,498379,497355,496331,529100,528076,527052,526028,525004,523980,522956,521932,520908,519884,518860,517836,516812,515788,514764,513740,512716,511692,510668,509644,508620,507596,506572,505548,504524,503500,502476,501452,500428,499404,498380,497356,496332,529101,528077,527053,526029,525005,523981,522957,521933,520909,519885,518861,517837,516813,515789,514765,513741,512717,511693,510669,509645,508621,507597,506573,505549,504525,503501,502477,501453,500429,499405,498381,497357,496333,529102,528078,527054,526030,525006,523982,522958,521934,520910,519886,518862,517838,516814,515790,514766,513742,512718,511694,510670,509646,508622,507598,506574,505550,504526,503502,502478,501454,500430,499406,498382,497358,496334,529103,528079,527055,526031,525007,523983,522959,521935,520911,519887,518863,517839,516815,515791,514767,513743,512719,511695,510671,509647,508623,507599,506575,505551,504527,503503,502479,501455,500431,499407,498383,497359,496335,529104,528080,527056,526032,525008,523984,522960,521936,520912,519888,518864,517840,516816,515792,514768,513744,512720,511696,510672,509648,508624,507600,506576,505552,504528,503504,502480,501456,500432,499408,498384,497360,496336,529105,528081,527057,526033,525009,523985,522961,521937,520913,519889,518865,517841,516817,515793,514769,513745,512721,511697,510673,509649,508625,507601,506577,505553,504529,503505,502481,501457,500433,499409,498385,497361,496337,529106,528082,527058,526034,525010,523986,522962,521938,520914,519890,518866,517842,516818,515794,514770,513746,512722,511698,510674,509650,508626,507602,506578,505554,504530,503506,502482,501458,500434,499410,498386,497362,496338,529107,528083,527059,526035,525011,523987,522963,521939,520915,519891,518867,517843,516819,515795,514771,513747,512723,511699,510675,509651,508627,507603,506579,505555,504531,503507,502483,501459,500435,499411,498387,497363,496339,529108,528084,527060,526036,525012,523988,522964,521940,520916,519892,518868,517844,516820,515796,514772,513748,512724,511700,510676,509652,508628,507604,506580,505556,504532,503508,502484,501460,500436,499412,498388,497364,496340,529109,528085,527061,526037,525013,523989,522965,521941,520917,519893,518869,517845,516821,515797,514773,513749,512725,511701,510677,509653,508629,507605,506581,505557,504533,503509,502485,501461,500437,499413,498389,497365,496341,529110,528086,527062,526038,525014,523990,522966,521942,520918,519894,518870,517846,516822,515798,514774,513750,512726,511702,510678,509654,508630,507606,506582,505558,504534,503510,502486,501462,500438,499414,498390,497366,496342,529111,528087,527063,526039,525015,523991,522967,521943,520919,519895,518871,517847,516823,515799,514775,513751,512727,511703,510679,509655,508631,507607,506583,505559,504535,503511,502487,501463,500439,499415,498391,497367,496343,529112,528088,527064,526040,525016,523992,522968,521944,520920,519896,518872,517848,516824,515800,514776,513752,512728,511704,510680,509656,508632,507608,506584,505560,504536,503512,502488,501464,500440,499416,498392,497368,496344,529113,528089,527065,526041,525017,523993,522969,521945,520921,519897,518873,517849,516825,515801,514777,513753,512729,511705,510681,509657,508633,507609,506585,505561,504537,503513,502489,501465,500441,499417,498393,497369,496345,529114,528090,527066,526042,525018,523994,522970,521946,520922,519898,518874,517850,516826,515802,514778,513754,512730,511706,510682,509658,508634,507610,506586,505562,504538,503514,502490,501466,500442,499418,498394,497370,496346,529115,528091,527067,526043,525019,523995,522971,521947,520923,519899,518875,517851,516827,515803,514779,513755,512731,511707,510683,509659,508635,507611,506587,505563,504539,503515,502491,501467,500443,499419,498395,497371,496347,529116,528092,527068,526044,525020,523996,522972,521948,520924,519900,518876,517852,516828,515804,514780,513756,512732,511708,510684,509660,508636,507612,506588,505564,504540,503516,502492,501468,500444,499420,498396,497372,496348,529117,528093,527069,526045,525021,523997,522973,521949,520925,519901,518877,517853,516829,515805,514781,513757,512733,511709,510685,509661,508637,507613,506589,505565,504541,503517,502493,501469,500445,499421,498397,497373,496349,529118,528094,527070,526046,525022,523998,522974,521950,520926,519902,518878,517854,516830,515806,514782,513758,512734,511710,510686,509662,508638,507614,506590,505566,504542,503518,502494,501470,500446,499422,498398,497374,496350,529119,528095,527071,526047,525023,523999,522975,521951,520927,519903,518879,517855,516831,515807,514783,513759,512735,511711,510687,509663,508639,507615,506591,505567,504543,503519,502495,501471,500447,499423,498399,497375,496351,529120,528096,527072,526048,525024,524000,522976,521952,520928,519904,518880,517856,516832,515808,514784,513760,512736,511712,510688,509664,508640,507616,506592,505568,504544,503520,502496,501472,500448,499424,498400,497376,496352,529121,528097,527073,526049,525025,524001,522977,521953,520929,519905,518881,517857,516833,515809,514785,513761,512737,511713,510689,509665,508641,507617,506593,505569,504545,503521,502497,501473,500449,499425,498401,497377,496353,529122,528098,527074,526050,525026,524002,522978,521954,520930,519906,518882,517858,516834,515810,514786,513762,512738,511714,510690,509666,508642,507618,506594,505570,504546,503522,502498,501474,500450,499426,498402,497378,496354,529123,528099,527075,526051,525027,524003,522979,521955,520931,519907,518883,517859,516835,515811,514787,513763,512739,511715,510691,509667,508643,507619,506595,505571,504547,503523,502499,501475,500451,499427,498403,497379,496355,529124,528100,527076,526052,525028,524004,522980,521956,520932,519908,518884,517860,516836,515812,514788,513764,512740,511716,510692,509668,508644,507620,506596,505572,504548,503524,502500,501476,500452,499428,498404,497380,496356,529125,528101,527077,526053,525029,524005,522981,521957,520933,519909,518885,517861,516837,515813,514789,513765,512741,511717,510693,509669,508645,507621,506597,505573,504549,503525,502501,501477,500453,499429,498405,497381,496357,529126,528102,527078,526054,525030,524006,522982,521958,520934,519910,518886,517862,516838,515814,514790,513766,512742,511718,510694,509670,508646,507622,506598,505574,504550,503526,502502,501478,500454,499430,498406,497382,496358,529127,528103,527079,526055,525031,524007,522983,521959,520935,519911,518887,517863,516839,515815,514791,513767,512743,511719,510695,509671,508647,507623,506599,505575,504551,503527,502503,501479,500455,499431,498407,497383,496359,529128,528104,527080,526056,525032,524008,522984,521960,520936,519912,518888,517864,516840,515816,514792,513768,512744,511720,510696,509672,508648,507624,506600,505576,504552,503528,502504,501480,500456,499432,498408,497384,496360,529129,528105,527081,526057,525033,524009,522985,521961,520937,519913,518889,517865,516841,515817,514793,513769,512745,511721,510697,509673,508649,507625,506601,505577,504553,503529,502505,501481,500457,499433,498409,497385,496361,529130,528106,527082,526058,525034,524010,522986,521962,520938,519914,518890,517866,516842,515818,514794,513770,512746,511722,510698,509674,508650,507626,506602,505578,504554,503530,502506,501482,500458,499434,498410,497386,496362,529131,528107,527083,526059,525035,524011,522987,521963,520939,519915,518891,517867,516843,515819,514795,513771,512747,511723,510699,509675,508651,507627,506603,505579,504555,503531,502507,501483,500459,499435,498411,497387,496363,529132,528108,527084,526060,525036,524012,522988,521964,520940,519916,518892,517868,516844,515820,514796,513772,512748,511724,510700,509676,508652,507628,506604,505580,504556,503532,502508,501484,500460,499436,498412,497388,496364,529133,528109,527085,526061,525037,524013,522989,521965,520941,519917,518893,517869,516845,515821,514797,513773,512749,511725,510701,509677,508653,507629,506605,505581,504557,503533,502509,501485,500461,499437,498413,497389,496365,529134,528110,527086,526062,525038,524014,522990,521966,520942,519918,518894,517870,516846,515822,514798,513774,512750,511726,510702,509678,508654,507630,506606,505582,504558,503534,502510,501486,500462,499438,498414,497390,496366,529135,528111,527087,526063,525039,524015,522991,521967,520943,519919,518895,517871,516847,515823,514799,513775,512751,511727,510703,509679,508655,507631,506607,505583,504559,503535,502511,501487,500463,499439,498415,497391,496367,529136,528112,527088,526064,525040,524016,522992,521968,520944,519920,518896,517872,516848,515824,514800,513776,512752,511728,510704,509680,508656,507632,506608,505584,504560,503536,502512,501488,500464,499440,498416,497392,496368,529137,528113,527089,526065,525041,524017,522993,521969,520945,519921,518897,517873,516849,515825,514801,513777,512753,511729,510705,509681,508657,507633,506609,505585,504561,503537,502513,501489,500465,499441,498417,497393,496369,529138,528114,527090,526066,525042,524018,522994,521970,520946,519922,518898,517874,516850,515826,514802,513778,512754,511730,510706,509682,508658,507634,506610,505586,504562,503538,502514,501490,500466,499442,498418,497394,496370,529139,528115,527091,526067,525043,524019,522995,521971,520947,519923,518899,517875,516851,515827,514803,513779,512755,511731,510707,509683,508659,507635,506611,505587,504563,503539,502515,501491,500467,499443,498419,497395,496371,529140,528116,527092,526068,525044,524020,522996,521972,520948,519924,518900,517876,516852,515828,514804,513780,512756,511732,510708,509684,508660,507636,506612,505588,504564,503540,502516,501492,500468,499444,498420,497396,496372,529141,528117,527093,526069,525045,524021,522997,521973,520949,519925,518901,517877,516853,515829,514805,513781,512757,511733,510709,509685,508661,507637,506613,505589,504565,503541,502517,501493,500469,499445,498421,497397,496373,529142,528118,527094,526070,525046,524022,522998,521974,520950,519926,518902,517878,516854,515830,514806,513782,512758,511734,510710,509686,508662,507638,506614,505590,504566,503542,502518,501494,500470,499446,498422,497398,496374,529143,528119,527095,526071,525047,524023,522999,521975,520951,519927,518903,517879,516855,515831,514807,513783,512759,511735,510711,509687,508663,507639,506615,505591,504567,503543,502519,501495,500471,499447,498423,497399,496375,529144,528120,527096,526072,525048,524024,523000,521976,520952,519928,518904,517880,516856,515832,514808,513784,512760,511736,510712,509688,508664,507640,506616,505592,504568,503544,502520,501496,500472,499448,498424,497400,496376,529145,528121,527097,526073,525049,524025,523001,521977,520953,519929,518905,517881,516857,515833,514809,513785,512761,511737,510713,509689,508665,507641,506617,505593,504569,503545,502521,501497,500473,499449,498425,497401,496377,529146,528122,527098,526074,525050,524026,523002,521978,520954,519930,518906,517882,516858,515834,514810,513786,512762,511738,510714,509690,508666,507642,506618,505594,504570,503546,502522,501498,500474,499450,498426,497402,496378,529147,528123,527099,526075,525051,524027,523003,521979,520955,519931,518907,517883,516859,515835,514811,513787,512763,511739,510715,509691,508667,507643,506619,505595,504571,503547,502523,501499,500475,499451,498427,497403,496379,529148,528124,527100,526076,525052,524028,523004,521980,520956,519932,518908,517884,516860,515836,514812,513788,512764,511740,510716,509692,508668,507644,506620,505596,504572,503548,502524,501500,500476,499452,498428,497404,496380,529149,528125,527101,526077,525053,524029,523005,521981,520957,519933,518909,517885,516861,515837,514813,513789,512765,511741,510717,509693,508669,507645,506621,505597,504573,503549,502525,501501,500477,499453,498429,497405,496381,529150,528126,527102,526078,525054,524030,523006,521982,520958,519934,518910,517886,516862,515838,514814,513790,512766,511742,510718,509694,508670,507646,506622,505598,504574,503550,502526,501502,500478,499454,498430,497406,496382,529151,528127,527103,526079,525055,524031,523007,521983,520959,519935,518911,517887,516863,515839,514815,513791,512767,511743,510719,509695,508671,507647,506623,505599,504575,503551,502527,501503,500479,499455,498431,497407,496383,529152,528128,527104,526080,525056,524032,523008,521984,520960,519936,518912,517888,516864,515840,514816,513792,512768,511744,510720,509696,508672,507648,506624,505600,504576,503552,502528,501504,500480,499456,498432,497408,496384,529153,528129,527105,526081,525057,524033,523009,521985,520961,519937,518913,517889,516865,515841,514817,513793,512769,511745,510721,509697,508673,507649,506625,505601,504577,503553,502529,501505,500481,499457,498433,497409,496385,529154,528130,527106,526082,525058,524034,523010,521986,520962,519938,518914,517890,516866,515842,514818,513794,512770,511746,510722,509698,508674,507650,506626,505602,504578,503554,502530,501506,500482,499458,498434,497410,496386,529155,528131,527107,526083,525059,524035,523011,521987,520963,519939,518915,517891,516867,515843,514819,513795,512771,511747,510723,509699,508675,507651,506627,505603,504579,503555,502531,501507,500483,499459,498435,497411,496387,529156,528132,527108,526084,525060,524036,523012,521988,520964,519940,518916,517892,516868,515844,514820,513796,512772,511748,510724,509700,508676,507652,506628,505604,504580,503556,502532,501508,500484,499460,498436,497412,496388,529157,528133,527109,526085,525061,524037,523013,521989,520965,519941,518917,517893,516869,515845,514821,513797,512773,511749,510725,509701,508677,507653,506629,505605,504581,503557,502533,501509,500485,499461,498437,497413,496389,529158,528134,527110,526086,525062,524038,523014,521990,520966,519942,518918,517894,516870,515846,514822,513798,512774,511750,510726,509702,508678,507654,506630,505606,504582,503558,502534,501510,500486,499462,498438,497414,496390,529159,528135,527111,526087,525063,524039,523015,521991,520967,519943,518919,517895,516871,515847,514823,513799,512775,511751,510727,509703,508679,507655,506631,505607,504583,503559,502535,501511,500487,499463,498439,497415,496391,529160,528136,527112,526088,525064,524040,523016,521992,520968,519944,518920,517896,516872,515848,514824,513800,512776,511752,510728,509704,508680,507656,506632,505608,504584,503560,502536,501512,500488,499464,498440,497416,496392,529161,528137,527113,526089,525065,524041,523017,521993,520969,519945,518921,517897,516873,515849,514825,513801,512777,511753,510729,509705,508681,507657,506633,505609,504585,503561,502537,501513,500489,499465,498441,497417,496393,529162,528138,527114,526090,525066,524042,523018,521994,520970,519946,518922,517898,516874,515850,514826,513802,512778,511754,510730,509706,508682,507658,506634,505610,504586,503562,502538,501514,500490,499466,498442,497418,496394,529163,528139,527115,526091,525067,524043,523019,521995,520971,519947,518923,517899,516875,515851,514827,513803,512779,511755,510731,509707,508683,507659,506635,505611,504587,503563,502539,501515,500491,499467,498443,497419,496395,529164,528140,527116,526092,525068,524044,523020,521996,520972,519948,518924,517900,516876,515852,514828,513804,512780,511756,510732,509708,508684,507660,506636,505612,504588,503564,502540,501516,500492,499468,498444,497420,496396,529165,528141,527117,526093,525069,524045,523021,521997,520973,519949,518925,517901,516877,515853,514829,513805,512781,511757,510733,509709,508685,507661,506637,505613,504589,503565,502541,501517,500493,499469,498445,497421,496397,529166,528142,527118,526094,525070,524046,523022,521998,520974,519950,518926,517902,516878,515854,514830,513806,512782,511758,510734,509710,508686,507662,506638,505614,504590,503566,502542,501518,500494,499470,498446,497422,496398,529167,528143,527119,526095,525071,524047,523023,521999,520975,519951,518927,517903,516879,515855,514831,513807,512783,511759,510735,509711,508687,507663,506639,505615,504591,503567,502543,501519,500495,499471,498447,497423,496399,529168,528144,527120,526096,525072,524048,523024,522000,520976,519952,518928,517904,516880,515856,514832,513808,512784,511760,510736,509712,508688,507664,506640,505616,504592,503568,502544,501520,500496,499472,498448,497424,496400,529169,528145,527121,526097,525073,524049,523025,522001,520977,519953,518929,517905,516881,515857,514833,513809,512785,511761,510737,509713,508689,507665,506641,505617,504593,503569,502545,501521,500497,499473,498449,497425,496401,529170,528146,527122,526098,525074,524050,523026,522002,520978,519954,518930,517906,516882,515858,514834,513810,512786,511762,510738,509714,508690,507666,506642,505618,504594,503570,502546,501522,500498,499474,498450,497426,496402,529171,528147,527123,526099,525075,524051,523027,522003,520979,519955,518931,517907,516883,515859,514835,513811,512787,511763,510739,509715,508691,507667,506643,505619,504595,503571,502547,501523,500499,499475,498451,497427,496403,529172,528148,527124,526100,525076,524052,523028,522004,520980,519956,518932,517908,516884,515860,514836,513812,512788,511764,510740,509716,508692,507668,506644,505620,504596,503572,502548,501524,500500,499476,498452,497428,496404,529173,528149,527125,526101,525077,524053,523029,522005,520981,519957,518933,517909,516885,515861,514837,513813,512789,511765,510741,509717,508693,507669,506645,505621,504597,503573,502549,501525,500501,499477,498453,497429,496405,529174,528150,527126,526102,525078,524054,523030,522006,520982,519958,518934,517910,516886,515862,514838,513814,512790,511766,510742,509718,508694,507670,506646,505622,504598,503574,502550,501526,500502,499478,498454,497430,496406,529175,528151,527127,526103,525079,524055,523031,522007,520983,519959,518935,517911,516887,515863,514839,513815,512791,511767,510743,509719,508695,507671,506647,505623,504599,503575,502551,501527,500503,499479,498455,497431,496407,529176,528152,527128,526104,525080,524056,523032,522008,520984,519960,518936,517912,516888,515864,514840,513816,512792,511768,510744,509720,508696,507672,506648,505624,504600,503576,502552,501528,500504,499480,498456,497432,496408,529177,528153,527129,526105,525081,524057,523033,522009,520985,519961,518937,517913,516889,515865,514841,513817,512793,511769,510745,509721,508697,507673,506649,505625,504601,503577,502553,501529,500505,499481,498457,497433,496409,529178,528154,527130,526106,525082,524058,523034,522010,520986,519962,518938,517914,516890,515866,514842,513818,512794,511770,510746,509722,508698,507674,506650,505626,504602,503578,502554,501530,500506,499482,498458,497434,496410,529179,528155,527131,526107,525083,524059,523035,522011,520987,519963,518939,517915,516891,515867,514843,513819,512795,511771,510747,509723,508699,507675,506651,505627,504603,503579,502555,501531,500507,499483,498459,497435,496411,529180,528156,527132,526108,525084,524060,523036,522012,520988,519964,518940,517916,516892,515868,514844,513820,512796,511772,510748,509724,508700,507676,506652,505628,504604,503580,502556,501532,500508,499484,498460,497436,496412,529181,528157,527133,526109,525085,524061,523037,522013,520989,519965,518941,517917,516893,515869,514845,513821,512797,511773,510749,509725,508701,507677,506653,505629,504605,503581,502557,501533,500509,499485,498461,497437,496413,529182,528158,527134,526110,525086,524062,523038,522014,520990,519966,518942,517918,516894,515870,514846,513822,512798,511774,510750,509726,508702,507678,506654,505630,504606,503582,502558,501534,500510,499486,498462,497438,496414,529183,528159,527135,526111,525087,524063,523039,522015,520991,519967,518943,517919,516895,515871,514847,513823,512799,511775,510751,509727,508703,507679,506655,505631,504607,503583,502559,501535,500511,499487,498463,497439,496415,529184,528160,527136,526112,525088,524064,523040,522016,520992,519968,518944,517920,516896,515872,514848,513824,512800,511776,510752,509728,508704,507680,506656,505632,504608,503584,502560,501536,500512,499488,498464,497440,496416,529185,528161,527137,526113,525089,524065,523041,522017,520993,519969,518945,517921,516897,515873,514849,513825,512801,511777,510753,509729,508705,507681,506657,505633,504609,503585,502561,501537,500513,499489,498465,497441,496417,529186,528162,527138,526114,525090,524066,523042,522018,520994,519970,518946,517922,516898,515874,514850,513826,512802,511778,510754,509730,508706,507682,506658,505634,504610,503586,502562,501538,500514,499490,498466,497442,496418,529187,528163,527139,526115,525091,524067,523043,522019,520995,519971,518947,517923,516899,515875,514851,513827,512803,511779,510755,509731,508707,507683,506659,505635,504611,503587,502563,501539,500515,499491,498467,497443,496419,529188,528164,527140,526116,525092,524068,523044,522020,520996,519972,518948,517924,516900,515876,514852,513828,512804,511780,510756,509732,508708,507684,506660,505636,504612,503588,502564,501540,500516,499492,498468,497444,496420,529189,528165,527141,526117,525093,524069,523045,522021,520997,519973,518949,517925,516901,515877,514853,513829,512805,511781,510757,509733,508709,507685,506661,505637,504613,503589,502565,501541,500517,499493,498469,497445,496421,529190,528166,527142,526118,525094,524070,523046,522022,520998,519974,518950,517926,516902,515878,514854,513830,512806,511782,510758,509734,508710,507686,506662,505638,504614,503590,502566,501542,500518,499494,498470,497446,496422,529191,528167,527143,526119,525095,524071,523047,522023,520999,519975,518951,517927,516903,515879,514855,513831,512807,511783,510759,509735,508711,507687,506663,505639,504615,503591,502567,501543,500519,499495,498471,497447,496423,529192,528168,527144,526120,525096,524072,523048,522024,521000,519976,518952,517928,516904,515880,514856,513832,512808,511784,510760,509736,508712,507688,506664,505640,504616,503592,502568,501544,500520,499496,498472,497448,496424,529193,528169,527145,526121,525097,524073,523049,522025,521001,519977,518953,517929,516905,515881,514857,513833,512809,511785,510761,509737,508713,507689,506665,505641,504617,503593,502569,501545,500521,499497,498473,497449,496425,529194,528170,527146,526122,525098,524074,523050,522026,521002,519978,518954,517930,516906,515882,514858,513834,512810,511786,510762,509738,508714,507690,506666,505642,504618,503594,502570,501546,500522,499498,498474,497450,496426,529195,528171,527147,526123,525099,524075,523051,522027,521003,519979,518955,517931,516907,515883,514859,513835,512811,511787,510763,509739,508715,507691,506667,505643,504619,503595,502571,501547,500523,499499,498475,497451,496427,529196,528172,527148,526124,525100,524076,523052,522028,521004,519980,518956,517932,516908,515884,514860,513836,512812,511788,510764,509740,508716,507692,506668,505644,504620,503596,502572,501548,500524,499500,498476,497452,496428,529197,528173,527149,526125,525101,524077,523053,522029,521005,519981,518957,517933,516909,515885,514861,513837,512813,511789,510765,509741,508717,507693,506669,505645,504621,503597,502573,501549,500525,499501,498477,497453,496429,529198,528174,527150,526126,525102,524078,523054,522030,521006,519982,518958,517934,516910,515886,514862,513838,512814,511790,510766,509742,508718,507694,506670,505646,504622,503598,502574,501550,500526,499502,498478,497454,496430,529199,528175,527151,526127,525103,524079,523055,522031,521007,519983,518959,517935,516911,515887,514863,513839,512815,511791,510767,509743,508719,507695,506671,505647,504623,503599,502575,501551,500527,499503,498479,497455,496431,529200,528176,527152,526128,525104,524080,523056,522032,521008,519984,518960,517936,516912,515888,514864,513840,512816,511792,510768,509744,508720,507696,506672,505648,504624,503600,502576,501552,500528,499504,498480,497456,496432,529201,528177,527153,526129,525105,524081,523057,522033,521009,519985,518961,517937,516913,515889,514865,513841,512817,511793,510769,509745,508721,507697,506673,505649,504625,503601,502577,501553,500529,499505,498481,497457,496433,529202,528178,527154,526130,525106,524082,523058,522034,521010,519986,518962,517938,516914,515890,514866,513842,512818,511794,510770,509746,508722,507698,506674,505650,504626,503602,502578,501554,500530,499506,498482,497458,496434,529203,528179,527155,526131,525107,524083,523059,522035,521011,519987,518963,517939,516915,515891,514867,513843,512819,511795,510771,509747,508723,507699,506675,505651,504627,503603,502579,501555,500531,499507,498483,497459,496435,529204,528180,527156,526132,525108,524084,523060,522036,521012,519988,518964,517940,516916,515892,514868,513844,512820,511796,510772,509748,508724,507700,506676,505652,504628,503604,502580,501556,500532,499508,498484,497460,496436,529205,528181,527157,526133,525109,524085,523061,522037,521013,519989,518965,517941,516917,515893,514869,513845,512821,511797,510773,509749,508725,507701,506677,505653,504629,503605,502581,501557,500533,499509,498485,497461,496437,529206,528182,527158,526134,525110,524086,523062,522038,521014,519990,518966,517942,516918,515894,514870,513846,512822,511798,510774,509750,508726,507702,506678,505654,504630,503606,502582,501558,500534,499510,498486,497462,496438,529207,528183,527159,526135,525111,524087,523063,522039,521015,519991,518967,517943,516919,515895,514871,513847,512823,511799,510775,509751,508727,507703,506679,505655,504631,503607,502583,501559,500535,499511,498487,497463,496439,529208,528184,527160,526136,525112,524088,523064,522040,521016,519992,518968,517944,516920,515896,514872,513848,512824,511800,510776,509752,508728,507704,506680,505656,504632,503608,502584,501560,500536,499512,498488,497464,496440,529209,528185,527161,526137,525113,524089,523065,522041,521017,519993,518969,517945,516921,515897,514873,513849,512825,511801,510777,509753,508729,507705,506681,505657,504633,503609,502585,501561,500537,499513,498489,497465,496441,529210,528186,527162,526138,525114,524090,523066,522042,521018,519994,518970,517946,516922,515898,514874,513850,512826,511802,510778,509754,508730,507706,506682,505658,504634,503610,502586,501562,500538,499514,498490,497466,496442,529211,528187,527163,526139,525115,524091,523067,522043,521019,519995,518971,517947,516923,515899,514875,513851,512827,511803,510779,509755,508731,507707,506683,505659,504635,503611,502587,501563,500539,499515,498491,497467,496443,529212,528188,527164,526140,525116,524092,523068,522044,521020,519996,518972,517948,516924,515900,514876,513852,512828,511804,510780,509756,508732,507708,506684,505660,504636,503612,502588,501564,500540,499516,498492,497468,496444,529213,528189,527165,526141,525117,524093,523069,522045,521021,519997,518973,517949,516925,515901,514877,513853,512829,511805,510781,509757,508733,507709,506685,505661,504637,503613,502589,501565,500541,499517,498493,497469,496445,529214,528190,527166,526142,525118,524094,523070,522046,521022,519998,518974,517950,516926,515902,514878,513854,512830,511806,510782,509758,508734,507710,506686,505662,504638,503614,502590,501566,500542,499518,498494,497470,496446,529215,528191,527167,526143,525119,524095,523071,522047,521023,519999,518975,517951,516927,515903,514879,513855,512831,511807,510783,509759,508735,507711,506687,505663,504639,503615,502591,501567,500543,499519,498495,497471,496447,529216,528192,527168,526144,525120,524096,523072,522048,521024,520000,518976,517952,516928,515904,514880,513856,512832,511808,510784,509760,508736,507712,506688,505664,504640,503616,502592,501568,500544,499520,498496,497472,496448,529217,528193,527169,526145,525121,524097,523073,522049,521025,520001,518977,517953,516929,515905,514881,513857,512833,511809,510785,509761,508737,507713,506689,505665,504641,503617,502593,501569,500545,499521,498497,497473,496449,529218,528194,527170,526146,525122,524098,523074,522050,521026,520002,518978,517954,516930,515906,514882,513858,512834,511810,510786,509762,508738,507714,506690,505666,504642,503618,502594,501570,500546,499522,498498,497474,496450,529219,528195,527171,526147,525123,524099,523075,522051,521027,520003,518979,517955,516931,515907,514883,513859,512835,511811,510787,509763,508739,507715,506691,505667,504643,503619,502595,501571,500547,499523,498499,497475,496451,529220,528196,527172,526148,525124,524100,523076,522052,521028,520004,518980,517956,516932,515908,514884,513860,512836,511812,510788,509764,508740,507716,506692,505668,504644,503620,502596,501572,500548,499524,498500,497476,496452,529221,528197,527173,526149,525125,524101,523077,522053,521029,520005,518981,517957,516933,515909,514885,513861,512837,511813,510789,509765,508741,507717,506693,505669,504645,503621,502597,501573,500549,499525,498501,497477,496453,529222,528198,527174,526150,525126,524102,523078,522054,521030,520006,518982,517958,516934,515910,514886,513862,512838,511814,510790,509766,508742,507718,506694,505670,504646,503622,502598,501574,500550,499526,498502,497478,496454,529223,528199,527175,526151,525127,524103,523079,522055,521031,520007,518983,517959,516935,515911,514887,513863,512839,511815,510791,509767,508743,507719,506695,505671,504647,503623,502599,501575,500551,499527,498503,497479,496455,529224,528200,527176,526152,525128,524104,523080,522056,521032,520008,518984,517960,516936,515912,514888,513864,512840,511816,510792,509768,508744,507720,506696,505672,504648,503624,502600,501576,500552,499528,498504,497480,496456,529225,528201,527177,526153,525129,524105,523081,522057,521033,520009,518985,517961,516937,515913,514889,513865,512841,511817,510793,509769,508745,507721,506697,505673,504649,503625,502601,501577,500553,499529,498505,497481,496457,529226,528202,527178,526154,525130,524106,523082,522058,521034,520010,518986,517962,516938,515914,514890,513866,512842,511818,510794,509770,508746,507722,506698,505674,504650,503626,502602,501578,500554,499530,498506,497482,496458,529227,528203,527179,526155,525131,524107,523083,522059,521035,520011,518987,517963,516939,515915,514891,513867,512843,511819,510795,509771,508747,507723,506699,505675,504651,503627,502603,501579,500555,499531,498507,497483,496459,529228,528204,527180,526156,525132,524108,523084,522060,521036,520012,518988,517964,516940,515916,514892,513868,512844,511820,510796,509772,508748,507724,506700,505676,504652,503628,502604,501580,500556,499532,498508,497484,496460,529229,528205,527181,526157,525133,524109,523085,522061,521037,520013,518989,517965,516941,515917,514893,513869,512845,511821,510797,509773,508749,507725,506701,505677,504653,503629,502605,501581,500557,499533,498509,497485,496461,529230,528206,527182,526158,525134,524110,523086,522062,521038,520014,518990,517966,516942,515918,514894,513870,512846,511822,510798,509774,508750,507726,506702,505678,504654,503630,502606,501582,500558,499534,498510,497486,496462,529231,528207,527183,526159,525135,524111,523087,522063,521039,520015,518991,517967,516943,515919,514895,513871,512847,511823,510799,509775,508751,507727,506703,505679,504655,503631,502607,501583,500559,499535,498511,497487,496463,529232,528208,527184,526160,525136,524112,523088,522064,521040,520016,518992,517968,516944,515920,514896,513872,512848,511824,510800,509776,508752,507728,506704,505680,504656,503632,502608,501584,500560,499536,498512,497488,496464,529233,528209,527185,526161,525137,524113,523089,522065,521041,520017,518993,517969,516945,515921,514897,513873,512849,511825,510801,509777,508753,507729,506705,505681,504657,503633,502609,501585,500561,499537,498513,497489,496465,529234,528210,527186,526162,525138,524114,523090,522066,521042,520018,518994,517970,516946,515922,514898,513874,512850,511826,510802,509778,508754,507730,506706,505682,504658,503634,502610,501586,500562,499538,498514,497490,496466,529235,528211,527187,526163,525139,524115,523091,522067,521043,520019,518995,517971,516947,515923,514899,513875,512851,511827,510803,509779,508755,507731,506707,505683,504659,503635,502611,501587,500563,499539,498515,497491,496467,529236,528212,527188,526164,525140,524116,523092,522068,521044,520020,518996,517972,516948,515924,514900,513876,512852,511828,510804,509780,508756,507732,506708,505684,504660,503636,502612,501588,500564,499540,498516,497492,496468,529237,528213,527189,526165,525141,524117,523093,522069,521045,520021,518997,517973,516949,515925,514901,513877,512853,511829,510805,509781,508757,507733,506709,505685,504661,503637,502613,501589,500565,499541,498517,497493,496469,529238,528214,527190,526166,525142,524118,523094,522070,521046,520022,518998,517974,516950,515926,514902,513878,512854,511830,510806,509782,508758,507734,506710,505686,504662,503638,502614,501590,500566,499542,498518,497494,496470,529239,528215,527191,526167,525143,524119,523095,522071,521047,520023,518999,517975,516951,515927,514903,513879,512855,511831,510807,509783,508759,507735,506711,505687,504663,503639,502615,501591,500567,499543,498519,497495,496471,529240,528216,527192,526168,525144,524120,523096,522072,521048,520024,519000,517976,516952,515928,514904,513880,512856,511832,510808,509784,508760,507736,506712,505688,504664,503640,502616,501592,500568,499544,498520,497496,496472,529241,528217,527193,526169,525145,524121,523097,522073,521049,520025,519001,517977,516953,515929,514905,513881,512857,511833,510809,509785,508761,507737,506713,505689,504665,503641,502617,501593,500569,499545,498521,497497,496473,529242,528218,527194,526170,525146,524122,523098,522074,521050,520026,519002,517978,516954,515930,514906,513882,512858,511834,510810,509786,508762,507738,506714,505690,504666,503642,502618,501594,500570,499546,498522,497498,496474,529243,528219,527195,526171,525147,524123,523099,522075,521051,520027,519003,517979,516955,515931,514907,513883,512859,511835,510811,509787,508763,507739,506715,505691,504667,503643,502619,501595,500571,499547,498523,497499,496475,529244,528220,527196,526172,525148,524124,523100,522076,521052,520028,519004,517980,516956,515932,514908,513884,512860,511836,510812,509788,508764,507740,506716,505692,504668,503644,502620,501596,500572,499548,498524,497500,496476,529245,528221,527197,526173,525149,524125,523101,522077,521053,520029,519005,517981,516957,515933,514909,513885,512861,511837,510813,509789,508765,507741,506717,505693,504669,503645,502621,501597,500573,499549,498525,497501,496477,529246,528222,527198,526174,525150,524126,523102,522078,521054,520030,519006,517982,516958,515934,514910,513886,512862,511838,510814,509790,508766,507742,506718,505694,504670,503646,502622,501598,500574,499550,498526,497502,496478,529247,528223,527199,526175,525151,524127,523103,522079,521055,520031,519007,517983,516959,515935,514911,513887,512863,511839,510815,509791,508767,507743,506719,505695,504671,503647,502623,501599,500575,499551,498527,497503,496479,529248,528224,527200,526176,525152,524128,523104,522080,521056,520032,519008,517984,516960,515936,514912,513888,512864,511840,510816,509792,508768,507744,506720,505696,504672,503648,502624,501600,500576,499552,498528,497504,496480,529249,528225,527201,526177,525153,524129,523105,522081,521057,520033,519009,517985,516961,515937,514913,513889,512865,511841,510817,509793,508769,507745,506721,505697,504673,503649,502625,501601,500577,499553,498529,497505,496481,529250,528226,527202,526178,525154,524130,523106,522082,521058,520034,519010,517986,516962,515938,514914,513890,512866,511842,510818,509794,508770,507746,506722,505698,504674,503650,502626,501602,500578,499554,498530,497506,496482,529251,528227,527203,526179,525155,524131,523107,522083,521059,520035,519011,517987,516963,515939,514915,513891,512867,511843,510819,509795,508771,507747,506723,505699,504675,503651,502627,501603,500579,499555,498531,497507,496483,529252,528228,527204,526180,525156,524132,523108,522084,521060,520036,519012,517988,516964,515940,514916,513892,512868,511844,510820,509796,508772,507748,506724,505700,504676,503652,502628,501604,500580,499556,498532,497508,496484,529253,528229,527205,526181,525157,524133,523109,522085,521061,520037,519013,517989,516965,515941,514917,513893,512869,511845,510821,509797,508773,507749,506725,505701,504677,503653,502629,501605,500581,499557,498533,497509,496485,529254,528230,527206,526182,525158,524134,523110,522086,521062,520038,519014,517990,516966,515942,514918,513894,512870,511846,510822,509798,508774,507750,506726,505702,504678,503654,502630,501606,500582,499558,498534,497510,496486,529255,528231,527207,526183,525159,524135,523111,522087,521063,520039,519015,517991,516967,515943,514919,513895,512871,511847,510823,509799,508775,507751,506727,505703,504679,503655,502631,501607,500583,499559,498535,497511,496487,529256,528232,527208,526184,525160,524136,523112,522088,521064,520040,519016,517992,516968,515944,514920,513896,512872,511848,510824,509800,508776,507752,506728,505704,504680,503656,502632,501608,500584,499560,498536,497512,496488,529257,528233,527209,526185,525161,524137,523113,522089,521065,520041,519017,517993,516969,515945,514921,513897,512873,511849,510825,509801,508777,507753,506729,505705,504681,503657,502633,501609,500585,499561,498537,497513,496489,529258,528234,527210,526186,525162,524138,523114,522090,521066,520042,519018,517994,516970,515946,514922,513898,512874,511850,510826,509802,508778,507754,506730,505706,504682,503658,502634,501610,500586,499562,498538,497514,496490,529259,528235,527211,526187,525163,524139,523115,522091,521067,520043,519019,517995,516971,515947,514923,513899,512875,511851,510827,509803,508779,507755,506731,505707,504683,503659,502635,501611,500587,499563,498539,497515,496491,529260,528236,527212,526188,525164,524140,523116,522092,521068,520044,519020,517996,516972,515948,514924,513900,512876,511852,510828,509804,508780,507756,506732,505708,504684,503660,502636,501612,500588,499564,498540,497516,496492,529261,528237,527213,526189,525165,524141,523117,522093,521069,520045,519021,517997,516973,515949,514925,513901,512877,511853,510829,509805,508781,507757,506733,505709,504685,503661,502637,501613,500589,499565,498541,497517,496493,529262,528238,527214,526190,525166,524142,523118,522094,521070,520046,519022,517998,516974,515950,514926,513902,512878,511854,510830,509806,508782,507758,506734,505710,504686,503662,502638,501614,500590,499566,498542,497518,496494,529263,528239,527215,526191,525167,524143,523119,522095,521071,520047,519023,517999,516975,515951,514927,513903,512879,511855,510831,509807,508783,507759,506735,505711,504687,503663,502639,501615,500591,499567,498543,497519,496495,529264,528240,527216,526192,525168,524144,523120,522096,521072,520048,519024,518000,516976,515952,514928,513904,512880,511856,510832,509808,508784,507760,506736,505712,504688,503664,502640,501616,500592,499568,498544,497520,496496,529265,528241,527217,526193,525169,524145,523121,522097,521073,520049,519025,518001,516977,515953,514929,513905,512881,511857,510833,509809,508785,507761,506737,505713,504689,503665,502641,501617,500593,499569,498545,497521,496497,529266,528242,527218,526194,525170,524146,523122,522098,521074,520050,519026,518002,516978,515954,514930,513906,512882,511858,510834,509810,508786,507762,506738,505714,504690,503666,502642,501618,500594,499570,498546,497522,496498,529267,528243,527219,526195,525171,524147,523123,522099,521075,520051,519027,518003,516979,515955,514931,513907,512883,511859,510835,509811,508787,507763,506739,505715,504691,503667,502643,501619,500595,499571,498547,497523,496499,529268,528244,527220,526196,525172,524148,523124,522100,521076,520052,519028,518004,516980,515956,514932,513908,512884,511860,510836,509812,508788,507764,506740,505716,504692,503668,502644,501620,500596,499572,498548,497524,496500,529269,528245,527221,526197,525173,524149,523125,522101,521077,520053,519029,518005,516981,515957,514933,513909,512885,511861,510837,509813,508789,507765,506741,505717,504693,503669,502645,501621,500597,499573,498549,497525,496501,529270,528246,527222,526198,525174,524150,523126,522102,521078,520054,519030,518006,516982,515958,514934,513910,512886,511862,510838,509814,508790,507766,506742,505718,504694,503670,502646,501622,500598,499574,498550,497526,496502,529271,528247,527223,526199,525175,524151,523127,522103,521079,520055,519031,518007,516983,515959,514935,513911,512887,511863,510839,509815,508791,507767,506743,505719,504695,503671,502647,501623,500599,499575,498551,497527,496503,529272,528248,527224,526200,525176,524152,523128,522104,521080,520056,519032,518008,516984,515960,514936,513912,512888,511864,510840,509816,508792,507768,506744,505720,504696,503672,502648,501624,500600,499576,498552,497528,496504],"obstacle":[529915,495099,529916,495100,529917,495101,529918,495102,529919,495103,529920,495104,529921,495105,529922,495106,529923,495107,529924,495108,529925,495109,529926,495110,529927,495111,529928,495112,529929,495113,529930,495114,529931,495115,529932,495116,529933,495117,529934,495118,529935,495119,529936,495120,529937,495121,529938,495122,529939,495123,529940,495124,529941,495125,529942,495126,529943,495127,529944,495128,529945,495129,529946,495130,529947,495131,529948,495132,529949,495133,529950,495134,529951,495135,529952,495136,529953,495137,529954,495138,529955,495139,529956,495140,529957,495141,529958,495142,529959,495143,529960,495144,529961,495145,529962,495146,529963,495147,529964,495148,529965,495149,529966,495150,529967,495151,529968,495152,529969,495153,529970,495154,529971,495155,529972,495156,529973,495157,529974,495158,529975,495159,529976,495160,529977,495161,529978,495162,529979,495163,529980,495164,529981,495165,529982,495166,529983,495167,529984,495168,529985,495169,529986,495170,529987,495171,529988,495172,529989,495173,529990,495174,529991,495175,529992,495176,529993,495177,529994,495178,529995,495179,529996,495180,529997,495181,529998,495182,529999,495183,530000,495184,530001,495185,530002,495186,530003,495187,530004,495188,530005,495189,530006,495190,530007,495191,530008,495192,530009,495193,530010,495194,530011,495195,530012,495196,530013,495197,530014,495198,530015,495199,530016,495200,530017,495201,530018,495202,530019,495203,530020,495204,530021,495205,530022,495206,530023,495207,530024,495208,530025,495209,530026,495210,530027,495211,530028,495212,530029,495213,530030,495214,530031,495215,530032,495216,530033,495217,530034,495218,530035,495219,530036,495220,530037,495221,530038,495222,530039,495223,530040,495224,530041,495225,530042,495226,530043,495227,530044,495228,530045,495229,530046,495230,530047,495231,530048,495232,530049,495233,530050,495234,530051,495235,530052,495236,530053,495237,530054,495238,530055,495239,530056,495240,530057,495241,530058,495242,530059,495243,530060,495244,530061,495245,530062,495246,530063,495247,530064,495248,530065,495249,530066,495250,530067,495251,530068,495252,530069,495253,530070,495254,530071,495255,530072,495256,530073,495257,530074,495258,530075,495259,530076,495260,530077,495261,530078,495262,530079,495263,530080,495264,530081,495265,530082,495266,530083,495267,530084,495268,530085,495269,530086,495270,530087,495271,530088,495272,530089,495273,530090,495274,530091,495275,530092,495276,530093,495277,530094,495278,530095,495279,530096,495280,530097,495281,530098,495282,530099,495283,530100,495284,530101,495285,530102,495286,530103,495287,530104,495288,530105,495289,530106,495290,530107,495291,530108,495292,530109,495293,530110,495294,530111,495295,530112,495296,530113,495297,530114,495298,530115,495299,530116,495300,530117,495301,530118,495302,530119,495303,530120,495304,530121,495305,530122,495306,530123,495307,530124,495308,530125,495309,530126,495310,530127,495311,530128,495312,530129,495313,530130,495314,530131,495315,530132,495316,530133,495317,530134,495318,530135,495319,530136,495320,530137,495321,530138,495322,530139,495323,530140,495324,530141,495325,530142,495326,530143,495327,530144,495328,530145,495329,530146,495330,530147,495331,530148,495332,530149,495333,530150,495334,530151,495335,530152,495336,530153,495337,530154,495338,530155,495339,530156,495340,530157,495341,530158,495342,530159,495343,530160,495344,530161,495345,530162,495346,530163,495347,530164,495348,530165,495349,530166,495350,530167,495351,530168,495352,530169,495353,530170,495354,530171,495355,530172,495356,530173,495357,530174,495358,530175,495359,530176,495360,530177,495361,530178,495362,530179,495363,530180,495364,530181,495365,530182,495366,530183,495367,530184,495368,530185,495369,530186,495370,530187,495371,530188,495372,530189,495373,530190,495374,530191,495375,530192,495376,530193,495377,530194,495378,530195,495379,530196,495380,530197,495381,530198,495382,530199,495383,530200,495384,530201,495385,530202,495386,530203,495387,530204,495388,530205,495389,530206,495390,530207,495391,530208,495392,530209,495393,530210,495394,530211,495395,530212,495396,530213,495397,530214,495398,530215,495399,530216,495400,530217,495401,530218,495402,530219,495403,530220,495404,530221,495405,530222,495406,530223,495407,530224,495408,530225,495409,530226,495410,530227,495411,530228,495412,530229,495413,530230,495414,530231,495415,530232,495416,530233,495417,530234,495418,530235,495419,530236,495420,530237,495421,530238,495422,530239,495423,530240,495424,530241,495425,530242,495426,530243,495427,530244,495428,530245,495429,530246,495430,530247,495431,530248,495432,530249,495433,530250,495434,530251,495435,530252,495436,530253,495437,530254,495438,530255,495439,530256,495440,530257,495441,530258,495442,530259,495443,530260,495444,530261,495445,530262,495446,530263,495447,530264,495448,530265,495449,530266,495450,530267,495451,530268,495452,530269,495453,530270,495454,530271,495455,530272,495456,530273,495457,530274,495458,530275,495459,530276,495460,530277,495461,530278,495462,530279,495463,530280,495464,530281,495465,530282,495466,530283,495467,530284,495468,530285,495469,530286,495470,530287,495471,530288,495472,530289,495473,530290,495474,530291,495475,530292,495476,530293,495477,530294,495478,530295,495479,530296,495480,530297,495481,529915,530297,528891,529273,527867,528249,526843,527225,525819,526201,524795,525177,523771,524153,522747,523129,521723,522105,520699,521081,519675,520057,518651,519033,517627,518009,516603,516985,515579,515961,514555,514937,513531,513913,512507,512889,511483,511865,510459,510841,509435,509817,508411,508793,507387,507769,506363,506745,505339,505721,504315,504697,503291,503673,502267,502649,501243,501625,500219,500601,499195,499577,498171,498553,497147,497529,496123,496505,495099,495481]}},"path":{"current_angle":0,"points":[25600,25600,26400,25600,26400,24400,27600,25600,27600,24400,27600,25600,28200,25600,28400,25600,28400,24400,29200,24400,29200,25600,28400,25600,29400,25600,30000,25600,30800,25600,31000,24400,31400,25200,31800,24400,32000,25600,32600,25600,33200,24400,33800,25600,33600,25200,32800,25200,33600,25200,33800,25600,34400,25600,34400,24400,34800,24400,35200,24800,34800,25200,34400,25200,34400,25600,35600,25600,36200,25600,37000,25600,37000,24400,37800,24400,38200,25000,37800,25600,37000,25600,38200,25600,38800,25600,39400,24400,40000,25600,39800,25200,39000,25200,39800,25200,40000,25600,40600,25600,41200,25600,41200,24400,40600,24400,41800,24400,41200,24400,41200,25600,41800,25600,42400,25600,43000,24400,43600,25600,43400,25200,42600,25200,43400,25200,43600,25600,44200,25600]},"charger":[25600,25600],"robot":[44200,25600],"isDefaultMap":true} FallbackMap.parsedData = function() { if (FallbackMap.fixedData) return FallbackMap.fixedData; let pixels = {}; diff --git a/client/zone/js-modules/rr-map-parser.js b/client/zone/js-modules/rr-map-parser.js index 50c32685..8c9eb795 100644 --- a/client/zone/js-modules/rr-map-parser.js +++ b/client/zone/js-modules/rr-map-parser.js @@ -83,6 +83,12 @@ RRMapParser.PARSE_BLOCK = function parseBlock(buf, offset, result) { height: buf.readInt32LE(0x10 + g3offset + offset), width: buf.readInt32LE(0x14 + g3offset + offset) }, + box: { + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }, pixels: {} }; @@ -133,6 +139,10 @@ RRMapParser.PARSE_BLOCK = function parseBlock(buf, offset, result) { break; } if (v < 0) continue; + if (parameters.box.minX > x) parameters.box.minX = x; + if (parameters.box.maxX < x) parameters.box.maxX = x; + if (parameters.box.minY > y) parameters.box.minY = y; + if (parameters.box.maxY < y) parameters.box.maxY = y; parameters.pixels[k] = v; } } diff --git a/client/zone/js-modules/vacuum-map.js b/client/zone/js-modules/vacuum-map.js index c1daa55c..e37866a4 100644 --- a/client/zone/js-modules/vacuum-map.js +++ b/client/zone/js-modules/vacuum-map.js @@ -222,7 +222,7 @@ export function VacuumMap(canvasElement) { /** * Private function to update the displayed mapdata periodically. */ -function updateMapInt(mapData) { + function updateMapInt(mapData) { mapDrawer.draw(parsedMap.image); if (options.noPath) { pathDrawer.setPath({},{}); @@ -301,20 +301,19 @@ function updateMapInt(mapData) { redraw(); }); - const boundingBox = { - minX: parsedMap.image.position.left, - minY: parsedMap.image.position.top, - maxX: parsedMap.image.position.left + parsedMap.image.dimensions.width, - maxY: parsedMap.image.position.top + parsedMap.image.dimensions.height - } + const boundingBox = parsedMap.image.box; const initialScalingFactor = Math.max(Math.min(Math.min( - canvas.width / (boundingBox.maxX - boundingBox.minX), - canvas.height / (boundingBox.maxY - boundingBox.minY) + canvas.width / (boundingBox.maxX - boundingBox.minX + 50), + canvas.height / (boundingBox.maxY - boundingBox.minY + 50) ),6.5),0.7); - currentScale = initialScalingFactor; + const sst = fetchScaleTranslate(); - ctx.scale(initialScalingFactor, initialScalingFactor); - ctx.translate(-boundingBox.minX, -boundingBox.minY); + currentScale = sst.z >= 0.7 && sst.z <= 6.5 ? sst.z : initialScalingFactor; + ctx.scale(currentScale, currentScale); + ctx.translate( + (sst.x < boundingBox.maxX - 50 && sst.x > boundingBox.minX + 50 - canvas.width/currentScale) ? -sst.x : -boundingBox.minX + 25, + (sst.y < boundingBox.maxY - 50 && sst.y > boundingBox.minY + 50 - canvas.height/currentScale) ? -sst.y : -boundingBox.minY + 25 + ); function clearContext(ctx) { ctx.save(); @@ -444,11 +443,22 @@ function updateMapInt(mapData) { } redrawCanvas = redraw; - pathDrawer.scale(initialScalingFactor, {noDraw: true}); - scaleIcons(initialScalingFactor); + pathDrawer.scale(currentScale, {noDraw: true}); + scaleIcons(currentScale); updateMapInt(); + function storeScaleTranslate() { + const { x, y } = ctx.transformedPoint(0,0); + localStorage.setItem('scaleTranslate', JSON.stringify({x: x, y: y, z: currentScale})); + } + + function fetchScaleTranslate() { + try { + return JSON.parse(localStorage.getItem('scaleTranslate')) || {}; + } catch (e) { return {}; } + } + let lastX = canvas.width / 2, lastY = canvas.height / 2, dragStart; @@ -502,6 +512,7 @@ function updateMapInt(mapData) { function endTranslate(evt) { dragStart = null; locations.forEach(location => location.isResizing && (location.isResizing = false)); + storeScaleTranslate(); redraw(); } @@ -657,7 +668,7 @@ function updateMapInt(mapData) { pathDrawer.scale(scaleX); scaleIcons(scaleX); currentScale = scaleX; - + storeScaleTranslate(); redraw(); } return evt.preventDefault() && false; From e9eebe30115f5b04442c910c76f2600c1afe2ed7 Mon Sep 17 00:00:00 2001 From: Erinome Date: Mon, 20 Apr 2020 00:26:42 +0300 Subject: [PATCH 005/172] limit map location buttons scaling closes #214 --- client/zone/js-modules/locations.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/zone/js-modules/locations.js b/client/zone/js-modules/locations.js index f0a41e2a..367b1acd 100644 --- a/client/zone/js-modules/locations.js +++ b/client/zone/js-modules/locations.js @@ -6,6 +6,9 @@ * and can define hooks for user-interaction such as tapping or panning. */ +const initialButtonSize = 10; +const maxButtonSizeMultiplier = 3; + /** * Represents a point the robot can be sent to. */ @@ -39,7 +42,7 @@ export class GotoPoint { export class Zone { constructor(x1 ,y1, x2, y2, iterations) { - this.buttonSize = this.buttonSizeInitial = 12; + this.buttonSize = initialButtonSize; this.active = true; this.editable = true; @@ -55,7 +58,7 @@ export class Zone { } draw(ctx, transformMapToScreenSpace, scaleFactor, idx) { - this.buttonSize = this.buttonSizeInitial * scaleFactor; + this.buttonSize = initialButtonSize * Math.min(scaleFactor,maxButtonSizeMultiplier); const p1 = new DOMPoint(this.x1, this.y1).matrixTransform(transformMapToScreenSpace); const p2 = new DOMPoint(this.x2, this.y2).matrixTransform(transformMapToScreenSpace); @@ -295,7 +298,7 @@ export class VirtualWall { if (editable) { this.active = true; this.isResizing = false; - this.buttonSize = this.buttonSizeInitial = 10; + this.buttonSize = initialButtonSize } else { this.active = false; } @@ -332,7 +335,7 @@ export class VirtualWall { ctx.restore(); if (this.active) { - this.buttonSize = this.buttonSizeInitial * scaleFactor; + this.buttonSize = initialButtonSize * Math.min(scaleFactor,maxButtonSizeMultiplier); ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(p1.x, p1.y, this.buttonSize / 2, 0, 2 * Math.PI, false); @@ -518,7 +521,7 @@ export class ForbiddenZone { if (editable) { this.active = true; this.isResizing = false; - this.buttonSize = this.buttonSizeInitial = 12; + this.buttonSize = initialButtonSize; } else { this.active = false; } @@ -535,7 +538,7 @@ export class ForbiddenZone { } draw(ctx, transformMapToScreenSpace, scaleFactor, idx) { - this.buttonSize = this.buttonSizeInitial * scaleFactor; + this.buttonSize = initialButtonSize * Math.min(scaleFactor,maxButtonSizeMultiplier); const p1 = new DOMPoint(this.x1, this.y1).matrixTransform(transformMapToScreenSpace); const p2 = new DOMPoint(this.x2, this.y2).matrixTransform(transformMapToScreenSpace); const p3 = new DOMPoint(this.x3, this.y3).matrixTransform(transformMapToScreenSpace); From 8d82f12f2a2853268c23c3bcbe465d96a06c7b72 Mon Sep 17 00:00:00 2001 From: Erinome Date: Mon, 27 Apr 2020 17:07:19 +0300 Subject: [PATCH 006/172] fix small graphical glitch with gen2 robot icon --- client/zone/js-modules/vacuum-map.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/zone/js-modules/vacuum-map.js b/client/zone/js-modules/vacuum-map.js index e37866a4..513356b7 100644 --- a/client/zone/js-modules/vacuum-map.js +++ b/client/zone/js-modules/vacuum-map.js @@ -348,23 +348,23 @@ export function VacuumMap(canvasElement) { function drawRobot(ctx, transformMapToScreenSpace) { function rotateRobot(img, angle) { var canvasimg = document.createElement("canvas"); - canvasimg.width = img.width; - canvasimg.height = img.height; + canvasimg.width = img.width + 4; + canvasimg.height = img.height + 4 var ctximg = canvasimg.getContext('2d'); ctximg.imageSmoothingQuality = 'high'; const offset = 90; - ctximg.clearRect(0, 0, img.width, img.height); - ctximg.translate(img.width / 2, img.width / 2); + ctximg.clearRect(0, 0, canvasimg.width, canvasimg.height); + ctximg.translate(canvasimg.width / 2, canvasimg.height / 2); ctximg.rotate((angle + offset) * Math.PI / 180); - ctximg.translate(-img.width / 2, -img.width / 2); - ctximg.drawImage(img, 0, 0); + ctximg.drawImage(img, -img.width / 2, -img.height / 2); return canvasimg; } const robotPositionInPixels = new DOMPoint(robotPosition[0] / 50, robotPosition[1] / 50).matrixTransform(transformMapToScreenSpace); + const robotIcon = robotAngle ? rotateRobot(img_rocky_scaled, robotAngle) : img_rocky_scaled; ctx.drawImage( - robotAngle ? rotateRobot(img_rocky_scaled, robotAngle) : img_rocky_scaled, - robotPositionInPixels.x - img_rocky_scaled.width / 2, // x - robotPositionInPixels.y - img_rocky_scaled.height / 2, // y + robotIcon, + robotPositionInPixels.x - robotIcon.width / 2, + robotPositionInPixels.y - robotIcon.height / 2, ); } From ceaf25b9cf4192dd22cc87286b3d641486b41f59 Mon Sep 17 00:00:00 2001 From: lollul Date: Sun, 19 Apr 2020 19:01:58 +0200 Subject: [PATCH 007/172] polish translation --- README.md | 2 +- client/locales/pl.json | 565 +++++++++++++++++++++++++++++ client/settings-web-interface.html | 1 + 3 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 client/locales/pl.json diff --git a/README.md b/README.md index 8a6d589e..d396233b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This is a heavily modified version of [Valetudo by Hypfer](https://github.com/Hy * Ability to specify the number of iterations to clean the same zone multiple times; * Showing device status on the map, and also dynamically switching buttons; * Experimental ability to save/restore maps; -* Multilanguage support, currently available in bg/de/en/es/fi/fr/hu/it/nl/ru; +* Multilanguage support, currently available in bg/de/en/es/fi/fr/hu/it/nl/ru/pl; * A telegram bot software for controlling the vacuum from the outside world; * Full support of room cleaning (requires Gen2 with firmware 2008+). diff --git a/client/locales/pl.json b/client/locales/pl.json new file mode 100644 index 00000000..ff8825dd --- /dev/null +++ b/client/locales/pl.json @@ -0,0 +1,565 @@ +{ + "common": { + "ok": "OK", + "submit": "Wyślij", + "cancel": "Anuluj", + "overwrite": "Nadpisz", + "continue": "Kontynuuj", + "dismiss": "Porzuć", + "prompt": "Zgłoszenie", + "warning": "Ostrzeżenie", + "attention": "Uwaga!", + "confirm": "Zatwierdź", + "close": "Zamknij", + "save": "Zapisz", + "cancelled": "Anulowane", + "enabled": "Włączone", + "commandOK": "Komenda wysłana poprawnie!", + "commandFailed": "Napotkano błąd:", + "connectionError": "Błąd połączenia", + "nameAlreadyUsed": "Nazwa \"{{name}}\" jest już w użyciu", + "m2": "m²", + "hours": "godzina", + "hours_plural": "godzina", + "months": [ + "Sty", + "Lut", + "Mar", + "Kwi", + "Maj", + "Cze", + "Lip", + "Sie", + "Wrz", + "Paź", + "Lis", + "Gru" + ], + "days": [ + "Poniedziałek", + "Wtorek", + "Środa", + "Czwartek", + "Piątek", + "Sobota", + "Niedziela" + ], + "unknownState": "zwrócił nieznany stan: {{state}}", + "timedOut": "przekroczono limit czasu" + }, + "navi": { + "home": "Dom", + "map": "Mapa", + "zones": "Strefy", + "control": "Sterowanie", + "settings": "Ustawienia", + "links": "Łącza", + "about": "O" + }, + "home": { + "labels": { + "area": "Obszar", + "time": "Czas", + "battery": "Bateria", + "state": "Ładowanie stanu..." + }, + "buttons": { + "start": "Start", + "pause": "Pauza", + "stop": "Stop", + "home": "Dom", + "spot": "Miejsce", + "find": "Znajdź", + "goto": "Idź do", + "zones": "Strefy", + "storeMap": "Zapisz mapę", + "loadMap": "Załaduj mapę", + "unknownPower": "Tryb pracy nieznany", + "invalid": "Niewłaściwy przycisk" + }, + "popups": { + "selectFanspeed": "Wybierz tryb pracy:", + "selectGotoTarget": "Wybierz cel:", + "selectZones": "Wybierz strefy do sprzątania:", + "selectMapToLoad": "Wybierz mapę do załadowania:", + "emptyZoneChosen": "Wybrano pustą strefę. Proszę najpierw ustawić strefy.", + "tooManyZones": "Wybrano {{count}} stref, podczas gdy można wybrać do 5 stref.", + "chooseMapName": "Wprowadź nazwę mapy do zapisania:", + "invalidMapName": "Nazwa może zawierać only litery i liczby, spacje i myślnik", + "slotAlreadyTaken": "Miejsce #{{slot}} jest już zajęte", + "nameAlreadyTaken": "Nazwa #{{name}} jest już zajęta", + "noMapsStored": "Brak zapisanych map!", + "slotNo": "miejsce #", + "confirmMapDelete": "Czy na pewno usunąć mapę \"{{name}}\"?", + "wait": "Czekaj", + "waitMapTicks": "Procedura zmiany mapy trwa. Proszę czekać {{seconds}} sekund...", + "waitMapFinished": "Zakończono", + "waitMapEncourage": "Procedura zmiany mapy powinna być zakończona.", + "mapStoredOK": "Mapa zapisana poprawnie!", + "mapDeletedOK": "Zapisana mapa została usunięta!", + "mapRestoredOK": "Mapa przywrócona poprawnie!" + }, + "fanspeedPresets": { + "whisper": "Szept", + "quiet": "Cichy", + "balanced": "Zrównoważony", + "turbo": "Turbo", + "max": "Max", + "mop": "Mop" + } + }, + "map": { + "status": "Stan", + "battery": "Bateria", + "connecting": "Łączę...", + "statusText": "{{status}}", + "errorText": "{{error}}", + "confirmFullCleaning": "Nie można rozpocząć sprzątania strefowego. Czy rozpocząć pełne sprzątanie?", + "cannotResume": "Nie można kontynuować!", + "noGotoTarget": "Należy wybrać miejsce dla komendy Idź do na mapie.", + "tooManyZones": "Nie można dodać więcej niż 5 stref na mapie." + }, + "zones": { + "headerZones": "Skonfigurowane strefy", + "headerGotoLocations": "Skonfigurwane miejsca docelowe", + "headerForbiddenMarkers": "Strefy zakazane", + "headerSegments": "Konfiguracja pokoi", + "noZonesConfigured": "Nie skonfigurowano jeszcze stref.", + "noSpotsConfigured": "Nie skonfigurowano jeszcze miejsc.", + "editForbiddenZones": "Skonfiguruj strefy zakazane", + "editSegments": "Edycja pokoi", + "noPersistentData": "Zapis danych jest wyłączony bądź niedostępny, zapis stref zakazanych jest niemożliwy.", + "noPersistentDataSegments": "Zapis danych jest wyłączony, nie można zapisać pokoi.", + "noSegmentsSupport": "Oprogramowanie Twojego urządzenia nie wspiera zapisu pokoi na mapie.", + "addButton": "Dodaj", + "renameButton": "Zmień nazwę", + "deleteButton": "Usuń", + "newZoneName": "Podaj nazwę strefy...", + "newSpotName": "Podaj nazwę miejsca...", + "enterZoneName": "Wprowadź nazwę strefy", + "enterSpotName": "Wprowadź nazwę miejsca", + "renameZone": "Wprowadź nową nazwę dla strefy \"{{zone}}\":", + "renameSpot": "Wprowadź nową nazwę dla miejsca \"{{spot}}\":", + "confirmDeleteSpot": "Czy na pewno usunąć miejsce \"{{spot}}\"?", + "confirmDeleteZone": "Czy na pewno usunąć strefę \"{{zone}}\"?", + "zonesPageBack": "Strefy", + "zoneEditTitle": "Edycja strefy: {{zone}}", + "tooManySubzones": "Nie można dodać ponad 5 podstref do jednej strefy.", + "tooManyMarkers": "Nie można dodać więcej stref zakazanych na mapie!", + "zonesSavedOK": "Poprawnie zapisano strefę!", + "spotsPageBack": "Miejsce", + "spotEditTitle": "Edycja miejsca: {{spot}}", + "spotsSavedOK": "Poprawnie zapisano miejsce!", + "forbiddenMarkersPageBack": "Strefy zakazane", + "forbiddenMarkersTitle": "Edycja stref zakazanych", + "forbiddenMarkersSavedOK": "Poprawnie zapisano strefy zakazane!", + "missingZone": "Nie ma takiej strefy.", + "missingSpot": "Nie ma takiego miejsca.", + "segmentsPageBack": "Pokoje", + "segmentsTitle": "Edycja pokoi", + "enterSegmentName": "Wpisz nazwę wybranego pokoju:", + "segmentRenamedOK": "Nazwa pokoju została zmieniona!", + "segmentRenameFailed": "Wystąpił błąd podczas zmiany nazwy pokoju.", + "segmentsCantBeMerged": "Możesz łączyć tylko sąsiednie pokoje. Kontynuować mimo wszystko?", + "confirmSegmentsMerge": "Czy na pewno chcesz spróbować połączyć pokoje „{{segment1}}” i „{{segment2}}”?", + "segmentsMergedOK": "Pomyślnie scalono pokoje!", + "segmentSplitNoLine": "Musisz umieścić linię cięcia nad pokojem, aby ją podzielić.", + "segmentSplitTooMany": "Nie możesz mieć więcej pokoi, połącz coś.", + "confirmSegmentSplit": "Czy na pewno chcesz spróbować podzielić pokój „{{segment}}”? Uwaga: może być konieczne kilkukrotne umieszczenie linii cięcia, aż do znalezienia właściwej pozycji.", + "segmentSplitOK": "Pomyślnie podzielono pokój!", + "segmentSplitSingleLine": "Może być tylko jedna linia podziału!", + "confirmSegmentsAutosplit": "Mapa zostanie automatycznie podzielona na pokoje po przeprowadzeniu pełnego sprzątania, ale możesz teraz spróbować ją podzielić. Kontyntynuj?", + "autosplitSegmentsNow": "Podziel teraz", + "segmentsSplitOK": "Mapa pomyślnie podzielona na pokoje!" + }, + "control": { + "startButton": "Uruchom Sterowanie Ręczne", + "stopButton": "Zatrzymaj Sterowanie Ręczne" + }, + "telegram": { + "fanpower": { + "whisper": "Szept", + "quiet": "Cichy", + "balanced": "Zrównoważony", + "turbo": "Turbo", + "max": "MAX", + "mop": "Tryb mopa" + }, + "buttons": { + "status": "Status", + "map": "Mapa", + "consumables": "Materiały eksploatacyjne", + "start": "Start", + "pause": "Pauza", + "resume": "Wznawianie", + "stop": "Stop", + "zones": "Strefy", + "spot": "Miejsce", + "rooms": "Pokoje", + "home": "Dom", + "findMe": "Znajdź mnie", + "goto": "Idź do", + "back": "-- wstecz --", + "runZoned": "- Uruchom sprzątanie strefowe -", + "runSegments": "-- Uruchom sprzątanie pokoi --" + }, + "missingPassword": "Hasło nie zostało podane.", + "wrongPassword": "Hasło jest nieprawidłowe.", + "clientAuthorized": "Klient autoryzowany, wpisz / start to start.", + "clientAlreadyAuthorized": "Klient już autoryzowany, wpisz / start to start.", + "notAuthenticated": "Nie masz uwierzytelnienia, użyj\n/setme *hasło*", + "cbqReceivedOK": "Polecenie przyjęte!", + "cbqFailed": "Błąd podczas uruchamiania polecenia!", + "cbqWrongState": "Polecenie niedostępne w bieżącym stanie urządzenia!", + "selectCommand": "Oczekiwanie na polecenie.", + "selectGotoTarget": "Wybierz cel dla IdźDo.", + "selectZones": "Wybierz strefy do sprzątania.", + "selectSegments": "Wybierz pokoje do sprzątnięcia.", + "selectPower": "Wybierz tryb mocy wentylatora.", + "selectMap": "Wybierz mapę do przywrócenia.", + "performingCleaning": "Zamierzam zrobić pełne sprzątnie.", + "performingZoned": "Przechodzenie do sprzątania strefowego:\n{{zoneNames}}", + "performingSegments": "Przystępuję do sprzątania pokoi:\n{{segmentNames}}", + "performingGoto": "Przechodzę do miejsca {{spotName}}.", + "noZonesConfigured": "Nie skonfigurowano jeszcze stref.", + "noSegmentsConfigured": "Brak pokoi na mapie.", + "noSpotsConfigured": "Brak skonfigurowanych miejsc.", + "noMapsStored": "Brak zapisanych map.", + "noZonesSpecified": "Musisz wybrać przynajmniej jedną strefę.", + "noSegmentsSpecified": "Wymagane jest przynajmniej jeden pokój.", + "noGotoTargetSpecified": "Musisz wybrać miejsce dla Goto.", + "noMapSpecified": "Musisz wybrać nazwę mapy.", + "selectedZones": "Aktualnie wybrane: {{zoneList}} ({{subzonesCount}}/5 podstref)", + "selectZoneIterations": "Kliknij wiele razy, aby dostroić liczbę iteracji.", + "tooManyZones": "Wybrano zbyt wiele podstref! Dozwolone - 5, wymagane - {{zoneCount}}.", + "noSegmentsSupported": "Sprzątanie pokoi nie jest wspierane przez oprogramowanie urządzenia.", + "selectedSegments": "Obecnie wybrano: {{segmentsList}}", + "noMapAvailable": "Przepraszamy, mapa jest obecnie niedostępna.", + "powerChanged": "Moc wentylatora zmieniona na {{fanPower}}.", + "mapLoadOK": "Mapa powinna zostać ponownie załadowana.", + "mapLoadWait": "Mapa powinna zostać ponownie załadowana za 30 sekund. Proszę czekać.", + "notificationsEnabled": "Powiadomienia o statusie włączone.", + "notificationsDisabled": "Powiadomienia o statusie wyłączone.", + "consumablesHeader": "Pozostały czas do upływu czasu liczników materiałów eksploatacyjnych:\n\n", + "consumablesAlert": "Upłynął jeden z liczników materiałów eksploatacyjnych:\n\n", + "consumablesContent": "Główna szczotka {{mainBrush}} pozostało godzin\nSzczotka boczna {{sideBrush}} pozostało godzin\nFiltr {{filter}} pozostało godzin\nCzujniki {{sensors}} pozostały godzin", + "binFull": "Przypuszcza się, że zatkany jest kosz na śmieci, sprawdź to!", + "currentStatus": "Aktualny stan: ", + "statusChanged": "Status zmieniony: ", + "power": "Moc: ", + "battery": "Bateria: ", + "errorReply": "Wystąpił błąd: {{error}}" + }, + "settings": { + "title": "Ustawienia", + "infoTitle": "Informacje", + "infoDesc": "Wyświetl informacje o urządzeniu", + "timersTitle": "Harmonogramy", + "timersDesc": "Zarządzaj zegarami i ustawieniami stref czasowych", + "carpetModeTitle": "Tryb dywanu", + "carpetModeDesc": "Skonfiguruj tryb dywanu", + "persistentDataTitle": "Trwałe dane", + "persistentDataDesc": "Skonfiguruj tryb laboratoryjny, aby włączyć wirtualne ściany itp", + "consumablesTitle": "Materiały eksploatacyjne", + "consumablesDesc": "Wyświetl / zresetuj liczniki zużycia materiałów eksploatacyjnych", + "cleaningHistoryTitle": "Historia sprzątania", + "cleaningHistoryDesc": "Zobacz historię sprzątania", + "wifiTitle": "Wi-Fi", + "wifiDesc": "Wyświetl / zmień szczegóły i ustawienia Wi-Fi", + "soundAndVoiceTitle": "Dźwięk i głos", + "soundAndVoiceDesc": "Zmień głośność i głos robota", + "webInterfaceTitle": "Interfejs użytkownika", + "webInterfaceDesc": "Zmień parametry interfejsu internetowego", + "accessControlTitle": "Kontrola dostępu", + "accessControlDesc": "Skonfiguruj klucze SSH i uwierzytelnianie HTTP", + "telegramTitle": "Telegram Bot", + "telegramDesc": "Włącz i skonfiguruj ustawienia bota Telegram", + "loading": "Ładowanie...", + "accessControl": { + "pageTitle": "Ustawienia kontroli dostępu", + "httpAuth": "Ustawienia uwierzytelniania HTTP", + "username": "Nazwa Użytkownika", + "password": "Hasło", + "passwordRepeat": "Hasło (powtórz)", + "saveCredentials": "Zapisz poświadczenia", + "sshKeys": "Ustawienia kluczy SSH", + "sshRSA": "ssh-rsa ...", + "saveKeys": "Zapisz klucze SSH", + "confirmDisableKeys": "Wpisz poniżej „confirm”. Nie zablokuj sam siebie!", + "disableKeys": "Trwale wyłącz przesyłanie klucza SSH", + "passwordsMismatch": "Hasła nie pasują do siebie." + }, + "carpetMode": { + "pageTitle": "Konfiguracja trybu dywanu", + "explanation": "W trybie dywanu odkurzacz automatycznie rozpozna dywany i zwiększy ssanie.", + "warning": "Zmień tylko jeden z poniższych parametrów, jeśli wiesz, co robisz!", + "currentLow": "Prąd niski", + "currentHigh": "Prąd wysoki", + "currentIntegral": "Prąd całkowity", + "stallTime": "Czas utknięcia", + "confirm": "Czy naprawdę chcesz zapisać zmiany wprowadzone w trybie dywanu?" + }, + "cleaningHistory": { + "header": "Ostatnie przebiegi sprzątania", + "loadMore": "Więcej...", + "showMap": "Pokaż mapę sprzątania", + "historyRecord": "# {{id}} rozpoczęto w dniu {{startDate}}", + "duration": "Czas", + "area": "Powierzchnia", + "completed": "Zakończony", + "code": "Kod", + "mapTitle": "Sprzątanie mapy od {{cleaningDate}}" + }, + "consumables": { + "mainBrush": "Główna szczotka", + "sideBrush": "Szczotka boczna", + "filter": "Filtr", + "sensorCleaning": "Czyszczenie czujnika", + "allStatistics": "Statystyki wszechczasów", + "totalCleanedArea": "Całkowity czyszczony obszar:", + "totalHours": "Łączne godziny sprzątania:", + "totalCount": "Całkowita ilość sprzątań:", + "hoursLeft": "Pozostało {{godziny}} godziny", + "hoursLeft_plural": "Pozostało {{godziny}} godzin", + "confirm": "Czy naprawdę chcesz zresetować ten materiał eksploatacyjny?" + }, + "info": { + "system": "System", + "firmwareVersion": "Wersja MiIO:", + "firmwareBuild": "Wersja oprogramowania:", + "firmwareUpdate": "Aktualizacja firmware:", + "firmwareUpdateLink": "[wysłać prośbę]", + "currentToken": "Aktualny token", + "token": "Znak:", + "appLocale": "Ustawienia regionalne aplikacji", + "appLocaleName": "Nazwa:", + "appLocaleBom": "Bom:", + "appLocaleLocation": "Lokalizacja:", + "appLocaleLanguage": "Język:", + "appLocaleTimezone": "Strefa czasowa:", + "appLocaleLogserver": "Logserver:", + "valetudo": "Valetudo RE", + "currentValetudoVersion": "Obecna wersja:", + "newValetudoVersion": "Ostatnia wersja:", + "newVersionURL": "URL nowej wersji", + "checkVersion": "Sprawdź", + "firmwareUpdateWarning": "Spróbuje to zaktualizować oprogramowanie urządzenia przy użyciu ręcznie wprowadzonego adresu URL do pliku pkg i jego wartości skrótu MD5. Pamiętaj, że adres URL powinien wskazywać na publiczny adres IP i nie może zawierać przekierowań.", + "firmwareUpdateEnterURL": "Wprowadź adres URL pliku pkg oprogramowania układowego:", + "firmwareUpdateEnterMD5": "Wprowadź skrót MD5 pliku, który właśnie określiłeś:", + "firmwareUpdateSend": "Wysłać!", + "firmwareUpdateSentOK": "Żądanie aktualizacji należy wysłać! Poczekaj na wskazanie LED procesu aktualizacji." + }, + "persistentData": { + "pageTitle": "Trwała konfiguracja danych", + "explanation": "Trwałe dane lub „tryb laboratoryjny” to funkcja Roborock S5x, która umożliwia zapisywanie zabronionych stref i wirtualnych ścian. Pozwala także robotowi wjechać z powrotem do stacji dokującej, gdziekolwiek się znajduje, i zapobiega obracaniu mapy.", + "notSupported": "Niestety, tylko Roborock S5x obsługuje trwałe funkcje map.", + "genericConfirm": "Czy na pewno chcesz kontynuować?", + "genericOverwriteWarning": "Wcześniej zapisane dane zostaną zastąpione.", + "deleteData": "Usuń trwałe dane", + "deleteDataButton": "Resetuj mapę", + "deleteDataNowButton": "Usuń teraz!", + "deleteDataTitle": "Spowoduje to usunięcie bieżącej mapy, wszystkich zakazanych stref i wirtualnych ścian!", + "deleteDataConfirm": "Spowoduje to usunięcie aktualnie zapisanej mapy, wszystkich zakazanych stref i wirtualnych ścian.", + "exportDesc": "Eksportuj strefy zakazane do pliku konfiguracji Valetudo", + "exportButton": "Eksport", + "exportNowButton": "Eksportuj dane", + "exportTitle": "To eksportuje zabronione strefy i dane wirtualnych ścian z oprogramowania układowego i zapisuje je w Valetudo", + "exportConfirm": "To eksportuje zabronione strefy i wirtualne ściany z oprogramowania wewnętrznego urządzenia i zapisuje je w konfiguracji Valetudo.", + "importDesc": "Importuj strefy zakazane z pliku konfiguracji Valetudo", + "importButton": "Import", + "importNowButton": "Zaimportować dane", + "importTitle": "Import zabronionych stref i wirtualych ścian z Valetudo i zapis w oprogramowaniu układowym", + "importConfirm": "Importuj zabronionych stref i wirtualnych ścian z konfiguracji Valetudo i zapis w oprogramowaniu urządzenia.", + "importConfirmDetails": "Gotowy do importowania {{virtualWallsCount}} i {{forbiddenZonesCount}}.", + "exportConfirmDetails": "Gotowy do eksportu {{virtualWallsCount}} i {{forbiddenZonesCount}}.", + "virtualWallsCount": "{{count}} wirtualna ściana", + "virtualWallsCount_plural": "{{count}} wirtualne ściany", + "forbiddenZonesCount": "{{count}} zakazana strefa", + "forbiddenZonesCount_plural": "{{count}} zabronione strefy", + "settingsSaved": "Ustawienia zapisane!", + "resetOK": "Reset mapy!", + "exportedOK": "Trwałe dane eksportowane do konfiguracji.", + "importedOK": "Trwałe dane importowane z konfiguracji." + }, + "soundAndVoice": { + "volumeSettings": "Ustawienia głośności dźwięku", + "volume": "Głośność:", + "saveVolume": "Zapisz poziom głośności", + "testVolume": "Sprawdź poziom głośności", + "installVoicePack": "Zainstaluj pakiet głosowy", + "voicePackFile": "Plik pakietu głosowego:", + "uploadVoicePack": "Prześlij pakiet głosowy", + "volumeSavedOK": "Wolumin został pomyślnie zapisany.", + "voicePackMissing": "Wybierz pakiet głosowy przed przesłaniem.", + "voicePackUploading": "Przesyłanie pakietu głosowego ...", + "voicePackInstalling": "Instalowanie pakietu głosowego ...", + "voicePackInstallFailed": "Nie udało się zainstalować pakietu głosowego.", + "voicePackInstallOK": "Pakiet głosowy został pomyślnie zainstalowany." + }, + "timers": { + "month": "Miesiąc", + "day": "Dzień", + "hour": "Godzina", + "minute": "Minuta", + "startAt": "Początek:", + "endAt": "Koniec:", + "hours": "godziny", + "minutes": "minuty", + "name": "Imię:", + "namePlaceholder": "nazwa harmonogramu", + "iterations": "Iteracje:", + "fanPower": "Moc wentylatora:", + "zones": "Strefy:", + "addZones": "Dodaj...", + "segments": "Pokoje:", + "addSegments": "Dodaj...", + "timerDesc": "Wybierz ustawienia harmonogramu.", + "timerZoneDesc": "Wybierz nazwę timera i współrzędne strefy.", + "timerTimeDesc": "Wybierz godzinę i datę, w której zegar ma zostać uruchomiony.", + "timerEmptyTimeNote": "Pusty oznacza dowolny.", + "timerDaysDesc": "Wybierz dni, w których stoper powinien być uruchamiany.", + "timerEmptyDayNote": "Pusty oznacza każdy dzień.", + "runOnce": "Uruchom raz i usuń", + "currentTimezone": "Twoja aktualna strefa czasowa jest ustawiona na:", + "zonedCleaningHeader": "Strefowy harmonogram sprzątania (beta)", + "noZonedCleaningSchedule": "Nie skonfigurowano jeszcze strefowego harmonogramu sprzątania.", + "cleaningHeader": "Harmonogram sprzątania", + "noCleaningSchedule": "Nie skonfigurowano jeszcze harmonogramu sprzątania.", + "DNDHeader": "„Nie przeszkadzać” - Harmonogram", + "chooseZone": "Wybierz strefę:", + "zoneCount": "Strefa {{count}}", + "zoneCount_plural": "{{count}} strefy", + "chooseSegment": "Wybierz pokój:", + "duplicatedSegment": "Nie można dodać tego samego pokoju wielokrotnie!", + "confirmDeleteTimer": "Czy na pewno chcesz usunąć ten zegar?", + "confirmTimezone": "Czy naprawdę chcesz ustawić swoją strefę czasową na „{{newTimezone}}”?", + "noDNDEnabled": "Nie włączono jeszcze harmonogramu DND.", + "DNDSchedule": "DND rozpocznie się o {{startHour}}: {{startMinute}} i zakończy się {{endHour}}: {{endMinute}}", + "noDNDSchedule": "Nie skonfigurowano jeszcze harmonogramu DND.", + "confirmDisableDND": "Czy naprawdę chcesz wyłączyć DND?", + "tooManyZones": "Podczas jednej sesji sprzątania nie można użyć więcej niż 5 stref.", + "notEnoughDataDND": "Nie można zapisać harmonogramu DND, ponieważ nie wszystkie wymagane atrybuty są podane!", + "missingHoursMinutes": "Należy podać zarówno minuty, jak i godziny.", + "missingName": "Powinieneś podać nazwę.", + "missingZones": "Należy określić jedną lub więcej niepustych stref.", + "missingTimer": "Nie ma takiego harmonogramu.", + "missingSegment": "Pokój nie odnaleziony na mapie!" + }, + "webInterface": { + "general": "Główne", + "localization": "Lokalizacja interfejsu użytkownika", + "localizationExt": "przełącza między dostępnymi tłumaczeniami", + "style": "Motyw", + "styleExt": "zmienia motyw kolorystyczny interfejsu użytkownika", + "homeTab": "Zakładka domyślna", + "zonedImmediate": "Natychmiast uruchom sprzątanie strefowe", + "zonedImmediateExt": "zamiast przejść do karty mapy", + "gotoImmediate": "Natychmiast przejdź do miejsca", + "gotoImmediateExt": "zamiast przejść do karty mapy", + "multimapButtons": "Pokaż przyciski wielu map", + "multimapButtonsExt": "umożliwia zapisywanie i przywracanie map (eksperymentalne)", + "mapTab": "Karta Mapa", + "hideMapStatus": "Nie pokazuj statusu na mapie", + "hideMapStatusExt": "ukrywa blok z tekstem statusu", + "hideSegmentMarkers": "Nie wyświetlaj znaczników pokoi", + "hideSegmentMarkersExt": "ukrywa znaczniki pokoi na mapie", + "disableMapReload": "Wyłącz przycisk przeładowania mapy", + "disableMapReloadExt": "ukrywa przycisk siły przeładowania na mapie", + "disableDynamicButtons": "Wyłącz przyciski dynamiczne", + "disableDynamicButtonsExt": "pokazuje na mapie tylko podstawowe przyciski", + "applyChangesConfirm": "Czy chcesz teraz zastosować zmiany?", + "enableMultimapConfirm": "Ta funkcja nie jest częścią funkcjonalności roborock, ale raczej szeregiem hacków wokół niej. Chociaż może działać dobrze, może również spowodować przywrócenie ustawień fabrycznych, jeśli coś nieoczekiwanie pójdzie nie tak. Czy nadal chcesz kontynuować?" + }, + "wifi": { + "currentConnection": "Obecne połączenie", + "status": "Status", + "ssid": "SSID", + "signal": "Sygnał", + "txBitrate": "TX Bitrate", + "settings": "Ustawienia wifi", + "password": "Hasło", + "save": "Zapisz nową konfigurację Wi-Fi", + "connected": "Połączony", + "notConnected": "Nie połączony", + "confirm": "Czy na pewno chcesz zastosować nowe ustawienia Wi-Fi?", + "hint": "Wskazówka", + "hintText": "Zawsze możesz wrócić do zintegrowanego hotspotu Wi-Fi, zapoznaj się z instrukcją obsługi dotyczącą resetowania ustawień Wi-Fi.", + "appliedOK": "Pomyślnie zastosowano nowe poświadczenia Wi-Fi. Po naciśnięciu OK strona zostanie odświeżona. Jednak najprawdopodobniej będziesz musiał zmienić adres URL, ponieważ robot spróbuje połączyć się z nowym Wi-Fi." + }, + "telegram": { + "explanation": "Utwórz nowy czat w Telegramie i wyszukaj konto „Botfather”, utwórz nowego bota za pomocą / newbot, a następnie skopiuj token i wstaw na tej stronie. Hasło ustawione tutaj zostanie użyte do autoryzacji bota.", + "general": "Ustawienia Telegram", + "token": "Token API HTTP:", + "tokenPlaceholder": "Token API HTTP od Botfather", + "authPassword": "Hasło bota:", + "authPasswordPlaceholder": "autoryzować na bocie", + "host": "Host API (opcjonalnie):", + "proxy": "Serwer proxy SOCKS5 (opcjonalnie):", + "proxyPlaceholder": "użytkownik: hasło@host:port", + "getRandomProxy": "Otrzymać", + "selectCountry": "Wybierz kraj:", + "sendConsumables": "Wyślij wiadomość, gdy jeden z materiałów eksploatacyjnych wygasł:", + "sendConsumablesEvery": "Każde sprzątanie wysyła komunikat, gdy upłynie termin ważności jednego z materiałów eksploatacyjnych:", + "notifyStatusTypes": "O jakich zmianach stanu powiadamiać:", + "notifyAll": "Wszystko", + "notifyCleaning": "Sprzątanie + błędy", + "notifyErrors": "Tylko błędy", + "status": "Aktualny stan połączenia z Telegram", + "clientsList": "Klienci telegramów", + "noClients": "Nie ma jeszcze autoryzowanych klientów.", + "confirmDeleteClient": "Czy na pewno chcesz usunąć tego klienta?", + "connectedAs": "Telegrambot podłączony jako {{botname}}", + "connectionFailed": "Połączenie Telegrambot nie powiodło się", + "notConnected": "Telegrambot nie podłączony" + } + }, + "robot": { + "states": { + "n0": "Łączę...", + "n1": "Startuję", + "n2": "Tryb gotowości bez ładowania", + "n3": "Bezczynny", + "n4": "Zdalne sterowanie aktywne", + "n5": "Sprzątanie", + "n6": "Powrót do stacji ładowania", + "n7": "Tryb ręczny", + "n8": "Ładowanie", + "n9": "Problem z ładowaniem", + "n10": "Wstrzymany", + "n11": "Sprzątanie miejscowe", + "n12": "Błąd", + "n13": "Wyłączanie", + "n14": "Aktualizacja", + "n15": "Dokowanie", + "n16": "Zmierzam do celu", + "n17": "Sprzątanie strefowe", + "n18": "Sprzątanie pokoi" + }, + "errors": { + "n0": "Brak błędu", + "n1": "Błąd laserowego czujnika odległości", + "n2": "Zderzak przedni zablokowany", + "n3": "Alarm czujników klifu, przenieś robota w inne miejsce", + "n4": "Brudne czujniki urwiska", + "n5": "Główna szczotka zablokowana", + "n6": "Zablokowana szczotka boczna", + "n7": "Główne koła zablokowały się", + "n8": "Urządzenie utknęło, przenieś robota w inne miejsce", + "n9": "Brak kolektora pyłu lub zły filtr", + "n10": "Zanieczyszczony filtr przeciwpyłowy", + "n11": "Utknął w barierze magnetycznej", + "n12": "Niski poziom baterii", + "n13": "Błąd ładowania", + "n14": "Awaria baterii", + "n15": "Zanieczyszczony czujnik ścienny", + "n16": "Powierzchnia nie jest płaska, przenieś robota w inne miejsce", + "n17": "Błąd szczotki bocznej, spróbuj uruchomić ponownie", + "n18": "Usterka wentylatora wyciągowego, spróbuj uruchomić ponownie", + "n19": "Niezasilana stacja ładowania", + "n21": "Przypięta górna pokrywa laserowego czujnika odległości", + "n22": "Brudny czujnik przedniego zderzaka", + "n23": "Obszar emisji sygnału na stacji dokującej jest zabrudzony", + "n24": "Wykryto zabroniony obszar, ewakuuj robota do dozwolonego miejsca" + } + } +} \ No newline at end of file diff --git a/client/settings-web-interface.html b/client/settings-web-interface.html index c375dc5e..e52a509c 100644 --- a/client/settings-web-interface.html +++ b/client/settings-web-interface.html @@ -23,6 +23,7 @@ + From 73a87764a37828248ae8686bf6f33d4b1dcc6468 Mon Sep 17 00:00:00 2001 From: Erinome Date: Tue, 28 Apr 2020 16:41:53 +0300 Subject: [PATCH 008/172] misc changes in dummycloud --- lib/miio/Dummycloud.js | 78 +++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/lib/miio/Dummycloud.js b/lib/miio/Dummycloud.js index f9feb00f..33972fc9 100644 --- a/lib/miio/Dummycloud.js +++ b/lib/miio/Dummycloud.js @@ -33,6 +33,7 @@ const Dummycloud = function (options) { this.socket.bind(8053, this.bindIP); this.lastMapPoll = new Date(0); + this.mapRetryCount = 0; this.statusLocked = false; this.connectedRobot = { @@ -48,7 +49,6 @@ const Dummycloud = function (options) { console.info(new Date(), "Dummycloud is spoofing " + this.spoofedIP + ":8053 on " + this.bindIP +":8053"); }); - this.socket.on("message", (incomingMsg, rinfo) => { const decodedResponse = this.codec.handleResponse(incomingMsg); let response; @@ -59,12 +59,10 @@ const Dummycloud = function (options) { this.connectedRobot.stamp = decodedResponse.stamp; if (decodedResponse.msg === null) { - if(decodedResponse.stamp === 0) { //Initial TimeSync Packet + if(decodedResponse.stamp === 0) { //Initial TimeSync Packet, but this might be missing //Respond with current time response = new TimeSyncPacket().header; - - console.info(new Date(), "Robot connected"); //TODO: Some kind of state which is available to the web - + console.info(new Date(), "Robot (re)connected"); //since it's connected, we force a poll setTimeout(() => { this.pollStatus(); @@ -138,7 +136,6 @@ const Dummycloud = function (options) { break; case "_sync.gen_presigned_url": case "_sync.batch_gen_room_up_url": - console.log(decodedResponse.msg); let MAP_UPLOAD_URLS = [], indexes = decodedResponse.msg.params && decodedResponse.msg.params.indexes || null; if (indexes && indexes.length) { @@ -211,19 +208,22 @@ const Dummycloud = function (options) { }; break; } - //Since miio_client apparently accepts negative message ids, we can use them to distinguish the requests //Also, it doesn't care about using the same message id many times } else if (decodedResponse.msg.id < 0) { switch(decodedResponse.msg.id) { case Dummycloud.SERVER_REQUESTS.MAP: if(Array.isArray(decodedResponse.msg.result) && decodedResponse.msg.result.length === 1) { - let timeout = [4,5,6,7,11,15,16,17,18].indexOf(this.connectedRobot.status.state) !== -1 ? 1000 : 60000; if (decodedResponse.msg.result[0] === "retry") { - timeout += 1000; + if (this.mapRetryCount++ < 5) + setTimeout(() => { + this.pollMap(true); // forcefully poll again + }, 200); } else if (decodedResponse.msg.result[0].startsWith("map_slot_")) { const gzippedMapData = this.map.snapshots[+decodedResponse.msg.result[0].substr(9)]; + if (gzippedMapData) zlib.gunzip(gzippedMapData, (err, data) => { + this.map.snapshots[+decodedResponse.msg.result[0].substr(9)] = null; if (!err) { const dataToHash = data.length > 48 ? data.slice(20, data.length - 29) : data; //strip index,sequence + digest const hashOfNewMap = crypto.createHash('sha1').update(dataToHash).digest('base64'); @@ -238,9 +238,6 @@ const Dummycloud = function (options) { } else console.log(err); }); } - setTimeout(() => { - this.pollMap(); - }, timeout); } break; case Dummycloud.SERVER_REQUESTS.STATUS: @@ -254,7 +251,6 @@ const Dummycloud = function (options) { console.info(new Date(), "Unknown cloud message received:", JSON.stringify(decodedResponse.msg)); } } - if(responseJSON) { response = this.codec.encode( Buffer.from(JSON.stringify(responseJSON), "utf8"), @@ -262,78 +258,82 @@ const Dummycloud = function (options) { decodedResponse.deviceId ); } - if (response) { - this.socket.send(response, 0, response.length, rinfo.port, rinfo.address); - } else if(decodedResponse.msg.id > 0) { + this.sendSocket(response); + } else if (decodedResponse.msg.id > 0) { console.info(new Date(), "No response for message:", JSON.stringify(decodedResponse.msg)); } }); - this.events.on("valetudo.dummycloud.pollmap", () => { - this.pollMap(true); + this.pollMap(); }); - this.events.on("valetudo.dummycloud.sendUpdateRequest", (params) => { this.sendUpdateRequest(params); }); - this.events.on("valetudo.dummycloud.lockStatus", (params) => { this.statusLocked = true; setTimeout(() => this.statusLocked = false, 5e3); }); }; +Dummycloud.prototype.sendSocket = function(message) { + if (this.connectedRobot.port !== 1) { + this.socket.send(message, 0, message.length, this.connectedRobot.port, this.connectedRobot.ip); + } +}; + Dummycloud.prototype.updateState = function(state) { if (!this.statusLocked) { Object.assign(this.connectedRobot.status, state); this.events.emit("miio.status", this.connectedRobot.status); } + if ([4,5,6,7,11,15,16,17,18].includes(this.connectedRobot.status.state)) { + this.pollMap(); + } }; -Dummycloud.prototype.pollMap = function(forced) {//200ms is theoretically possible - forced = !!forced || false; - - if(this.pollMapTimeout) { +Dummycloud.prototype.pollMap = function(retry) { + retry = !!retry || false; + if (this.pollMapTimeout) { clearTimeout(this.pollMapTimeout); } - + if (!retry) { + this.mapRetryCount = 0; + } + let timeout = [4,5,6,7,11,15,16,17,18].includes(this.connectedRobot.status.state) ? 1000 : 60000; const now = new Date(); - if (now - 1000 > this.lastMapPoll || forced) { + if (now - 900 > this.lastMapPoll || retry) { this.lastMapPoll = now; - var response = this.codec.encode( - Buffer.from(JSON.stringify({'method': 'get_map_v1', 'id': -1}), "utf8"), + Buffer.from(JSON.stringify({'method': 'get_map_v1', 'id': Dummycloud.SERVER_REQUESTS.MAP}), "utf8"), new Stamp({val: this.connectedRobot.stamp}), this.deviceId ); - - this.socket.send(response, 0, response.length, this.connectedRobot.port, this.connectedRobot.ip); + this.sendSocket(response); + } else { + timeout = 900 - (now - this.lastMapPoll); } - this.pollMapTimeout = setTimeout(() => { - this.pollMap() - }, 300000); //5 minutes + this.pollMap(); + }, timeout); }; Dummycloud.prototype.pollStatus = function() { var response = this.codec.encode( - Buffer.from(JSON.stringify({'method': 'get_status', 'id': -2}), "utf8"), + Buffer.from(JSON.stringify({'method': 'get_status', 'id': Dummycloud.SERVER_REQUESTS.STATUS}), "utf8"), new Stamp({val: this.connectedRobot.stamp}), this.deviceId ); - - this.socket.send(response, 0, response.length, this.connectedRobot.port, this.connectedRobot.ip); + this.sendSocket(response); }; Dummycloud.prototype.sendUpdateRequest = function(params) { var response = this.codec.encode( - Buffer.from(JSON.stringify({'method': 'miIO.ota', 'id': -3, 'params': {"mode": "normal", "install": "1", "app_url": params.url, "file_md5": params.md5, "proc": "dnld install"}}), "utf8"), + Buffer.from(JSON.stringify({'method': 'miIO.ota', 'id': Dummycloud.SERVER_REQUESTS.UPDATE, 'params': {"mode": "normal", "install": "1", "app_url": params.url, "file_md5": params.md5, "proc": "dnld install"}}), "utf8"), new Stamp({val: this.connectedRobot.stamp}), this.deviceId ); - - this.socket.send(response, 0, response.length, this.connectedRobot.port, this.connectedRobot.ip); + this.sendSocket(response); }; Dummycloud.SERVER_REQUESTS = { From b3418f14c2897400d7e5f297594bceb443893c31 Mon Sep 17 00:00:00 2001 From: Erinome Date: Tue, 28 Apr 2020 16:42:30 +0300 Subject: [PATCH 009/172] mark version 0.9.4 --- deployment/README.md | 11 + package.json | 10 +- yarn.lock | 1022 ++++++++---------------------------------- 3 files changed, 197 insertions(+), 846 deletions(-) diff --git a/deployment/README.md b/deployment/README.md index 614b3387..2b602adc 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -1,3 +1,13 @@ +### Conformance notice + +The instuctions below are suitable for devices with firmware based on full-featured +Ubuntu 14.04 distribution. As of 20.04.2020 any firmware fits this term except +for 3.5.7_002008 version for Gen2 devices. + +To initially install valetudo into 2008 firmware, users would have to create a special +version of firmware image using [rand256](https://github.com/rand256/vacuum)'s or [zvldz](https://github.com/zvldz/vacuum)'s image builder. +For further updating valetudo on that firmware, continue to the [wiki page](https://github.com/rand256/valetudo/wiki/Updating-valetudo-binary-on-2008-firmware). + ### Downloading pre-built Valetudo You can simply download pre-built binaries of Valetudo from the @@ -61,6 +71,7 @@ To install scp `*.deb`s to the vacuum and run `dpkg -i file.deb`. Another way to deal with this issue is to manually rebuild `pkg` binaries to link libstd++ statically. This is the way how prebuilt Valetudo binary was created here. +Some ready to use patched node.js binaries are available in this repository [Releases section](https://github.com/rand256/valetudo/releases). ### Installing and configuring diff --git a/package.json b/package.json index 47ca95a2..b275d078 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "valetudo-re", - "version": "0.9.3", + "version": "0.9.4", "description": "Self-contained control webinterface for xiaomi vacuum robots", "main": "index.js", "bin": "index.js", @@ -12,7 +12,7 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "pkg --targets node10-linux-armv7 --no-bytecode --options max-old-space-size=32,optimize_for_size --public-packages=prettycron . --output valetudo" + "build": "pkg --targets node12.16.1-linux-armv7 --no-bytecode --options max-old-space-size=32,optimize_for_size --public-packages=prettycron . --output valetudo" }, "author": "", "dependencies": { @@ -24,13 +24,13 @@ "express-dynamic-middleware": "^1.0.0", "mqtt": "^3.0.0", "multer": "^1.4.2", - "pngjs": "^4.0.0", + "pngjs": "^5.0.0", "prettycron": "^0.10.0", "slimbot": "^4.4.0", "socks5-client": "^1.2.8", - "ws": "^7.2.3" + "ws": "^7.2.5" }, "devDependencies": { - "pkg": "4.4.0" + "pkg": "4.4.8" } } diff --git a/yarn.lock b/yarn.lock index 5dcf37de..3979df0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/parser@~7.4.4": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== +"@babel/parser@^7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== "@babel/runtime@^7.9.2": version "7.9.2" @@ -14,55 +14,32 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@~7.4.4": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" - integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== dependencies: - regenerator-runtime "^0.13.2" + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "13.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" - integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== - accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -81,13 +58,6 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -101,42 +71,15 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== asn1@~0.2.3: version "0.2.4" @@ -150,11 +93,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -172,16 +110,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -202,19 +130,6 @@ base64-js@^1.3.0: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - 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" - basic-auth@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -266,21 +181,12 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - 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" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" buffer-from@^1.0.0: version "1.1.1" @@ -310,26 +216,6 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - 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" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - callback-stream@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908" @@ -351,40 +237,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@~2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -392,11 +244,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -417,11 +264,6 @@ commist@^1.0.0: leven "^2.1.0" minimist "^1.1.0" -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -479,11 +321,6 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -511,7 +348,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -525,38 +362,11 @@ debug@^4.1.1: dependencies: ms "^2.1.1" -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -580,12 +390,12 @@ dicer@0.2.5: readable-stream "1.1.x" streamsearch "0.1.2" -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - path-type "^3.0.0" + path-type "^4.0.0" duplexify@^3.5.1, duplexify@^3.6.0: version "3.7.1" @@ -684,27 +494,22 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== +escodegen@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== dependencies: - esprima "^3.1.3" + esprima "^4.0.1" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: version "4.3.0" @@ -734,19 +539,6 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - 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" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -809,40 +601,11 @@ ext@^1.1.2: dependencies: type "^2.0.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - 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" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -858,17 +621,17 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== +fast-glob@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" + integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + "@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@^2.0.0: version "2.1.0" @@ -880,15 +643,19 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +fastq@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" + integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" @@ -903,11 +670,6 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -927,13 +689,6 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -947,22 +702,12 @@ from2@^2.3.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - at-least-node "^1.0.0" graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@~7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" @@ -971,11 +716,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -991,6 +731,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob-stream@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" @@ -1007,12 +754,7 @@ glob-stream@^6.1.0: to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.1.1, glob@^7.1.3: +glob@^7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1024,21 +766,19 @@ glob@^7.1.1, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globby@~9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +globby@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + 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" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -1056,47 +796,11 @@ har-validator@~5.1.3: ajv "^6.5.5" har-schema "^2.0.0" -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - help-me@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6" @@ -1145,10 +849,10 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ignore@^4.0.3: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== inflight@^1.0.4: version "1.0.6" @@ -1168,7 +872,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -into-stream@~5.1.0: +into-stream@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8" integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA== @@ -1198,69 +902,6 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1273,7 +914,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -1285,19 +926,10 @@ is-negated-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-relative@^1.0.0: version "1.0.0" @@ -1318,7 +950,7 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -1328,23 +960,11 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1387,15 +1007,6 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== - dependencies: - universalify "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -1406,30 +1017,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - later@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/later/-/later-1.2.0.tgz#f2cf6c4dd7956dd2f520adf0329836e9876bad0f" @@ -1453,18 +1040,6 @@ lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -1475,7 +1050,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.2.3: +merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== @@ -1485,24 +1060,13 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - 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" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": version "1.43.0" @@ -1528,19 +1092,11 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.0: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp@^0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" @@ -1621,7 +1177,7 @@ multer@^1.4.2: type-is "^1.6.4" xtend "^4.0.0" -multistream@~2.1.1: +multistream@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c" integrity sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ== @@ -1629,23 +1185,6 @@ multistream@~2.1.1: inherits "^2.0.1" readable-stream "^2.0.5" -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - 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" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -1666,29 +1205,6 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -1742,11 +1258,6 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -1757,7 +1268,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-parse@^1.0.5: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -1767,38 +1278,31 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -pkg-fetch@~2.6.2: - version "2.6.5" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-2.6.5.tgz#39dfebfe66d146625e444550d85cd7d34ee67155" - integrity sha512-Z1GVXdQNqlMnKpgwBfrE15FHh5LUsd4ttaEXwqKIQC6gtpfoa/TfG9xUtkuzp+gZ0KnOoiZwIcAoNOZYcYXvwQ== +pkg-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-2.6.7.tgz#4625b1583e5b32e0771f35c1dc56306e52f1a3db" + integrity sha512-hQ+M53fphA300EkIvNoIxEdFltWcsDOqHZlaFzWJ78wIuFTIT7OrnXUQMAGC6qLkXq7eWCMU/4pTWsFvprUZMg== dependencies: "@babel/runtime" "^7.9.2" byline "^5.0.0" chalk "^3.0.0" expand-template "^2.0.3" - fs-extra "^9.0.0" + fs-extra "^8.1.0" minimist "^1.2.5" progress "^2.0.3" request "^2.88.0" @@ -1806,34 +1310,29 @@ pkg-fetch@~2.6.2: semver "^6.3.0" unique-temp-dir "^1.0.0" -pkg@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/pkg/-/pkg-4.4.0.tgz#9b6f2c77f891b6eb403681f5a8c1d2de09a976d3" - integrity sha512-bFNJ3v56QwqB6JtAl/YrczlmEKBPBVJ3n5nW905kgvG1ex9DajODpTs0kLAFxyLwoubDQux/RPJFL6WrnD/vpg== - dependencies: - "@babel/parser" "~7.4.4" - "@babel/runtime" "~7.4.4" - chalk "~2.4.2" - escodegen "~1.11.1" - fs-extra "~7.0.1" - globby "~9.2.0" - into-stream "~5.1.0" - minimist "~1.2.0" - multistream "~2.1.1" - pkg-fetch "~2.6.2" - progress "~2.0.3" - resolve "1.6.0" - stream-meter "~1.0.4" - -pngjs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.0.tgz#f44143e90be0b20cab967bb58b483c035e1523fd" - integrity sha512-607/ROF2oFEQoL+cQD894iYHdZhXWB8lISaR4MWI8VUgHPViC7FODcIySWCdnkkdrVD4YrfVU8Rmd6ZlMkq8Pw== +pkg@4.4.8: + version "4.4.8" + resolved "https://registry.yarnpkg.com/pkg/-/pkg-4.4.8.tgz#145fb81f31eebfb90d2010dd2c4b663ca0db4009" + integrity sha512-Fqqv0iaX48U3CFZxd6Dq6JKe7BrAWbgRAqMJkz/m8W3H5cqJ6suvsUWe5AJPRlN/AhbBYXBJ0XG9QlYPTXcVFA== + dependencies: + "@babel/parser" "^7.9.4" + "@babel/runtime" "^7.9.2" + chalk "^3.0.0" + escodegen "^1.14.1" + fs-extra "^8.1.0" + globby "^11.0.0" + into-stream "^5.1.1" + minimist "^1.2.5" + multistream "^2.1.1" + pkg-fetch "^2.6.7" + progress "^2.0.3" + resolve "^1.15.1" + stream-meter "^1.0.4" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== prelude-ls@~1.1.2: version "1.1.2" @@ -1853,7 +1352,7 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.3, progress@~2.0.3: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -1958,19 +1457,11 @@ readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - reinterval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" @@ -1981,16 +1472,6 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -2041,22 +1522,22 @@ request@^2.88.0, request@^2.88.2: tunnel-agent "^0.6.0" uuid "^3.3.2" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" - integrity sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw== +resolve@^1.15.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" @@ -2068,13 +1549,6 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2114,25 +1588,15 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slimbot@^4.4.0: version "4.6.3" @@ -2145,36 +1609,6 @@ slimbot@^4.4.0: request-promise "^4.2.5" socks5-https-client "^1.2.1" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - 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" - socks5-client@^1.2.8, socks5-client@~1.2.3: version "1.2.8" resolved "https://registry.yarnpkg.com/socks5-client/-/socks5-client-1.2.8.tgz#6470e4d781de254ee9f3b5ec9760a44c5df898da" @@ -2189,39 +1623,11 @@ socks5-https-client@^1.2.1: dependencies: socks5-client "~1.2.3" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - 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" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/split2/-/split2-3.1.1.tgz#c51f18f3e06a8c4469aaab487687d8d956160bb6" @@ -2249,14 +1655,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -2267,7 +1665,7 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-meter@~1.0.4: +stream-meter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0= @@ -2303,13 +1701,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" @@ -2346,30 +1737,12 @@ to-absolute-glob@^2.0.0: is-absolute "^1.0.0" is-negated-glob "^1.0.0" -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" + is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" @@ -2441,16 +1814,6 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-stream@^2.0.2: version "2.3.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" @@ -2473,24 +1836,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -2498,16 +1848,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - 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" @@ -2568,10 +1908,10 @@ ws@^3.2.0: safe-buffer "~5.1.0" ultron "~1.1.0" -ws@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.5.tgz#abb1370d4626a5a9cd79d8de404aa18b3465d10d" + integrity sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA== xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" From 0bb840882bcbc55046dd245731c600a7e0c1d6d5 Mon Sep 17 00:00:00 2001 From: elvis7 Date: Fri, 1 May 2020 22:35:19 +0300 Subject: [PATCH 010/172] Latvian translation --- README.md | 2 +- client/locales/lv.json | 544 +++++++++++++++++++++++++++++ client/settings-web-interface.html | 1 + 3 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 client/locales/lv.json diff --git a/README.md b/README.md index d396233b..eb4f585b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This is a heavily modified version of [Valetudo by Hypfer](https://github.com/Hy * Ability to specify the number of iterations to clean the same zone multiple times; * Showing device status on the map, and also dynamically switching buttons; * Experimental ability to save/restore maps; -* Multilanguage support, currently available in bg/de/en/es/fi/fr/hu/it/nl/ru/pl; +* Multilanguage support, currently available in bg/de/en/es/fi/fr/hu/it/lv/nl/ru/pl; * A telegram bot software for controlling the vacuum from the outside world; * Full support of room cleaning (requires Gen2 with firmware 2008+). diff --git a/client/locales/lv.json b/client/locales/lv.json new file mode 100644 index 00000000..ce66331f --- /dev/null +++ b/client/locales/lv.json @@ -0,0 +1,544 @@ +{ + "common": { + "ok": "Labi", + "submit": "Apstiprināt", + "cancel": "Atcelt", + "overwrite": "Pārrakstīt", + "continue": "Turpināt", + "dismiss": "Atbrīvot", + "prompt": "Pamudināt", + "warning": "Brīdinājums", + "attention": "Uzmanību!", + "confirm": "Apstiprināt", + "close": "Aizvērt", + "save": "Saglabāt", + "cancelled": "Atcelts", + "enabled": "Ieslēgts", + "commandOK": "Komanda veiksmīgi nosūtīta!", + "commandFailed": "Radās kļūda:", + "connectionError": "Savienojuma kļūme", + "nameAlreadyUsed": "Vārds \"{{name}}\" tiek jau izmantots", + "m2": "m²", + "hours": "stunda", + "hours_plural": "stundas", + "months": ["Jan","Feb","Mar","Apr","Maijs","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"], + "days": ["Pirmdiena","Otrdiena","Trešdiena","Ceturdiena","Piektdiena","Sestdiena","Svētdiena"], + "unknownState": "atgriezts nezināms stāvoklis: {{state}}", + "timedOut": "izpildes laiks bija beidzies" + }, + "navi": { + "home": "Galvenā", + "map": "Karte", + "zones": "Zonas", + "control": "Kontrole", + "settings": "Uzstādījumi", + "links": "Saites", + "about": "Par" + }, + "home": { + "labels": { + "area": "Platība", + "time": "Laiks", + "battery": "Akumulators", + "state": "Notiek ielāde..." + }, + "buttons": { + "start": "Sākt", + "pause": "Pauze", + "stop": "Apturēt", + "home": "Stacija", + "spot": "Lokālā", + "find": "Atrast", + "goto": "Dodies uz", + "zones": "Zonas", + "storeMap": "Saglabāt karti", + "loadMap": "Ielādēt karti", + "unknownPower": "Nezināms spriegums", + "invalid": "Nederīga poga" + }, + "popups": { + "selectFanspeed": "Izvēlieties sūkšanas jaudu:", + "selectGotoTarget": "Izvēlieties kurp doties:", + "selectZones": "Izvēlieties zonas tīrīšanai:", + "selectMapToLoad": "Izvēlieties karti kuru vēlaties ielādēt:", + "emptyZoneChosen": "Jūs izvēlējāties tukšu zonu tīrīšanai. Izveidojiet zonu un mēģiniet vēlreiz.", + "tooManyZones": "Jūs mēģinat izvēlēties {{count}} apakšzonas, ir atļauts ne vairāk par 5 apakšzonām.", + "chooseMapName": "Norādiet nosaukumu ar kuru vēlaties saglabāt karti:", + "invalidMapName": "Virsrakstā var būt tikai latīņu burti vai cipari, atstarpes un defise.", + "slotAlreadyTaken": "Slots #{{slot}} ir jau aizņemts", + "nameAlreadyTaken": "Vārds \"{{name}}\" ir jau aizņemts", + "noMapsStored": "Nav saglabātu karšu!", + "slotNo": "slots #", + "confirmMapDelete": "Vai esat drošs, ka vēlaties izdzēst \"{{name}}\"?", + "wait": "Gaidiet", + "waitMapTicks": "Karte tiek ielādēta. Lūdzu uzgaidiet {{seconds}} sekundes...", + "waitMapFinished": "Pabeigts", + "waitMapEncourage": "Pieprasītajai procedūrai vajadzētu būt pabeigtai.", + "mapStoredOK": "Karte saglabāta veiksmīgi!", + "mapDeletedOK": "Saglabātā karte ir veiksmīgi izdzēsta!", + "mapRestoredOK": "Karte atjaunota veiksmīgi!" + }, + "fanspeedPresets": { + "whisper": "Ļoti kluss", + "quiet": "Kluss", + "balanced": "Vidējs režīms", + "turbo": "Turbo", + "max": "Maksimālais", + "mop": "Uzslaucīt" + } + }, + "map": { + "status": "Stāvoklis", + "battery": "Akumulators", + "connecting": "Savieno...", + "statusText": "{{status}}", + "errorText": "{{error}}", + "confirmFullCleaning": "Nevar sākt zonu tīrīšanu: nav norādītas zonas. Vai vēlaties tā vietā veikt pilnu tīrīšanu?", + "cannotResume": "Nav darbības ko atsākt!", + "noGotoTarget": "Norādiet punktu kartē uz kuru doties.", + "tooManyZones": "Jūs nevarat norādīt vairāk par 5 zonām kartē." + }, + "zones": { + "headerZones": "Tīrāmās zonas", + "headerGotoLocations": "Doties uz punktiem", + "headerForbiddenMarkers": "Aizlieguma marķieri", + "headerSegments": "Istabu uzstādījumi", + "noZonesConfigured": "Pagaidām nav nokonfigurēta neviena zona.", + "noSpotsConfigured": "Pagaidām nav nokonfigurēts neviens punkts.", + "editForbiddenZones": "Konfigurēt aizliegtās zonas", + "editSegments": "Rediģēt telpas", + "noPersistentData": "Kartes saglabāšana ir atslēgta vai nav pieejama - aizlieguma zonu iestatīšana nav iespējama.", + "noPersistentDataSegments": "Kartes saglabāšana ir atslēgta, tādēļ istabu iestatīšana nav iespējama.", + "noSegmentsSupport": "Jūsu ierīces programmaparatūra neatbalsta kartes sadalīšanu istabās.", + "addButton": "Pievienot", + "renameButton": "Pārsaukt", + "deleteButton": "Dzēst", + "newZoneName": "Ievadiet zonas nosaukumu ...", + "newSpotName": "Ievadiet lokālā punkta nosaukumu ...", + "enterZoneName": "Nepieciešams ievadīt zonas nosaukumu", + "enterSpotName": "Nepieciešams ievadīt lokālā punkta nosaukumu", + "renameZone": "Norādiet jauno nosaukumu zonai \"{{zone}}\":", + "renameSpot": "Norādiet jauno nosaukumu punktam \"{{spot}}\":", + "confirmDeleteSpot": "Vai esat drošs, ka vēlaties dzēst punktu \"{{spot}}\"?", + "confirmDeleteZone": "Vai esat drošs, ka vēlaties dzēst zonu \"{{zone}}\"?", + "zonesPageBack": "Zonas", + "zoneEditTitle": "Zonas rediģēšana: {{zone}}", + "tooManySubzones": "Jūs nevarat pievienot vienai zonai vairāk par 5 apakšzonām.", + "tooManyMarkers": "Pārāk daudz aizliegto marķieru kartē!", + "zonesSavedOK": "Veiksmīgi saglabāta zona!", + "spotsPageBack": "Punkti", + "spotEditTitle": "Punktu rediģēšana: {{spot}}", + "spotsSavedOK": "Veiksmīgi saglabāts punkts!", + "forbiddenMarkersPageBack": "Aizliegtie marķieri", + "forbiddenMarkersTitle": "Marķieru rediģēšana", + "forbiddenMarkersSavedOK": "Veiksmīgi saglabāts aizlieguma marķieris!", + "missingZone": "Zona netika atrasta.", + "missingSpot": "Punkts netika atrasts.", + "segmentsPageBack": "Telpas", + "segmentsTitle": "Istabu rediģēšana", + "enterSegmentName": "Lūdzu norādiet telpas nosaukumu:", + "segmentRenamedOK": "Telpa veiksmīgi saglabāta!", + "segmentRenameFailed": "Telpas pārsaukšanas procesā notikusi kļūme.", + "segmentsCantBeMerged": "Var apvienot tikai blakus esošās telpas. Vai turpināt?", + "confirmSegmentsMerge": "Vai tiešām vēlaties izmēģināt istabu \"{{segment1}}\" un \"{{segment2}}\" apvienošanu?", + "segmentsMergedOK": "Telpas veiksmīgi apvienotas", + "segmentSplitNoLine": "Lai sadalītu istabu, griezuma līnija ir jānovieto virs telpas.", + "segmentSplitTooMany": "Jums nevar būt vairāk istabu, lūdzu, kaut ko apvienojiet.", + "confirmSegmentSplit": "Vai tiešām vēlaties izmēģināt telpas \"{{segment}}\" sadalīšanu? Piezīme: varētu būt nepieciešams griešanas līniju novietot vairākas reizes, līdz atrodat pareizo pozīciju.", + "segmentSplitOK": "Telpa veiksmīgi sadalīta!", + "segmentSplitSingleLine": "Sadalīšanas līnija var būt tikai viena!", + "confirmSegmentsAutosplit": "Pēc pilnīgas uzkopes karte tiks automātiski sadalīta istabās, taču jūs varat mēģināt to sadalīt tūlīt. Vai turpināt?", + "autosplitSegmentsNow": "Sadalīt tagad", + "segmentsSplitOK": "Karte veiksmīgi sadalīta istabās!" + }, + "control": { + "startButton": "Sākt Manuālo Vadību", + "stopButton": "Beigt Manuālo Vadību" + }, + "telegram": { + "fanpower": { + "whisper": "Ļoti kluss", + "quiet": "Kluss", + "balanced": "Vidējs režīms", + "turbo": "Turbo", + "max": "Maksimālais", + "mop": "Uzslaucīt" + }, + "buttons": { + "status": "Stāvoklis", + "map": "Karte", + "consumables": "Palīgmateriāli", + "start": "Sākt", + "pause": "Pauze", + "resume": "Turpināt", + "stop": "Apturēt", + "zones": "Zonas", + "spot": "Lokālā", + "rooms": "Telpas", + "home": "Stacija", + "findMe": "Atrast mani", + "goto": "Doties uz", + "back": "-- atgriezties --", + "runZoned": "-- Sākt zonas tīrīšanu --", + "runSegments": "-- Sākt telpas tīrīšanu --" + }, + "missingPassword": "Parole netika norādīta.", + "wrongPassword": "Nepareiza parole.", + "clientAuthorized": "Klients autorizēts, ierakstiet /start lai sāktu.", + "clientAlreadyAuthorized": "Klients jau autorizēts, ierakstiet /start lai sāktu.", + "notAuthenticated": "Jūs neesat autorizēts, ievadiet\n/setme *parole*", + "cbqReceivedOK": "Komanda pieņemta!", + "cbqFailed": "Radusies kļūda komandas palaišanas laikā!", + "cbqWrongState": "Komanda pašreizējā ierīces stāvoklī nav pieejama!", + "selectCommand": "Gaida komandu.", + "selectGotoTarget": "Atlasīt mērķim Doties uz punktu.", + "selectZones": "Atlasiet tīrāmās zonas.", + "selectSegments": "Atlasiet tīrāmās telpas.", + "selectPower": "Atlasiet sūkšanas jaudas režīmu.", + "selectMap": "Atlasiet karti, kuru atjaunot", + "performingCleaning": "Notiek pilnīga uzkopšana.", + "performingZoned": "Pāriet uz zonas tīrīšanu:\n{{zoneNames}}", + "performingSegments": "Pāriet uz telpu tīrīšanu:\n{{segmentNames}}", + "performingGoto": "Doties uz \"{{spotName}}\" punktu.", + "noZonesConfigured": "Vēl nav konfigurētas zonas..", + "noSegmentsConfigured": "Kartē nav pieejamu istabu.", + "noSpotsConfigured": "Pagaidām nav konfigurēti punkti.", + "noMapsStored": "Nav nevienas saglabātas kartes.", + "noZonesSpecified": "Jums jāizvēlas vismaz viena zona.", + "noSegmentsSpecified": "Jums jāizvēlas vismaz viena telpa.", + "noGotoTargetSpecified": "Jums jāizvēlas punkts uz kuru doties.", + "noMapSpecified": "Jums jāizvēlas kartes nosaukums.", + "selectedZones": "Pašreiz atlasīts: {{zonesList}} ({{subzonesCount}}/5 apakšzonas)", + "selectZoneIterations": "Noklikšķiniet vairākas reizes, lai noregulētu iterāciju skaitu.", + "tooManyZones": "Atlasīts pārāk daudz apakšzonu! Atļauts - 5, pieprasīts - {{zonesCount}}.", + "noSegmentsSupported": "Jūsu ierīces programmaparatūra neatbalsta telpu režīma uzkopšanu.", + "selectedSegments": "Pašreiz atlasīts: {{segmentsList}}", + "noMapAvailable": "Atvainojiet, karte šobrīd nav pieejama.", + "powerChanged": "Sūkšanas jauda ir mainīta uz {{fanPower}}.", + "mapLoadOK": "Karte tagad ir jāielādē atkārtoti.", + "mapLoadWait": "Kartei jāielādējās atkārtoti 30 sekundēs. Lūdzu, uzgaidiet.", + "notificationsEnabled": "Stāvokļa paziņojumi ieslēgti.", + "notificationsDisabled": "Stāvokļa paziņojumi atslēgti.", + "consumablesHeader": "Atlikušais laiks līdz palīgmateriālu termiņa beigām:\n\n", + "consumablesAlert": "Vienam no palīgmateriāliem ir beidzies derīguma termiņš:\n\n", + "consumablesContent": "Galvenai birste atlikušas {{mainBrush}} stund(a/as) \nSānu birstei atlikušas {{sideBrush}} stund(a/as) \nFiltram atlicis {{filter}} stund(a/as) \nSensorus jātīra pēc {{sensors}} stund(ām/as)", + "binFull": "Putekļu tvertnē iespējams aizsprostojums, lūdzu pārbaudiet to!", + "currentStatus": "Esošais stāvoklis: ", + "statusChanged": "Jaunais stāvoklis: ", + "power": "Jauda: ", + "battery": "Akumulators: ", + "errorReply": "Notika kļūme: {{error}}" + }, + "settings": { + "title": "Uzstādījumi", + "infoTitle": "Informācija", + "infoDesc": "Informācija par ierīci", + "timersTitle": "Taimers", + "timersDesc": "Pārvaldīt taimerus un laika joslu iestatījumus", + "carpetModeTitle": "Tepiķa režīms", + "carpetModeDesc": "Iestatīt paklāja režīmu", + "persistentDataTitle": "Kartes saglabāšana", + "persistentDataDesc": "Virtuālās sienas un ierobežojumu marķieri", + "consumablesTitle": "Palīgmateriāli", + "consumablesDesc": "Palīgmateriālu patēriņa skaitītājs", + "cleaningHistoryTitle": "Uzkopšanas vēsture", + "cleaningHistoryDesc": "Apskatīt uzkopšanas vēsturi", + "wifiTitle": "Bezvadu internets", + "wifiDesc": "Skatiet / mainiet wifi informāciju un iestatījumus", + "soundAndVoiceTitle": "Skaļums un balss", + "soundAndVoiceDesc": "Mainiet skaņas paziņojumus un skaļumu", + "webInterfaceTitle": "Tīmekļa saskarne", + "webInterfaceDesc": "Mainiet tīmekļa saskarnes parametrus", + "accessControlTitle": "Piekļuves kontrole", + "accessControlDesc": "Konfigurējiet SSH atslēgas un HTTP autentifikāciju", + "telegramTitle": "Telegram Bots", + "telegramDesc": "Ieslēgt un konfigurēt Telegram bota uzstādījumus", + "loading": "ielādē...", + "accessControl": { + "pageTitle": "Piekļuves kontrole uzstādījumi", + "httpAuth": "HTTP autentifikācijas iestatījumi", + "username": "Lietotājs", + "password": "Parole", + "passwordRepeat": "Parole (atkārtoti)", + "saveCredentials": "Saglabāt datus", + "sshKeys": "SSH atslēgas uzstādījumi", + "sshRSA": "ssh-rsa ...", + "saveKeys": "Saglabāt SSH atslēgu", + "confirmDisableKeys": "Ievadiet \"confirm\" lai apstiprinātu. Nenobloķējiet sevi!", + "disableKeys": "Atslēgt SSH atslēgas augšupielādi", + "passwordsMismatch": "Paroles nesakrīt." + }, + "carpetMode": { + "pageTitle": "Tepiķa Režīma Konfigurācija", + "explanation": "Tepiķa režīmā putekļusūcējs automātiski atpazīs virsmu un palielinās iesūkšanas jaudu.", + "warning": "Mainiet kādu no šiem parametriem tikai tad, ja zināt, ko darāt!", + "currentLow": "Zema strāva", + "currentHigh": "Augsta strāva", + "currentIntegral": "Integrāla strāva", + "stallTime": "Apstāšanās laiks", + "confirm": "Vai tiešām vēlaties saglabāt modifikācijas, kas veiktas tepiķa režīmā?" + }, + "cleaningHistory": { + "header": "Pēdējā uzkopšanas reize", + "loadMore": "Vairāk...", + "showMap": "Apskatīt uzkopšanas karti", + "historyRecord": "#{{id}} no {{startDate}}", + "duration": "Ilgums", + "area": "Platība", + "completed": "Pabeigts", + "code": "Kods", + "mapTitle": "Uzkopšanas karte no {{cleaningDate}}" + }, + "consumables": { + "mainBrush": "Galvenā Birste", + "sideBrush": "Sanu Birste", + "filter": "Filtrs", + "sensorCleaning": "Sensoru tīrīšana", + "allStatistics": "Visu laiku statistika", + "totalCleanedArea": "Kopējā uzkoptā platība:", + "totalHours": "Kopējais uzkopšanas laiks:", + "totalCount": "Kopējais uzkopšanas daudzums:", + "hoursLeft": "{{hours}} stunda atlikusi", + "hoursLeft_plural": "{{hours}} stundas atlikušas", + "confirm": "Vai tiešām vēlaties atiestatīt palīgmateriālus?" + }, + "info": { + "system": "Sistēma", + "firmwareVersion": "MiIO versija:", + "firmwareBuild": "Programmaparatūras versija:", + "firmwareUpdate": "Programmaparatūras atjauninājums:", + "firmwareUpdateLink": "[nosūtīt pieprasījumu]", + "currentToken": "Esošais Token", + "token": "Token:", + "appLocale": "Lietotnes lokalizācija", + "appLocaleName": "Nosaukums:", + "appLocaleBom": "Bom:", + "appLocaleLocation": "Reģions:", + "appLocaleLanguage": "Valoda:", + "appLocaleTimezone": "Laika josla:", + "appLocaleLogserver": "Reģistrācijas serveris:", + "valetudo": "Valetudo RE", + "currentValetudoVersion": "Pašreizējā versija:", + "newValetudoVersion": "Jaunākā versija:", + "newVersionURL": "Jaunās versijas saite", + "checkVersion": "Pārbaudīt", + "firmwareUpdateWarning": "Tas mēģinās atjaunināt ierīces programmaparatūru, izmantojot manuāli ievadītu saiti uz pkg failu un tā MD5 hash vērtību. Ņemiet vērā, ka saitei vajadzētu būt publiskai IP adresei bez redirektiem.", + "firmwareUpdateEnterURL": "Lūdzu ievadiet saiti uz programmaparatūras pkg failu:", + "firmwareUpdateEnterMD5": "Lūdzu, ievadiet tikko norādītā faila MD5 hash:", + "firmwareUpdateSend": "Sūtīt!", + "firmwareUpdateSentOK": "Atjaunināšanas pieprasījums tika nosūtīts! Gaidiet LED indikāciju par atjaunināšanas procesu." + }, + "persistentData": { + "pageTitle": "Kartes saglabāšanas uzstādījumi", + "explanation": "Kartes saglabāšanas uzstādījumi, jeb ir Roborock S5x iezīme, kas ļauj saglabāt aizliegtas zonas un virtuālās sienas. Tas arī ļauj robotam doties atpakaļ uz doku, lai kur arī tas atrastos, un novērš kartes rotāciju.", + "notSupported": "Atvainojiet, tikai Roborock S5x atbalsta pastāvīgās kartes funkcijas.", + "genericConfirm": "Vai tiešām vēlaties turpināt?", + "genericOverwriteWarning": "Iepriekš saglabātie dati tiks pārrakstīti.", + "deleteData": "Dzēst saglabātos datus", + "deleteDataButton": "Atiestatīt karti", + "deleteDataNowButton": "Dzēst!", + "deleteDataTitle": "Tas izdzēš pašreizējo karti, visas aizliegtās zonas un virtuālās sienas!", + "deleteDataConfirm": "Tas izdzēš pašreiz saglabāto karti, visas aizliegtās zonas un virtuālās sienas.", + "exportDesc": "Eksportēt aizliegtos marķierus uz Valetudo", + "exportButton": "Eksportēt", + "exportNowButton": "Eksportēt datus", + "exportTitle": "Tas eksportē aizliegto zonu un virtuālo sienu datus no programmaparatūras un saglabā tos Valetudo", + "exportConfirm": "Tas eksportē aizliegto zonu un virtuālo sienu datus no programmaparatūras un saglabā tos Valetudo konfigurācijā.", + "importDesc": "Importējiet aizliegtus marķierus no Valetudo", + "importButton": "Importēt", + "importNowButton": "Importēt datus", + "importTitle": "Tas importē aizliegtās zonas un virtuālo sienu datus no Valetudo un iestata to programmaparatūrā", + "importConfirm": "Tas importē aizliegtās zonas un virtuālās sienas no Valetudo konfigurācijas un iestata tās ierīces programmaparatūrā.", + "importConfirmDetails": "Gatavs importēšanai {{virtualWallsCount}} un {{forbiddenZonesCount}}.", + "exportConfirmDetails": "Gatavs eksportēšanai {{virtualWallsCount}} un {{forbiddenZonesCount}}.", + "virtualWallsCount": "{{count}} virtuālā siena", + "virtualWallsCount_plural": "{{count}} virtuālās sienas", + "forbiddenZonesCount": "{{count}} aizliegtā zona", + "forbiddenZonesCount_plural": "{{count}} aizliegtās zonas", + "settingsSaved": "Uzstādījumi saglabāti!", + "resetOK": "Karte atiestatīta!", + "exportedOK": "Konfigurācija eksportēta no programmaparatūras uz Valetudo.", + "importedOK": "Konfigurācija tiek importēta no Valetudo uz programmaparatūru." + }, + "soundAndVoice": { + "volumeSettings": "Skaļuma iestatīšana", + "volume": "Skaļums:", + "saveVolume": "Saglabāt", + "testVolume": "Pārbaudīt", + "installVoicePack": "Instalējiet balss pakotni", + "voicePackFile": "Balss pakotnes fails:", + "uploadVoicePack": "Augšuplādēt balss pakotni", + "volumeSavedOK": "Skaļums veiksmīgi saglabāts.", + "voicePackMissing": "Pirms augšupielādes, lūdzu, atlasiet balss pakotni.", + "voicePackUploading": "Notiek balss paketes augšupielāde ...", + "voicePackInstalling": "Notiek balss paketes instalēšana ...", + "voicePackInstallFailed": "Neizdevās instalēt balss pakotni.", + "voicePackInstallOK": "Balss pakotne tika veiksmīgi instalēta." + }, + "timers": { + "month": "Mēnesis", + "day": "Diena", + "hour": "Stunda", + "minute": "Minūte", + "startAt": "Sākt:", + "endAt": "Beigt:", + "hours": "stundas", + "minutes": "minūtes", + "name": "Nosaukums:", + "namePlaceholder": "taimera nosaukums", + "iterations": "Atkārtojumi:", + "fanPower": "Sūkšanas jauda:", + "zones": "Zonas:", + "addZones": "Pievienot...", + "segments": "Telpas:", + "addSegments": "Pievienot...", + "timerDesc": "Izēlaties taimera uzstādījumus.", + "timerZoneDesc": "Izvēlieties taimera nosaukumu un zonas koordinātas.", + "timerTimeDesc": "Izvēlieties laiku un datumu, kurā jāieslēdz taimeris.", + "timerEmptyTimeNote": "Tukšums nozīmē jebkurš", + "timerDaysDesc": "Atlasiet dienas, kurās taimeris jāieslēdz.", + "timerEmptyDayNote": "Tukšums nozīmē jebkuru dienu.", + "runOnce": "Vienreiz palaist un noņemt", + "currentTimezone": "Jūsu pašreizējā laika josla ir iestatīta uz:", + "zonedCleaningHeader": "Uzkopšanas grafiks (beta)", + "noZonedCleaningSchedule": "Pagaidām nav iestatīts zonas uzkopšanas grafiks", + "cleaningHeader": "Uzkopšanas grafiks", + "noCleaningSchedule": "Uzkopšanas grafiks nav iestatīts.", + "DNDHeader": "\"Nakts režīma\" - taimeris", + "chooseZone": "Izvēlieties zonu:", + "zoneCount": "{{count}} zona", + "zoneCount_plural": "{{count}} zonas", + "chooseSegment": "Izvēlieties istabu:", + "duplicatedSegment": "Vienu un to pašu istabu nevar pievienot vairākas reizes!", + "confirmDeleteTimer": "Vai tiešām vēlaties izdzēst šo taimeri?", + "confirmTimezone": "Vai tiešām vēlaties iestatīt laika joslu uz \"{{newTimezone}}\"?", + "noDNDEnabled": "Nakts režīma taimeris nav ieslēgts.", + "DNDSchedule": "Nakts režīms sākas {{startHour}}:{{startMinute}} un beidzas {{endHour}}:{{endMinute}}", + "noDNDSchedule": "Nakts režīma taimeris nav iestatīts.", + "confirmDisableDND": "Vai tiešām vēlaties izslēgt nakts režīmu?", + "tooManyZones": "Vienā tīrīšanas sesijā nevar izmantot vairāk kā 5 zonas.", + "notEnoughDataDND": "Nakts taimeri nav iespējams saglabāt, jo ne visi nepieciešamie lauki ir aizpildīti!", + "missingHoursMinutes": "Jānorāda gan stundas, gan minūtes.", + "missingName": "Jums jānorāda nosaukums.", + "missingZones": "Jānorāda vismaz viena tukšā zona.", + "missingTimer": "Taimeris nav atrasts.", + "missingSegment": "Telpa netika atrasta esošajā kartē!" + }, + "webInterface": { + "general": "Vispārīgie iestatījumi", + "localization": "Tīmekļa saskarnes valoda", + "localizationExt": "pārslēgšanās starp pieejamajiem tulkojumiem", + "style": "Tēma", + "styleExt": "maina tīmekļa interfeisa krāsu motīvu", + "homeTab": "Galvenā cilne", + "zonedImmediate": "Nekavējoties veic zonas tīrīšanu", + "zonedImmediateExt": "tā vietā, lai dotos uz kartes cilni", + "gotoImmediate": "Nekavējoties doties uz punktu", + "gotoImmediateExt": "tā vietā, lai dotos uz kartes cilni", + "multimapButtons": "Daudzkaršu režīms", + "multimapButtonsExt": "ļauj saglabāt un atjaunot kartes (eksperimentāls)", + "mapTab": "Kartes cilne", + "hideMapStatus": "Nerādīt stāvokli kartē", + "hideMapStatusExt": "slēpj bloku ar statusa tekstu", + "hideSegmentMarkers": "Nerādīt telpas marķierus", + "hideSegmentMarkersExt": "slēpj telpas izvēles marķierus kartē", + "disableMapReload": "Atslēdz kartes atkārtotas ielādes pogu", + "disableMapReloadExt": "slēpj pārlādēšanas pogu kartē", + "disableDynamicButtons": "Atslēdz dinamiskās pogas", + "disableDynamicButtonsExt": "rāda tikai pamata pogas kartē", + "applyChangesConfirm": "Vai vēlaties izmantot izmaiņas tūlīt?", + "enableMultimapConfirm": "Šis režīms neietilpst sākotnējās programmaparatūras funkcionalitātē, bet drīzāk ir tam paredzēto haku kopums. Lai gan tas darbojas pietiekami labi, ja kaut kas pēkšņi noiet greizi - tā izmantošana var izraisīt programmatūras atiestatīšanu uz rūpnīcas iestatījumiem. Vai jūs joprojām vēlaties turpināt?" + }, + "wifi": { + "currentConnection": "Pašreizējais savienojums", + "status": "Statuss", + "ssid": "SSID", + "signal": "Signāls", + "txBitrate": "TX Bitrate", + "settings": "Wifi iestatījumi", + "password": "Parole", + "save": "Saglabāt jaunos Wifi iestatījumus", + "connected": "Savienots", + "notConnected": "Nav savienots", + "confirm": "Vai tiešām vēlaties lietot jaunos Wifi iestatījumus?", + "hint": "Piezīme", + "hintText": "Jūs vienmēr varat iestatīt ierīci piekļuves punkta režīmā; skatiet lietotāja rokasgrāmatā sniegtos norādījumus par Wifi iestatījumu atiestatīšanu.", + "appliedOK": "Jaunie wifi akreditācijas dati tika veiksmīgi piemēroti. Pēc pogas nospiešanas lapa tiks atsvaidzināta. Tomēr, visticamāk, būs jāmaina URL saite, jo robots mēģinās izveidot savienojumu ar jauno Wifi." + }, + "telegram": { + "explanation": "Izveidojiet jaunu tērzēšanu Telegramā un atrodiet kontu \"Botfather\", izveidojiet jaunu robotu ar komandu /newbot, pēc tam nokopējiet saņemto token un ielīmējiet to šajā lapā. Šeit iestatītā parole tiks izmantota, lai autentificētu botu.", + "general": "Telegram uzstādījumi", + "token": "HTTP API Token:", + "tokenPlaceholder": "HTTP API Token no Botfather", + "authPassword": "Bota parole:", + "authPasswordPlaceholder": "klienta autorizācijai", + "host": "API adrese (nav obligāti):", + "proxy": "SOCKS5 Proxy (nav obligāti):", + "proxyPlaceholder": "user:password@host:port", + "getRandomProxy": "Iegūt", + "selectCountry": "Izvēlieties valsti:", + "sendConsumables": "Nosūtīt ziņojumu, ja ir beidzies palīgmateriāla derīgums:", + "sendConsumablesEvery": "Nosūtīt ziņojumu, ja ir beidzies kāda no palīgmateriāliem derīgums:", + "notifyStatusTypes": "Par kādu statusa maiņu jāpaziņo:", + "notifyAll": "Visas", + "notifyCleaning": "Uzkopšana + Kļūdas", + "notifyErrors": "Tikai kļūdas", + "status": "Savienojuma statuss", + "clientsList": "Telegrama klienti", + "noClients": "Pagaidām nav autorizētu klientu.", + "confirmDeleteClient": "Vai tiešām vēlaties izdzēst šo klientu?", + "connectedAs": "Telegrambots pievienots kā {{botname}}", + "connectionFailed": "Telegrambota savienojums neizdevās", + "notConnected": "Telegrambots nav savienots" + } + }, + "robot": { + "states": { + "n0": "Tiek veikts savienojums...", + "n1": "Startējās", + "n2": "Gaidīšanas režīmā bez uzlādes", + "n3": "Dīkstāvē", + "n4": "Tālvadības pults ir aktīva", + "n5": "Uzkopj", + "n6": "Atgriezties uz staciju", + "n7": "Manuālā vadība", + "n8": "Uzlāde", + "n9": "Uzlādes problēma", + "n10": "Pauze", + "n11": "Lokālā tīrīšana", + "n12": "Kļūda", + "n13": "Izslēdzas", + "n14": "Notiek atjaunināšana", + "n15": "Brauc uz staciju", + "n16": "Dodās uz mērķi", + "n17": "Zonas tīrīšana", + "n18": "Telpas tīrīšana" + }, + "errors": { + "n0": "Nav kļūdu", + "n1": "Attāluma lāzera sensora kļūda", + "n2": "Priekšējais buferis ir iestrēdzis", + "n3": "Klinšu sensoru trauksme, nogādājiet robotu uz citu vietu", + "n4": "Netīri klinšu sensori", + "n5": "Iestrēgusi galvenā birste", + "n6": "Iestrēgusi sānu birste", + "n7": "Iestrēguši galvenie rati", + "n8": "Ierīce ir iestrēgusi, pārvietojiet robotu uz citu vietu", + "n9": "Trūkst putekļu savācēja vai ir slikts filtrs", + "n10": "Netīrs putekļu filtrs", + "n11": "Iestrēdzis magnētiskajā barjerā", + "n12": "Zems akumulatora līmenis", + "n13": "Uzlādes kļūme", + "n14": "Akumulatora kļūme", + "n15": "Netīrs sienas sensors", + "n16": "Virsma nav līdzena, pārvadājiet robotu uz citu vietu", + "n17": "Sānu birstes kļūme, mēģiniet pārstartēt", + "n18": "Sūkšanas turbīnes kļūda, mēģiniet pārstartēt", + "n19": "Barošanas uzlādes stacija bez barošanas", + "n21": "Piesprausts attāluma lāzera sensora vāks", + "n22": "Netīrs priekšējā bufera sensors", + "n23": "Netīrs signāla izstarošanas laukums uz dokstacijas", + "n24": "Atklāta aizliegtā zona, evakuējiet robotu uz atļauto vietu" + } + } +} diff --git a/client/settings-web-interface.html b/client/settings-web-interface.html index e52a509c..4a8ded12 100644 --- a/client/settings-web-interface.html +++ b/client/settings-web-interface.html @@ -23,6 +23,7 @@ + From 451d45d452afcd05a16d4a1a5568b6ae57dadc0e Mon Sep 17 00:00:00 2001 From: Luke Channings Date: Mon, 4 May 2020 21:09:03 +0100 Subject: [PATCH 011/172] Upgrade mqtt to 4.0.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b275d078..2803c8c2 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "express": "^4.17.1", "express-basic-auth": "^1.2.0", "express-dynamic-middleware": "^1.0.0", - "mqtt": "^3.0.0", + "mqtt": "4.0.0", "multer": "^1.4.2", "pngjs": "^5.0.0", "prettycron": "^0.10.0", diff --git a/yarn.lock b/yarn.lock index 3979df0a..e83d9605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ mqtt-packet@^6.0.0: process-nextick-args "^2.0.0" safe-buffer "^5.1.2" -mqtt@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-3.0.0.tgz#7961e5f61efba3eec37d5aa9c4cbcdeb6f841380" - integrity sha512-0nKV6MAc1ibKZwaZQUTb3iIdT4NVpj541BsYrqrGBcQdQ7Jd0MnZD1/6/nj1UFdGTboK9ZEUXvkCu2nPCugHFA== +mqtt@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-4.0.0.tgz#66612c619c942f88d8c239eeced2e08c65e8fb68" + integrity sha512-sRfKhSNK4yetSO9EyeXCNByKJiNW9XMtv214sEaXA2cUgeB+DWq9aKOxAdbW1rRbxjiqXPZYyjwt214TTgh0cA== dependencies: base64-js "^1.3.0" commist "^1.0.0" From f0d82d7289f6c870b2884cb3a2a5c98f9f3cf386 Mon Sep 17 00:00:00 2001 From: aleksif <62287096+aleksif@users.noreply.github.com> Date: Fri, 22 May 2020 07:36:02 +0000 Subject: [PATCH 012/172] Update fi.json --- client/locales/fi.json | 173 +++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/client/locales/fi.json b/client/locales/fi.json index 585cd713..498caa3c 100644 --- a/client/locales/fi.json +++ b/client/locales/fi.json @@ -6,7 +6,7 @@ "overwrite": "Ylikirjoita", "continue": "Jatka", "dismiss": "Hylkää", - "prompt": "Prompt", + "prompt": "Kehote", "warning": "Varoitus", "attention": "Huomio!", "confirm": "Vahvista", @@ -14,16 +14,17 @@ "save": "Tallenna", "cancelled": "Peruutettu", "enabled": "Käytössä", - "commandOK": "Komento lähetetty onnistuneesti!", + "commandOK": "Komennon lähetys onnistui!", "commandFailed": "Tapahtui virhe:", "connectionError": "Yhteysvirhe", "nameAlreadyUsed": "Nimi \"{{name}}\" on jo käytössä", "m2": "m²", "hours": "tunti", - "hours_plural": "tunnit", - "months": ["Tam","Hel","Maa","Huh","Tou","Kes","Hei","Elo","Syy","Lok","Mar","Jou"], - "days": ["Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai","Sunnuntai"], - "unknownState": "palautti tuntemattoman tilan: {{state}}" + "hours_plural": "tuntia", + "months": [".1.",".2.",".3.",".4.",".5.",".6.",".7.",".8.",".9.",".10.",".11.",".12."], + "days": ["maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai","sunnuntai"], + "unknownState": "palautti tuntemattoman tilan: {{state}}", + "timedOut": "toiminto aikakatkaistiin" }, "navi": { "home": "Koti", @@ -47,7 +48,7 @@ "stop": "Lopeta", "home": "Koti", "spot": "Spotti", - "find": "Etsi", + "find": "Löydä", "goto": "Mene", "zones": "Alueet", "storeMap": "Tallenna kartta", @@ -59,23 +60,23 @@ "selectFanspeed": "Valitse imurin teho:", "selectGotoTarget": "Valitse määränpää:", "selectZones": "Valitse siivottavat alueet:", - "selectMapToLoad": "Valitse mistä kartta ladataan:", + "selectMapToLoad": "Valitse, mistä kartta ladataan:", "emptyZoneChosen": "Tyhjä alue valittu. Ole hyvä ja luo ensin alue.", "tooManyZones": "Liikaa alialueita valittuna. Valitsit {{count}}, kun maksimimäärä on 5.", "chooseMapName": "Tallennettavan kartan nimi:", - "invalidMapName": "Nimi voi sisältää ainoastaan latinalaisia kirjaimia tai numeroita, välilyöntejä tai tavuviivoja.", + "invalidMapName": "Nimi voi sisältää ainoastaan latinalaisia kirjaimia ja numeroita, välilyöntejä sekä tavuviivoja.", "slotAlreadyTaken": "Kohta #{{slot}} on jo varattu", "nameAlreadyTaken": "Nimi \"{{name}}\" on jo käytössä", "noMapsStored": "Ei tallennettuja karttoja!", "slotNo": "Kohta #", "confirmMapDelete": "Haluatko varmasti poistaa kartan \"{{name}}\"?", "wait": "Odota", - "waitMapTicks": "Kartan korvausrutiini käynnissä. Ole hyvä ja odota {{seconds}}...", + "waitMapTicks": "Kartan korvausrutiini käynnissä. Ole hyvä ja odota {{seconds}} sekuntia...", "waitMapFinished": "Valmis", "waitMapEncourage": "Pyydetyt rutiinit ovat nyt valmiina.", - "mapStoredOK": "Kartta tallennettu onnistuneesti!", - "mapDeletedOK": "Tallennettu kartta on poistettu onnistuneesti!", - "mapRestoredOK": "Kartta palautettu onnistuneesti!" + "mapStoredOK": "Kartan tallennus onnistui!", + "mapDeletedOK": "Tallennetun kartan poistaminen onnistui!", + "mapRestoredOK": "Kartan palautus onnistui!" }, "fanspeedPresets": { "whisper": "Kuiskaus", @@ -94,61 +95,61 @@ "errorText": "{{error}}", "confirmFullCleaning": "Aluesiivouksen käynnistäminen ei onnistu, koska aluetta ei ole määritetty. Haluatko suorittaa täyden imuroinnin sen sijaan?", "cannotResume": "Jatkaminen ei ole mahdollista!", - "noGotoTarget": "Sinun on valittava paikka mennä.", - "tooManyZones": "Et voi lisätä enempää kuin 5 aluetta karttaan." + "noGotoTarget": "Sinun on valittava spotti, johon mennä.", + "tooManyZones": "Voit lisätä korkeintaan 5 aluetta karttaan." }, "zones": { "headerZones": "Määritellyt alueet", "headerGotoLocations": "Määritellyt kohteet", - "headerForbiddenMarkers": "Kiellettu merkitsijä", + "headerForbiddenMarkers": "Kielletty-merkit", "headerSegments": "Huoneiden kokoonpano", "noZonesConfigured": "Yhtään aluetta ei ole vielä määritelty.", - "noSpotsConfigured": "Yhtään kohdetta ei ole vielä määritelty.", + "noSpotsConfigured": "Yhtään spottia ei ole vielä määritelty.", "editForbiddenZones": "Määrittele kielletyt alueet", "editSegments": "Muokkaa huoneita", - "noPersistentData": "Ei pystytä muokkaamaan kiellettyjä merkkaajia, koska tallennettu data on pois päältä tai ei saatavilla.", - "noPersistentDataSegments": "Huoneita ei voi muokata, koska tallennettu data on pois päältä.", + "noPersistentData": "Kielletty-merkkejä ei voi muokata, koska pysyvä data ei ole käytössä tai saatavilla.", + "noPersistentDataSegments": "Huoneita ei voi muokata, koska pysyvä data ei ole käytössä.", "noSegmentsSupport": "Laitteesi laiteohjelmisto ei tue kartan jakamista huoneisiin.", "addButton": "Lisää", - "renameButton": "Uudelleennimeä", + "renameButton": "Nimeä uudelleen", "deleteButton": "Poista", - "newZoneName": "Anna alueen nimi...", - "newSpotName": "Anna spotin nimi...", + "newZoneName": "Syötä alueen nimi...", + "newSpotName": "Syötä spotin nimi...", "enterZoneName": "Lisää nimi alueelle", "enterSpotName": "Lisää nimi kohteelle", - "renameZone": "Anna uusi nimi alueelle \"{{zone}}\":", - "renameSpot": "Anna uusi nimi spotille \"{{spot}}\":", + "renameZone": "Syötä uusi nimi alueelle \"{{zone}}\":", + "renameSpot": "Syötä uusi nimi spotille \"{{spot}}\":", "confirmDeleteSpot": "Haluatko varmasti poistaa spotin \"{{spot}}\"?", "confirmDeleteZone": "Haluatko varmasti poistaa alueen \"{{zone}}\"?", "zonesPageBack": "Alueet", - "zoneEditTitle": "Muokataan aluetta: {{zone}}", - "tooManySubzones": "Yksi alue ei voi sisältää enempää kuin 5 alialuetta.", - "tooManyMarkers": "Et voi lisätä enempää kiellettyjä merkkaajia kartalle!", - "zonesSavedOK": "Alue tallennettu onnistuneesti!", + "zoneEditTitle": "Muokataan aluetta {{zone}}", + "tooManySubzones": "Yksi alue voi sisältää korkeintaan 5 alialuetta.", + "tooManyMarkers": "Et voi lisätä enempää kiellettyjä-merkkejä kartalle!", + "zonesSavedOK": "Alueen tallennus onnistui!", "spotsPageBack": "Spotit", - "spotEditTitle": "Muokataan spottia: {{spot}}", - "spotsSavedOK": "Spotti tallennettu onnistuneesti!", - "forbiddenMarkersPageBack": "Kielletyt merkkaajat", - "forbiddenMarkersTitle": "Muokataan merkkaajia", - "forbiddenMarkersSavedOK": "Kielletyt merkkaajat tallennettu onnistuneesti!", + "spotEditTitle": "Muokataan spottia {{spot}}", + "spotsSavedOK": "Spotin tallennus onnistui!", + "forbiddenMarkersPageBack": "Kielletty-merkit", + "forbiddenMarkersTitle": "Muokataan merkkejä", + "forbiddenMarkersSavedOK": "Kielletty-merkkien tallennus onnistui!", "missingZone": "Aluetta ei ole olemassa.", "missingSpot": "Spottia ei ole olemassa.", "segmentsPageBack": "Segmentit", "segmentsTitle": "Huoneiden muokkaaminen", - "enterSegmentName": "Anna valitulle huoneelle nimi:", - "segmentRenamedOK": "Huoneen nimeäminen onnistuneesti!", + "enterSegmentName": "Syötä uusi nimi valitulle huoneelle:", + "segmentRenamedOK": "Huoneen nimeäminen onnistui!", "segmentRenameFailed": "Huoneen nimeämisessä tapahtui virhe.", "segmentsCantBeMerged": "Voit yhdistää vain vierekkäiset huoneet.", "confirmSegmentsMerge": "Haluatko varmasti kokeilla huoneiden \"{{segment1}}\" ja \"{{segment2}}\" yhdistämistä?", - "segmentsMergedOK": "Huoneet yhdistettiin onnistuneesti!", + "segmentsMergedOK": "Huoneiden yhdistäminen onnistui!", "segmentSplitNoLine": "Sinun on asetettava leikkuulinja huoneeseen jakaaksesi se.", - "segmentSplitTooMany": "Sinulla ei voi olla enemmän huoneita, yhdistä jotain.", - "confirmSegmentSplit": "Haluatko varmasti kokeilla huoneen \"{{segment}}\" jakamista? Huomaa: Saatat joutua asettamaan leikkuulinjan useita kertoja, kunnes löydät oikean paikan.", - "segmentSplitOK": "Huone jaettu onnistuneesti!", - "segmentSplitSingleLine": "Halkaisulinjaa voi olla vain yksi!", + "segmentSplitTooMany": "Sinulla ei voi olla enempää huoneita, kokeile yhdistä huoneita.", + "confirmSegmentSplit": "Haluatko varmasti kokeilla huoneen \"{{segment}}\" jakamista? Huomaa, että saatat joutua asettamaan leikkuulinjan useita kertoja löytääksesi oikean kohdan.", + "segmentSplitOK": "Huoneen jakaminen onnistui!", + "segmentSplitSingleLine": "Halkaisulinjoja voi olla vain yksi!", "confirmSegmentsAutosplit": "Kartta jaetaan automaattisesti huoneisiin, kun olet suorittanut täydellisen siivouksen, mutta voit yrittää jakaa sen heti. Jatkaa?", "autosplitSegmentsNow": "Jaa nyt", - "segmentsSplitOK": "Kartta on onnistuneesti jaettu huoneisiin!" + "segmentsSplitOK": "Kartan jakaminen huoneisiin onnistui!" }, "control": { "startButton": "Aloita manuaaliohjaus", @@ -170,18 +171,18 @@ "start": "Käynnistä", "pause": "Tauko", "resume": "Jatkaa", - "stop": "Pyäsytä", + "stop": "Pysäytä", "zones": "Alueet", "spot": "Spotti", "rooms": "Huoneet", "home": "Koti", - "findMe": "Etsi", + "findMe": "Löydä", "goto": "Mene", "back": "-- takaisin --", "runZoned": "-- Aloita alueiden siivous --", "runSegments": "-- Aloita huoneiden siivous --" }, - "missingPassword": "Salasanaa ei annettu.", + "missingPassword": "Salasanaa ei syötetty.", "wrongPassword": "Salasana on väärin.", "clientAuthorized": "Asiakkaan todennus. kirjoita /start saadaksesi lisätietoa.", "clientAlreadyAuthorized": "Asiakas on jo todennettu, kirjoita /start saadaksesi lisätietoa.", @@ -190,15 +191,15 @@ "cbqFailed": "Virhe komennon suorittamisessa!", "cbqWrongState": "Komento ei ole käytettävissä laitteen nykyisessä tilassa!", "selectCommand": "Odotetaan komentoa.", - "selectGotoTarget": "Valitse kohde mennäksesi.", + "selectGotoTarget": "Valitse spotti, johon mennä.", "selectZones": "Valitse puhdistettavat alueet.", "selectSegments": "Valitse siistettävät huoneet.", - "selectPower": "Valitse tuulettimen tehotila.", + "selectPower": "Valitse imurin teho.", "selectMap": "Valitse palautettava kartta.", "performingCleaning": "Siirrytään täyteen siivoukseen.", "performingZoned": "Siirrytään aluesiivoukseen:\n{{zoneNames}}", "performingSegments": "Siirrytään huoneiden siivoukseen:\n{{segmentNames}}", - "performingGoto": "Siirrytään \"{{spotName}}\" spottin.", + "performingGoto": "Siirrytään spottiin \"{{spotName}}\".", "noZonesConfigured": "Alueita ei ole vielä määritelty.", "noSegmentsConfigured": "Kartalla ei ole huoneita saatavilla.", "noSpotsConfigured": "Yhtään spottia ei ole vielä määritelty.", @@ -207,14 +208,14 @@ "noSegmentsSpecified": "Sinun on valittava vähintään yksi huone.", "noGotoTargetSpecified": "Sinun on valittava paikka, johon mennä.", "noMapSpecified": "Sinun on valittava kartan nimi.", - "selectedZones": "Tällä hetkellä valittu: {{zonesList}} ({{subzonesCount}}/5 osavyöhykkeiden)", - "selectZoneIterations": "Napsauta useita kertoja virittääksesi iteraatioiden lukumäärän.", + "selectedZones": "Tällä hetkellä valittu: {{zonesList}} ({{subzonesCount}}/5 alialueesta)", + "selectZoneIterations": "Napsauta useita kertoja säätääksesi iteraatioiden lukumäärän.", "tooManyZones": "Liian monta aluetta määritetty!\nSuurin sallitty määrä - 5, Ilmoitettu määrä - {{zonesCount}}.", "noSegmentsSupported": "Laitteen laiteohjelmisto ei tue huoneen siivousta.", "selectedSegments": "Tällä hetkellä valittu: {{segmentsList}}", "noMapAvailable": "Kartta ei ole saatavilla tällä hetkellä.", - "powerChanged": "Tuulettimen teho vaihtuu arvoon: {{fanPower}}.", - "mapLoadOK": "Uudelleenladataan karttaa.", + "powerChanged": "Imurin teho vaihdettu arvoon: {{fanPower}}.", + "mapLoadOK": "Ladataan karttaa uudelleen.", "mapLoadWait": "Kartan latautumisessa kestää noin 30 sekuntia.", "notificationsEnabled": "Tilailmoitukset käytössä.", "notificationsDisabled": "Tila-ilmoitukset poistettu käytöstä.", @@ -236,10 +237,10 @@ "timersDesc": "Hallitset ajastimia ja aikavyöhykkeitä", "carpetModeTitle": "Mattotila", "carpetModeDesc": "Määrittele mattotila", - "persistentDataTitle": "Tallennettu data", - "persistentDataDesc": "Määrittele labra tila virtuaalisten seinien jne käyttämiseksi.", + "persistentDataTitle": "Pysyvä data", + "persistentDataDesc": "Määrittele labra-tila virtuaalisten seinien jne. käyttämiseksi.", "consumablesTitle": "Vaihdettavat osat", - "consumablesDesc": "Tarkastele/nollaa vaihdettavien osien ajastimet", + "consumablesDesc": "Tarkastele/nollaa vaihdettavien osien ajastimia", "cleaningHistoryTitle": "Siivoushistoria", "cleaningHistoryDesc": "Tarkastele siivoushistoriaa", "wifiTitle": "Wifi", @@ -278,8 +279,8 @@ "confirm": "Haluatko varmasti tallentaa mattotilan asetukset?" }, "cleaningHistory": { - "header": "Viimeiset siivouskerrats", - "loadMore": "Näytä enemmän...", + "header": "Viimeiset siivouskerrat", + "loadMore": "Näytä lisää...", "showMap": "Näytä siivouskartta", "historyRecord": "#{{id}} käynnistetty {{startDate}}", "duration": "Kesto", @@ -322,8 +323,8 @@ "newVersionURL": "Uuden version URL", "checkVersion": "Tarkista", "firmwareUpdateWarning": "Tämä yrittää päivittää imurin laiteohjelmiston käyttämällä käsinsyötettyä pkg-tiedoston ja sen MD5-hashin URLia. Huomaa, että URLin tulee kohdistua julkiseen IP-osoitteeseen eikä siinä saa olla uudelleenohjauksia.", - "firmwareUpdateEnterURL": "Anna pkg-tiedoston URL:", - "firmwareUpdateEnterMD5": "Anna pkg-tiedoston MD5-hash:", + "firmwareUpdateEnterURL": "Syötä pkg-tiedoston URL:", + "firmwareUpdateEnterMD5": "Syötä pkg-tiedoston MD5-hash:", "firmwareUpdateSend": "Lähetä!", "firmwareUpdateSentOK": "Päivityspyyntö on lähetetty! Odota, että LED-valo ilmoittaa päivityksen alkamisesta." }, @@ -333,7 +334,7 @@ "notSupported": "Pahoittelut. Vain Roborock S5x tukee tätä ominaisuutta.", "genericConfirm": "Haluatko varmasti jatkaa?", "genericOverwriteWarning": "Aiemmin tallennettu data tullaan ylikirjoittamaan.", - "deleteData": "Poista tallennettu data", + "deleteData": "Poista pysyvä data", "deleteDataButton": "Nollaa kartta", "deleteDataNowButton": "Poista nyt!", "deleteDataTitle": "Tämä poistaa nykyisen kartan sekä kaikki kielletyt alueet ja virtuaaliset seinät!", @@ -352,12 +353,12 @@ "exportConfirmDetails": "Valmiina hakemaan {{virtualWallsCount}} sekä {{forbiddenZonesCount}}.", "virtualWallsCount": "{{count}} virtuaalinen seinä", "virtualWallsCount_plural": "{{count}} virtuaalista seinää", - "forbiddenZonesCount": "{{count}} kielletty alue", - "forbiddenZonesCount_plural": "{{count}} kiellettyä aluetta", + "forbiddenZonesCount": "{{count}} kielletty-merkki", + "forbiddenZonesCount_plural": "{{count}} kielletty-merkkiä", "settingsSaved": "Asetukset tallennettu!", "resetOK": "Kartta nollattu!", - "exportedOK": "Tallennettu data viety konfiguraatioon.", - "importedOK": "Tallennettu data tuotu konfiguraatiosta." + "exportedOK": "Pysyvä data viety konfiguraatioon.", + "importedOK": "Pysyvä data tuotu konfiguraatiosta." }, "soundAndVoice": { "volumeSettings": "Äänenvoimakkuuden asetukset", @@ -372,7 +373,7 @@ "voicePackUploading": "Ladataan äänipakettia...", "voicePackInstalling": "Asennetaan äänipakettia...", "voicePackInstallFailed": "Äänipaketin asennus epäonnistui.", - "voicePackInstallOK": "Äänipaketti asennettu onnistuneesti." + "voicePackInstallOK": "Äänipaketin asennus onnistui." }, "timers": { "month": "Kuukausi", @@ -386,7 +387,7 @@ "name": "Nimi:", "namePlaceholder": "ajastimen nimi", "iterations": "Toistojen:", - "fanPower": "Imuteho:", + "fanPower": "Imurin teho:", "zones": "Alueet:", "addZones": "Lisää...", "segments": "Huoneet:", @@ -406,7 +407,7 @@ "DNDHeader": "\"Älä häiritse\" -ajastin", "chooseZone": "Valitse alue:", "zoneCount": "{{count}} alue", - "zoneCount_plural": "{{count}} alueet", + "zoneCount_plural": "{{count}} aluetta", "chooseSegment": "Valitse huone:", "duplicatedSegment": "Et voi lisätä samaa tilaa useita kertoja!", "confirmDeleteTimer": "Haluatko varmasti poistaa tämän ajastimen?", @@ -415,11 +416,11 @@ "DNDSchedule": "Älä häiritse alkaa klo {{startHour}}:{{startMinute}} ja loppuu klo {{endHour}}:{{endMinute}}", "noDNDSchedule": "Älä häiritse -aikaa ei ole määritelty.", "confirmDisableDND": "Haluatko varmasti poistaa älä häiritse -ajoituksen?", - "tooManyZones": "Et voi käyttää yli 5 aluetta yhdessä aluesiivouksessa.", + "tooManyZones": "Voit käyttää korkeintaan 5 aluetta yhdessä aluesiivouksessa.", "notEnoughDataDND": "Älä häiritse ajastimen tallennus ei onnistunut, koska kaikkia tarvittavia tietoja ei ole annettu!", "missingHoursMinutes": "Sekä tunnit että minuutit tulee määritellä.", "missingName": "Nimi on määriteltävä.", - "missingZones": "Yksi tai enemmän ei-tyhjää aluetta tulee määritellä.", + "missingZones": "Yksi tai useampi ei-tyhjä alue valittava.", "missingTimer": "Kyseistä ajastinta ei ole olemassa.", "missingSegment": "Huoneita ei löydy nykyisestä kartasta!" }, @@ -429,7 +430,7 @@ "localizationExt": "vaihtaa käyttöliittymän käännöksen.", "homeTab": "Koti-välilehti", "zonedImmediate": "Imuroi alueet välittömästi", - "zonedImmediateExt": "kartta välilehteen siirtymisen sijaan", + "zonedImmediateExt": "kartta-välilehteen siirtymisen sijaan", "style": "Teema", "styleExt": "muuttaa web-käyttöliittymän väriteeman", "gotoImmediate": "Mene spottiin välittömästi", @@ -438,15 +439,15 @@ "multimapButtonsExt": "mahdollistaa karttojen tallentamisen ja palauttamisen (kokeellinen)", "mapTab": "Kartta-välilehti", "hideMapStatus": "Älä näytä tilaa kartassa", - "hideMapStatusExt": "Piilottaa tilatekstipalkin", + "hideMapStatusExt": "piilottaa tilatekstipalkin", "hideSegmentMarkers": "Älä näytä huonemerkkejä", - "hideSegmentMarkersExt": "Piilottaa huonevalintamerkit kartalla", + "hideSegmentMarkersExt": "piilottaa huonevalintamerkit kartalla", "disableMapReload": "Poista kartan uudelleenlatauksen painike käytöstä", "disableMapReloadExt": "piilottaa pakotetun uudelleenlatauksen painikkeen kartassa", "disableDynamicButtons": "Poista dynaamiset painikkeet käytöstä", - "disableDynamicButtonsExt": "Näytä ainoastaan kartan peruspainikkeet", + "disableDynamicButtonsExt": "näyttää ainoastaan kartan peruspainikkeet", "applyChangesConfirm": "Haluatko ottaa muutokset käyttöön nyt?", - "enableMultimapConfirm": "Tämä ominaisuus ei ole osa Roborockin toiminnallisuutta, vaan se koostuu useista sen ympärille rakennetuista viritelmistä. Se voi toimia hyvin, mutta se voi myös aiheuttaa tehdasasetusten palautuksen jonkin mennessä pieleen. Haluatko varmasti jatkaa?" + "enableMultimapConfirm": "Tämä ominaisuus ei ole osa Roborockin toiminnallisuutta, vaan se koostuu useista sen ympärille rakennetuista viritelmistä. Ominaisuus voi toimia hyvin, mutta se voi myös aiheuttaa tehdasasetusten palautuksen jonkin mennessä pieleen. Haluatko varmasti jatkaa?" }, "wifi": { "currentConnection": "Nykyinen yhteys", @@ -461,11 +462,11 @@ "notConnected": "Ei yhteyttä", "confirm": "Haluatko varmasti ottaa uudet Wifi-asetukset käyttöön?", "hint": "Vihje", - "hintText": "Voit aina palata takaisin integroituun Wifi-yhteyspisteeseen. Katso käyttöoppaasta, kuinka Wifi-asetukset nollataan.", - "appliedOK": "Wifi-tunnukset tallennettu onnistuneesti. Sivu latautuu uudelleen, kun painat OK. Todennäköisesti joudut muuttamaan URLia, koska imuri yhdistää uuteen verkkoon." + "hintText": "Voit aina palata takaisin integroituun Wifi-hotspotiin. Katso käyttöoppaasta, kuinka Wifi-asetukset nollataan.", + "appliedOK": "Wifi-tunnusten tallennus onnistui. Sivu latautuu uudelleen, kun painat OK. Todennäköisesti joudut muuttamaan URLia, koska imuri yhdistää uuteen verkkoon." }, "telegram": { - "explanation": "Luo uusi Telegram-chat ja etsi \"Botfather\" tiliä, luo uusi botti komennolla /newbot ja kopioi tokeni ja anna se tälle sivulle.", + "explanation": "Luo uusi Telegram-chat ja etsi \"Botfather\" tiliä, luo uusi botti komennolla /newbot ja kopioi tokeni ja syötä se tälle sivulle.", "general": "Telegram-asetukset", "token": "HTTP API Token:", "tokenPlaceholder": "HTTP API Token Botfatherilta", @@ -501,7 +502,7 @@ "n5": "Siivotaan", "n6": "Palataan telakkaan", "n7": "Manualinen tila", - "n8": "Ladataan", + "n8": "Latauksessa", "n9": "Latauksessa ongelmia", "n10": "Tauko", "n11": "Spottisiivous", @@ -517,27 +518,27 @@ "n0": "Ei virhettä", "n1": "Etäisyyslaserin virhe", "n2": "Etupuskuri jumissa", - "n3": "Pudotussensorin hälytys, kanna imuri toiseen paikkaan", + "n3": "Pudotussensorin hälytys, kanna imuri johonkin toiseen paikkaan", "n4": "Pudotussensori likainen", "n5": "Pääharja jumissa", "n6": "Sivuharja jumissa", "n7": "Pääpyörä jumissa", - "n8": "Imuri jumissa, kanna imuri toiseen paikkaan", - "n9": "Pölysäiliö puuttuu tai filtteri on huono", + "n8": "Imuri jumissa, kanna imuri johonkin toiseen paikkaan", + "n9": "Pölysäiliö puuttuu tai filtteri on epäkunnossa", "n10": "Pölysuodatin on likainen", - "n11": "Jumissa magneettisessa esteessä", + "n11": "Jumissa magneettiesteessä", "n12": "Akku lähes tyhjä", "n13": "Latausvirhe", "n14": "Viallinen akku", "n15": "Seinäsensori likainen", - "n16": "Lattia ei ole tasainen, kanna imuri toiseen paikkaan", - "n17": "Sivuharja viallinen, kokeile uudelleenkäynnistystä", - "n18": "Vika imussa, kokeile uudelleenkäynnistystä", - "n19": "Lataustelakka ei ole verkkovirrassa", + "n16": "Lattia ei ole tasainen, kanna imuri johonkin toiseen paikkaan", + "n17": "Sivuharja viallinen, kokeile käynnistää laite uudelleen", + "n18": "Vika puhaltimessa, kokeile käynnistää laite uudelleen", + "n19": "Lataustelakka ei verkkovirrassa", "n21": "Etäisyyslaserin yläosa on jumissa", "n22": "Etupuskurin sensori likainen", "n23": "Telakan signaalinlähetysalue on likainen", "n24": "Kielletty alue havaittu, evakuoi robotti sallittuun paikkaan" } } -} \ No newline at end of file +} From e0c2b3cc2c3239cd373034d15e76fa95e381ab59 Mon Sep 17 00:00:00 2001 From: Erinome Date: Sun, 24 May 2020 11:20:14 +0300 Subject: [PATCH 013/172] attempt to dynamically load some optional features and fix misc issues though unfortunately it seems impossible to make them free memory when unloaded --- .github/FUNDING.yml | 2 +- client/about.html | 11 +- client/home.html | 34 +++-- client/manualcontrol.html | 28 ++-- client/map.html | 2 +- client/settings-access-control.html | 76 +++++------ client/settings-telegrambot.html | 6 +- lib/CronScheduler.js | 161 +++++++++++----------- lib/MapManager.js | 8 +- lib/MqttClient.js | 73 +++++----- lib/Telegrambot.js | 199 ++++++++++++++-------------- lib/Valetudo.js | 101 ++++---------- lib/miio/Dummycloud.js | 92 +++++-------- lib/miio/Vacuum.js | 16 +-- lib/webserver/WebServer.js | 96 ++++++++------ 15 files changed, 418 insertions(+), 487 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 90fbdb0c..cc6cfe67 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ # testing -custom: ['https://money.yandex.ru/to/410011290807928'] +custom: ['https://www.buymeacoffee.com/rand256','https://money.yandex.ru/to/410011290807928'] diff --git a/client/about.html b/client/about.html index 5ea730e9..f2bc9ac3 100644 --- a/client/about.html +++ b/client/about.html @@ -8,19 +8,20 @@

Valetudo RE

free your vacuum from the cloud
+

Based on Valetudo - Another IoT Smarthome Node.js project by Hypfer

+

enhanced by rand256

- Based on Valetudo - Another IoT Smarthome Node.js project by Hypfer
- enhanced by rand256 -

Thanks to all contributors:
https://github.com/rand256/valetudo/graphs/contributors -
-

+ +

buy me a coffee

+

Яндекс

+ \ No newline at end of file diff --git a/client/settings-telegrambot.html b/client/settings-telegrambot.html index a8082cb9..2eedd761 100644 --- a/client/settings-telegrambot.html +++ b/client/settings-telegrambot.html @@ -135,7 +135,7 @@ function getSettingsTelegramPage() { loadingBarSettingsTelegram.setAttribute("indeterminate", "indeterminate"); - fn.prequest("api/get_telegram_config") + fn.prequest("api/telegram_config") .then((res) => { settingsTelegramEnabled.checked = res.enabled; settingsTelegramToken.value = res.token || ''; @@ -200,7 +200,7 @@ function getTelegramStatus() { loadingBarSettingsTelegram.setAttribute("indeterminate", "indeterminate"); - fn.prequest("api/get_telegram_status").then( + fn.prequest("api/telegram_status").then( (res) => { if (/[^0-9]/.test(res.running)) { settingsTelegramStatus.textContent = i18next.t('settings.telegram.connectedAs',{defaultValue: "Telegrambot connected as {{botname}}", botname: res.running}); @@ -258,7 +258,7 @@ function setSettingsTelegramPage() { loadingBarSettingsTelegram.setAttribute("indeterminate", "indeterminate"); - fn.prequestWithPayload("api/set_telegram_config", JSON.stringify({ + fn.prequestWithPayload("api/telegram_config", JSON.stringify({ "enabled": settingsTelegramEnabled.checked, "token": settingsTelegramToken.value.trim() || '', "password": settingsTelegramPassword.value.trim() || '', diff --git a/lib/CronScheduler.js b/lib/CronScheduler.js index ac5bd1b6..a660e6bc 100644 --- a/lib/CronScheduler.js +++ b/lib/CronScheduler.js @@ -1,101 +1,98 @@ const cron = require('cron'); -const CronScheduler = function (parameters) { - const self = this; - - this.configuration = parameters.configuration; - this.vacuum = parameters.vacuum; +const CronScheduler = function (valetudo) { + this.configuration = valetudo.configuration; + this.vacuum = valetudo.vacuum; this.schedules = []; this.timezone = "Europe/Berlin"; - this.createSchedule = function(job,check) { - if (!job || !job[0] && !check || job.length < 4) { - return false; - } - // todo: add some more validation maybe - try { - let task = new cron.CronJob(job[2], () => { - let status; - new Promise((resolve,reject) => { - self.vacuum.getCurrentStatus(function (err, data) { - // running when state is charging, idle or sleep - if (!err && data && ([3,8].includes(data.state) || (data.state === 2 && data.in_cleaning === 0))) { - status = data; - resolve(true); - } else { - reject("conditions not met"); - } - }); - }) - .then(_ => { - return new Promise((resolve,reject) => { - if (job[4] && status.fan_power !== job[4]) { - self.vacuum.setFanSpeed(job[4], function (err, data) { - if (err) { - reject('failed to set fanpower: ' + err); - } else { - console.log(new Date(),'scheduled zoned cleaning set fanpower to ' + job[4], data); - resolve(true); - } - }); - return; - } + setTimeout(() => this.initSchedules(), 5e3); +} + +CronScheduler.prototype.createSchedule = function(job,check) { + if (!job || !job[0] && !check || job.length < 4) { + return false; + } + // todo: add some more validation maybe + try { + let task = new cron.CronJob(job[2], () => { + let status; + new Promise((resolve,reject) => { + this.vacuum.getCurrentStatus(function (err, data) { + // running when state is charging, idle or sleep + if (!err && data && ([3,8].includes(data.state) || (data.state === 2 && data.in_cleaning === 0))) { + status = data; resolve(true); - }) - }) - .then(_ => { - return new Promise((resolve,reject) => { - self.vacuum.startCleaningZone(job[3], function (err, data) { + } else { + reject('conditions not met'); + } + }); + }) + .then(_ => { + return new Promise((resolve,reject) => { + if (job[4] && status.fan_power !== job[4]) { + this.vacuum.setFanSpeed(job[4], function (err, data) { if (err) { - reject('error starting: ' + err); + reject('failed to set fanpower: ' + err); } else { - console.log(new Date(),'scheduled zoned cleaning started', data); + console.log(new Date(),'scheduled zoned cleaning set fanpower to ' + job[4], data); resolve(true); } }); - }) + return; + } + resolve(true); }) - .catch(err => console.log(new Date(),'scheduled zoned cleaning:', err)); - }, null, check ? false : true, self.timezone); - if (!check) { - self.schedules.push(task); - } - } catch (e) { - console.log(new Date(),'creating task timer for zoned task failed', e, self.timezone); - return e.toString() + ' (' + self.timezone + ')'; - } - return true; - }; - - this.removeSchedule = function(index) { - if (self.schedules[index]) { - let task = self.schedules[index]; - task.stop(); - self.schedules.splice(index, 1); - return true; + }) + .then(_ => { + return new Promise((resolve,reject) => { + this.vacuum.startCleaningZone(job[3], function (err, data) { + if (err) { + reject('error starting: ' + err); + } else { + console.log(new Date(),'scheduled zoned cleaning started', data); + resolve(true); + } + }); + }) + }) + .catch(err => console.log(new Date(),'scheduled zoned cleaning:', err)); + }, null, check ? false : true, this.timezone); + if (!check) { + this.schedules.push(task); } - return false; - }; + } catch (e) { + console.log(new Date(),'creating task timer for zoned task failed', e, this.timezone); + return e.toString() + ' (' + this.timezone + ')'; + } + return true; +}; - this.resetSchedules = function() { - for (let i = self.schedules.length - 1; i >= 0 ; i--) { - self.removeSchedule(i); - } - self.configuration.get("ztimers").forEach(task => { - self.createSchedule(task); - }); - }; +CronScheduler.prototype.removeSchedule = function(index) { + if (this.schedules[index]) { + this.schedules[index].stop(); + this.schedules.splice(index, 1); + return true; + } + return false; +}; - this.initSchedules = function() { - self.vacuum.getTimezone(function (err, data) { - if (!err) { - self.timezone = data[0]; - } - self.resetSchedules(); - }); - }; +CronScheduler.prototype.resetSchedules = function() { + for (let i = this.schedules.length - 1; i >= 0 ; i--) { + this.removeSchedule(i); + } + this.configuration.get("ztimers").forEach(task => { + this.createSchedule(task); + }); +}; - setTimeout(() => { self.initSchedules() }, 5e3); +CronScheduler.prototype.initSchedules = function() { + this.vacuum.getTimezone((err, data) => { + if (!err) { + this.timezone = data[0]; + } + this.resetSchedules(); + }); }; module.exports = CronScheduler; diff --git a/lib/MapManager.js b/lib/MapManager.js index 80e1d918..ce8257c6 100644 --- a/lib/MapManager.js +++ b/lib/MapManager.js @@ -6,10 +6,10 @@ const requiredFiles = ['last_map']; const optionalFiles = ['ChargerPos.data', 'PersistData_1.data']; const cleanedFiles = ['StartPos.data', 'user_map0', 'user_map1', 'user_map2', 'user_map3', 'PersistData_2.data', 'PersistData_3.data', 'PersistData_4.data', 'PersistData_5.data']; -const MapManager = function(options) { - this.configuration = options.configuration; - this.vacuum = options.vacuum; - this.events = options.events; +const MapManager = function(valetudo) { + this.configuration = valetudo.configuration; + this.vacuum = valetudo.vacuum; + this.events = valetudo.events; }; MapManager.prototype.storeMap = function(name, callback) { diff --git a/lib/MqttClient.js b/lib/MqttClient.js index c3ec77f5..72135996 100644 --- a/lib/MqttClient.js +++ b/lib/MqttClient.js @@ -72,19 +72,17 @@ const HA_STATE_MAPPINGS = { }; /** - * - * @param options {object} - * @param options.configuration {Configuration} - * @param options.vacuum {Vacuum} - * @param options.events {EventEmitter} - * @param options.map {MapDTO} + * @param valetudo {Valetudo} * @constructor */ -const MqttClient = function (options) { - this.configuration = options.configuration; - this.vacuum = options.vacuum; +const MqttClient = function (valetudo) { + this.configuration = valetudo.configuration; + this.vacuum = valetudo.vacuum; + this.events = valetudo.events; + this.map = valetudo.map; + this.mapManager = valetudo.mapManager; - let mqttConfig = this.configuration.get("mqtt"); + const mqttConfig = this.configuration.get("mqtt"); this.brokerURL = mqttConfig.broker_url; this.identifier = mqttConfig.identifier || "rockrobo"; @@ -94,9 +92,6 @@ const MqttClient = function (options) { this.provideMapData = mqttConfig.provideMapData !== undefined ? mqttConfig.provideMapData : true; this.caPath = mqttConfig.caPath || ""; this.qos = mqttConfig.qos || 0; - this.events = options.events; - this.map = options.map; - this.mapManager = options.mapManager; this.topics = { command: this.topicPrefix + "/" + this.identifier + "/command", @@ -144,17 +139,14 @@ const MqttClient = function (options) { this.isPublishingMap = false; this.nextMapToPublish = null; - this.connect(); this.updateAttributesTopic(); - this.events.on("valetudo.map", () => { if(this.provideMapData) { this.updateMapDataTopic(); } }); - this.events.on("miio.status", (statusData) => { if (statusData.msg_ver === 3) { Object.assign(FAN_SPEEDS,FAN_SPEEDS_V3); @@ -162,6 +154,10 @@ const MqttClient = function (options) { this.updateStatusTopic(statusData); this.updateAttributesTopicOnEvent(statusData) }); + this.events.on("miio.bin_full", () => { + this.last_bin_full = Date.now(); + this.updateAttributesTopic(); + }); }; MqttClient.prototype.connect = function () { @@ -171,8 +167,7 @@ MqttClient.prototype.connect = function () { options.ca = fs.readFileSync(this.caPath); } this.client = mqtt.connect(this.brokerURL, options); - - this.client.on("connect", () => { + this.connectCallback = () => { console.info(new Date(),"Connected successfully to mqtt server"); this.client.subscribe([ this.topics.command, @@ -188,9 +183,8 @@ MqttClient.prototype.connect = function () { console.error(new Date(),err); } }); - }); - - this.client.on("message", (topic, message) => { + }; + this.messageCallback = (topic, message) => { message = message.toString(); switch (topic) { case this.topics.send_command: @@ -203,25 +197,37 @@ MqttClient.prototype.connect = function () { this.handleCommand(message); break; } - }); - - this.client.on("error", (e) => { + }; + this.errorCallback = (e) => { if(e && e.message === "Not supported") { console.info(new Date(),"Connected to non standard compliant MQTT Broker.") } else { console.error(new Date(),e); } - }) + }; + this.client.on("connect", this.connectCallback); + this.client.on("message", this.messageCallback); + this.client.on("error", this.errorCallback); } }; -/** - * - * @param mapDataStr {string} - */ +MqttClient.prototype.stop = async function () { + if (this.client) { + this.client.off("connect", this.connectCallback); + this.client.off("message", this.messageCallback); + this.client.off("error", this.errorCallback); + await new Promise(res => this.client.end(true,() => { this.client = null; res(); })); + } +}; +MqttClient.prototype.reload = function () { + this.stop(); + this.connect(); +}; + MqttClient.prototype.asyncUpdateMapDataTopic = async function() { this.isPublishingMap = true; while (true) { + if (!this.client || !this.client.connected) break; await new Promise((resolve,reject) => { this.nextMapToPublish = false; let timeout = setTimeout(() => reject('mqtt updateMapDataTopic timed out'),30e3); // looks like a bug in MqttClient: on disconnect it may NEVER run a callback @@ -235,12 +241,8 @@ MqttClient.prototype.asyncUpdateMapDataTopic = async function() { this.isPublishingMap = false; } -/** - * - * @param mapDTO {MapDTO} - */ MqttClient.prototype.updateMapDataTopic = function () { - if (this.client && this.client.connected === true && this.map.bin) { + if (this.map.bin) { if (!this.isPublishingMap) { this.asyncUpdateMapDataTopic(); } else { @@ -255,16 +257,13 @@ MqttClient.prototype.updateAttributesTopicOnEvent = function (statusData) { id: statusData.state, name: Vacuum.GET_STATE_CODE_DESCRIPTION(statusData.state) }; - this.updateAttributesTopic(); }; - MqttClient.prototype.updateAttributesTopic = function () { if (this.attributesUpdateTimeout) { clearTimeout(this.attributesUpdateTimeout); } - if (this.client && this.client.connected === true) { this.vacuum.getConsumableStatus((err, res) => { if (!err) { diff --git a/lib/Telegrambot.js b/lib/Telegrambot.js index f1e8a1da..2de87ea0 100644 --- a/lib/Telegrambot.js +++ b/lib/Telegrambot.js @@ -6,20 +6,18 @@ const SimpleMapDrawer = require("./SimpleMapDrawer"); const SlimbotImproved = require("./telegram/slimbotImproved.js"); /** - * @param options {object} - * @param options.configuration {Configuration} - * @param options.vacuum {Vacuum} - * @param options.events {EventEmitter} + * @param valetudo {Valetudo} * @constructor */ -const Telegrambot = function (options) { +const Telegrambot = function (valetudo) { const self = this; - this.configuration = options.configuration; - this.events = options.events; - this.vacuum = options.vacuum; - this.map = options.map; - this.mapManager = options.mapManager; + this.configuration = valetudo.configuration; + this.events = valetudo.events; + this.vacuum = valetudo.vacuum; + this.map = valetudo.map; + this.mapManager = valetudo.mapManager; + this.lastState = {state: -1, error_code: 0, in_cleaning: 0, in_returning: 0}; if (process.env.VAC_MODEL) { this.lastState = {state: 8, error_code: 0, in_cleaning: 0, in_returning: 0}; // for development @@ -27,16 +25,89 @@ const Telegrambot = function (options) { } this.lastNotifications = {consumables: 0, binFull: 0}; + this.slimbotRefresher = { + _timeout: 0, + _stopped: true, + start: function() { + this._stopped = false; + this.poll(); + }, + stop: function() { + this._stopped = true; + self.runningState = 1; + clearTimeout(this._timeout); + }, + poll: function() { + if (!this._stopped && self.slimbot) { + self.slimbot.startPolling(self.slimbotCatcher); + } + }, + getName: function() { + if (!self.slimbot) return; + self.slimbot.getMe(function(err,res) { + if (!err && res.ok && res.result && res.result.username) { + self.runningState = 0; + self.botname = res.result.username; + } else { + self.runningState = 1; + } + }); + }, + refresh: function() { + if (!this._stopped) { + if (self.runningState > 0) { + self.runningState--; + } + if (!self.runningState) { + self.connectFailCount = 0; + if (!self.botname) { + this.getName(); + } + } + this._timeout = setTimeout(() => this.poll(), self.runningState ? 5e3 : 5e2); + } + } + }; + + this.slimbotCatcher = function(error) { + if (error === null) return; + self.runningState = 3; + if (self.slimbot && self.slimbot._useProxy && ++self.connectFailCount > 20) { + console.error(new Date(),'tgBot polling: too many connection failures in a row, probably the proxy has died. stopping...'); + self.stop(); + self.runningState = 2; + self.configuration.get("telegramBot").enabled = false; + } + console.error(new Date(),'tgBot polling:', error.message ? error.message : error); + }; + + this.language = {}; + this.languageGetter = function(id,def) { + try { + let lang = this.configuration.get("webInterface").localization; + if (!this.language[lang]) { + if (fs.existsSync(path.join(__dirname, '../client/locales/' + lang + '.json'))) { + let locale = JSON.parse(fs.readFileSync(path.join(__dirname, '../client/locales/' + lang + '.json'))); + this.language[lang] = {telegram: locale.telegram, common: locale.common, home: locale.home, robot: locale.robot}; + } else { + this.language[lang] = {}; + } + } + return id.split('.').reduce((prev, curr) => prev && prev[curr], this.language[lang]) || def; + } catch (e) { + return def; + } + } + this.slimbot = null; this.runningState = 1; // 0 - connected, 1 - disconnected, 2 - connection error this.connectFailCount = 0; - this.initiate(); + this.reload(); - // todo: move below to initiate this.events.on("miio.consume_material_notify", (statusData) => { - if (self.slimbot !== null && self.sendConsumables && (Date.now() - this.lastNotifications.consumables) > 300e3) { - this.lastNotifications.consumables = Date.now(); + if (self.slimbot !== null && self.sendConsumables && (Date.now() - self.lastNotifications.consumables) > 300e3) { + self.lastNotifications.consumables = Date.now(); self.vacuum.getConsumableStatus(function (err, res) { if (!err) { self.clients.forEach(client => { @@ -49,8 +120,8 @@ const Telegrambot = function (options) { } }); this.events.on("miio.bin_full", (statusData) => { - if (self.slimbot !== null && self.sendConsumables && (Date.now() - this.lastNotifications.binFull) > 300e3) { - this.lastNotifications.binFull = Date.now(); + if (self.slimbot !== null && self.sendConsumables && (Date.now() - self.lastNotifications.binFull) > 300e3) { + self.lastNotifications.binFull = Date.now(); self.clients.forEach(client => { if (!client.silence) { self.sendMessage(client.id, self.languageGetter('telegram.binFull', "Dust bin congestion is supposed, check it up!")); @@ -62,7 +133,7 @@ const Telegrambot = function (options) { if (!statusData.msg_ver || !statusData.battery) return; let res = Object.assign({},statusData); if (self.slimbot !== null && self.lastState.state >= 0 && (self.lastState.state !== res.state || (res.state === 12 && (self.lastState.error_code !== res.error_code)))) { - let notifyAllowed = false, notifyTypes = this.configuration.get("telegramBot").notifyStatusTypes || 0; + let notifyAllowed = false, notifyTypes = self.configuration.get("telegramBot").notifyStatusTypes || 0; if (notifyTypes === 0 || notifyTypes === 1 && ([3,6,10].includes(res.state) && [5,11,16,17,18].includes(self.lastState.state) || [5,11,16,17,18].includes(res.state)) || [9,12].includes(res.state)) { notifyAllowed = true; } @@ -84,43 +155,23 @@ const Telegrambot = function (options) { setTimeout(() => { self.initLastState() }, 5e3); } -Telegrambot.prototype.initiate = function() { +Telegrambot.prototype.reload = function() { const self = this; + this.botname = ""; + this.runningState = 1; + let token = this.configuration.get("telegramBot").token; if (!token || !this.configuration.get("telegramBot").enabled) { - if (this.slimbot) { - this.slimbot._timeout.stop(); - } + this.stop(); return; } - this.botname = ""; - this.runningState = 1; - this.clients = this.configuration.get("telegramBot").clients || []; this.password = this.configuration.get("telegramBot").password; this.sendConsumables = this.configuration.get("telegramBot").sendConsumables; this.sendConsumablesEvery = this.configuration.get("telegramBot").sendConsumablesEvery; - this.language = {}; - this.languageGetter = function(id,def) { - try { - let lang = this.configuration.get("webInterface").localization; - if (!this.language[lang]) { - if (fs.existsSync(path.join(__dirname, '../client/locales/' + lang + '.json'))) { - let locale = JSON.parse(fs.readFileSync(path.join(__dirname, '../client/locales/' + lang + '.json'))); - this.language[lang] = {telegram: locale.telegram, common: locale.common, home: locale.home, robot: locale.robot}; - } else { - this.language[lang] = {}; - } - } - return id.split('.').reduce((prev, curr) => prev && prev[curr], this.language[lang]) || def; - } catch (e) { - return def; - } - } - let apiHost = this.configuration.get("telegramBot").host; let proxy = this.configuration.get("telegramBot").proxy, proxyObj = {}, @@ -153,64 +204,6 @@ Telegrambot.prototype.initiate = function() { } } - this.slimbotCatcher = function(error) { - if (error === null) return; - self.runningState = 3; - if (self.slimbot && self.slimbot._useProxy && ++self.connectFailCount > 20) { - console.error(new Date(),'tgBot polling: too many connection failures in a row, probably the proxy has died. stopping...'); - if (self.slimbot) { - self.slimbot._timeout.stop(); - self.runningState = 2; - } - self.configuration.get("telegramBot").enabled = false; - } - console.error(new Date(),'tgBot polling:', error.message ? error.message : error); - }; - - this.slimbotRefresher = { - _timeout: 0, - _stopped: true, - start: function() { - this._stopped = false; - this.poll(); - }, - stop: function() { - this._stopped = true; - self.runningState = 1; - clearTimeout(this._timeout); - }, - poll: function() { - if (!this._stopped && self.slimbot) { - self.slimbot.startPolling(self.slimbotCatcher); - } - }, - getName: function() { - if (!self.slimbot) return; - self.slimbot.getMe(function(err,res) { - if (!err && res.ok && res.result && res.result.username) { - self.runningState = 0; - self.botname = res.result.username; - } else { - self.runningState = 1; - } - }); - }, - refresh: function() { - if (!this._stopped) { - if (self.runningState > 0) { - self.runningState--; - } - if (!self.runningState) { - self.connectFailCount = 0; - if (!self.botname) { - this.getName(); - } - } - this._timeout = setTimeout(() => this.poll(), self.runningState ? 5e3 : 5e2); - } - } - }; - if (this.slimbot) { this.slimbot._token = token; this.slimbot._host = apiHost || null; @@ -228,6 +221,12 @@ Telegrambot.prototype.initiate = function() { } } +Telegrambot.prototype.stop = function() { + if (this.slimbot) { + this.slimbot._timeout.stop(); + } +} + Telegrambot.prototype.initLastState = function() { this.vacuum.getCurrentStatus((err, res) => { if (!err) { diff --git a/lib/Valetudo.js b/lib/Valetudo.js index 47ec7047..84d3bf1a 100644 --- a/lib/Valetudo.js +++ b/lib/Valetudo.js @@ -13,8 +13,11 @@ const CronScheduler = require('./CronScheduler'); const Valetudo = function() { this.configuration = new Configuration(); this.address = process.env.VAC_ADDRESS ? process.env.VAC_ADDRESS : "127.0.0.1"; - this.events = new EventEmitter(); //TODO: Better naming? + this.events = new EventEmitter(); + this.model = Valetudo.VACUUM_MODEL_PROVIDER(); + this.cloudKey = Valetudo.CLOUD_KEY_PROVIDER(); + this.deviceId = Valetudo.DEVICE_ID_PROVIDER(); if(process.env.VAC_TOKEN) { this.tokenProvider = function() { @@ -27,67 +30,31 @@ const Valetudo = function() { this.webPort = process.env.VAC_WEBPORT ? parseInt(process.env.VAC_WEBPORT) : 80; this.map = {snapshots: [], bin: null, hash: null}; - this.dummycloud = new Dummycloud({ - spoofedIP: this.configuration.get("dummycloud").spoofedIP, - cloudKey: Valetudo.CLOUD_KEY_PROVIDER(), - deviceId: Valetudo.DEVICE_ID_PROVIDER(), - bindIP: this.configuration.get("dummycloud").bindIP, - mapUploadHost: this.configuration.get("map_upload_host"), - events: this.events, - map: this.map - }); - - this.vacuum = new Vacuum({ - ip: this.address, - tokenProvider: this.tokenProvider, - model: this.model, - events: this.events - }); + this.createInstance = function(type,enabled) { + enabled = enabled || enabled === undefined; + switch(type) { + case "tgbot": + this.telegramBot = enabled ? new Telegrambot(this) : null; + break; + case "cron": + this.cronScheduler = enabled ? new CronScheduler(this) : null; + break; + case "mqtt": + this.mqttClient = enabled ? new MqttClient(this) : null; + break; + } + } + this.dummycloud = new Dummycloud(this); + this.vacuum = new Vacuum(this); this.sshManager = new SSHManager(); + this.mapManager = new MapManager(this); - this.mapManager = new MapManager({ - configuration: this.configuration, - vacuum: this.vacuum, - events: this.events - }); - - this.cronScheduler = new CronScheduler({ - configuration: this.configuration, - vacuum: this.vacuum - }); - - this.telegramBot = new Telegrambot({ - vacuum: this.vacuum, - events: this.events, - map: this.map, - mapManager: this.mapManager, - configuration: this.configuration - }); - - this.webserver = new Webserver({ - vacuum: this.vacuum, - port: this.webPort, - configuration: this.configuration, - events: this.events, - map: this.map, - sshManager: this.sshManager, - cronScheduler: this.cronScheduler, - events: this.events, - cloud: this.dummycloud, - mapManager: this.mapManager, - telegramBot: this.telegramBot - }); + this.createInstance("mqtt", this.configuration.get("mqtt").enabled); + this.createInstance("cron", this.configuration.get("ztimers").length && this.configuration.get("ztimers").some(zt => zt[0])); + this.createInstance("tgbot", this.configuration.get("telegramBot").enabled && !!this.configuration.get("telegramBot").token); - if(this.configuration.get("mqtt") && this.configuration.get("mqtt").enabled === true) { - this.mqttClient = new MqttClient({ - configuration: this.configuration, - vacuum: this.vacuum, - events: this.events, - map: this.map, - mapManager: this.mapManager - }); - } + this.webserver = new Webserver(this); }; function readValueFromDeviceConf(key) { @@ -97,12 +64,9 @@ function readValueFromDeviceConf(key) { } catch(e) { console.error(e); } - if(deviceConf) { const value = deviceConf.toString().match(new RegExp("^"+ key + "=(.*)$", "m")); - if(Array.isArray(value) && value[1]) { - // noinspection JSConstructorReturnsPrimitive return value[1]; } else { console.error("Failed to fetch " + key + " from device.conf"); @@ -114,7 +78,7 @@ function readValueFromDeviceConf(key) { Valetudo.NATIVE_TOKEN_PROVIDER = function() { const token = fs.readFileSync("/mnt/data/miio/device.token"); - if(token && token.length >= 16) { + if (token && token.length >= 16) { return token.slice(0,16); } else { throw new Error("Unable to fetch token") @@ -122,35 +86,28 @@ Valetudo.NATIVE_TOKEN_PROVIDER = function() { }; Valetudo.CLOUD_KEY_PROVIDER = function() { - if(process.env.VAC_CLOUDKEY) { - // noinspection JSConstructorReturnsPrimitive + if (process.env.VAC_CLOUDKEY) { return process.env.VAC_CLOUDKEY; } else { const cloudKey = readValueFromDeviceConf("key"); - - // noinspection JSConstructorReturnsPrimitive return cloudKey ? cloudKey : "0000000000000000"; //This doesnt work but it wont crash the system } }; Valetudo.DEVICE_ID_PROVIDER = function() { //TODO: merge with CLOUD_KEY_PROVIDER - if(process.env.VAC_DID) { - // noinspection JSConstructorReturnsPrimitive + if (process.env.VAC_DID) { return process.env.VAC_DID; } else { const did = readValueFromDeviceConf("did"); - - // noinspection JSConstructorReturnsPrimitive return did ? did: "00000000"; //This doesnt work but it wont crash the system } }; Valetudo.VACUUM_MODEL_PROVIDER = function() { - if(process.env.VAC_MODEL) { + if (process.env.VAC_MODEL) { return process.env.VAC_MODEL; } else { const model = readValueFromDeviceConf("model"); - return model ? model : "rockrobo.vacuum.v1"; } }; diff --git a/lib/miio/Dummycloud.js b/lib/miio/Dummycloud.js index 33972fc9..a99b6001 100644 --- a/lib/miio/Dummycloud.js +++ b/lib/miio/Dummycloud.js @@ -9,26 +9,20 @@ const Codec = require("./Codec"); const Stamp = require("./Stamp"); /** - * - * @param options {object} - * @param options.spoofedIP {string} The IP we've told miio we are - * @param options.cloudKey {string} The pre-shared unique key of your robot - * @param options.deviceId {string} The unique Device-id of your robot - * @param options.bindIP {string} "127.0.0.1" on the robot, "0.0.0.0" in development - * @param options.mapUploadHost {string} "127.0.0.1" on the robot, ??? in development - * @param options.events {EventEmitter} + * @param valetudo {Valetudo} * @constructor */ -const Dummycloud = function (options) { - this.spoofedIP = options.spoofedIP; - this.cloudKey = options.cloudKey; - this.deviceId = options.deviceId; - this.bindIP = options.bindIP; - this.mapUploadHost = options.mapUploadHost; - this.events = options.events; - this.map = options.map; - this.codec = new Codec({token: this.cloudKey}); +const Dummycloud = function (valetudo) { + this.spoofedIP = valetudo.configuration.get("dummycloud").spoofedIP; + this.bindIP = valetudo.configuration.get("dummycloud").bindIP; + this.mapUploadHost = valetudo.configuration.get("map_upload_host"); + this.events = valetudo.events; + this.map = valetudo.map; + + this.cloudKey = valetudo.cloudKey; + this.deviceId = valetudo.deviceId; + this.codec = new Codec({token: this.cloudKey}); this.socket = dgram.createSocket("udp4"); this.socket.bind(8053, this.bindIP); @@ -76,6 +70,29 @@ const Dummycloud = function (options) { } } else if (decodedResponse.msg) { if (decodedResponse.msg.method) { + switch (decodedResponse.msg.method) { + case "props": + this.updateState(decodedResponse.msg.params); + break; + case "event.status": + if( + decodedResponse.msg.params && + decodedResponse.msg.params[0] && + decodedResponse.msg.params[0].state !== undefined + ) { + this.updateState(decodedResponse.msg.params[0]); + } + break; + case "event.back_to_dock": + this.events.emit("miio.home", true); + break; + case "event.bin_full": //TODO: bring to UI + this.events.emit("miio.bin_full", decodedResponse.msg); + break; + case "event.consume_material_notify": + this.events.emit("miio.consume_material_notify", decodedResponse.msg); + break; + } switch (decodedResponse.msg.method) { case "_otc.info": responseJSON = { @@ -98,27 +115,6 @@ const Dummycloud = function (options) { } }; break; - case "props": - this.updateState(decodedResponse.msg.params); - responseJSON = { - id: decodedResponse.msg.id, - result:"ok" - }; - break; - case "event.status": - if( - decodedResponse.msg.params && - decodedResponse.msg.params[0] && - decodedResponse.msg.params[0].state !== undefined - ) { - this.pollMap(); - this.updateState(decodedResponse.msg.params[0]); - } - responseJSON = { - id: decodedResponse.msg.id, - result:"ok" - }; - break; case "_sync.getctrycode": responseJSON = { id: decodedResponse.msg.id, @@ -150,27 +146,11 @@ const Dummycloud = function (options) { "result": MAP_UPLOAD_URLS }; break; + case "props": + case "event.status": case "event.back_to_dock": - this.events.emit("miio.home", true); - responseJSON = { - id: decodedResponse.msg.id, - result:"ok" - }; - break; case "event.bin_full": //TODO: bring to UI - this.events.emit("miio.bin_full", decodedResponse.msg); - responseJSON = { - id: decodedResponse.msg.id, - result:"ok" - }; - break; case "event.consume_material_notify": - this.events.emit("miio.consume_material_notify", decodedResponse.msg); - responseJSON = { - id: decodedResponse.msg.id, - result:"ok" - }; - break; case "event.back_dock_no_signal": case "event.back_to_dock_no_power": case "event.back_to_dock_nearby": diff --git a/lib/miio/Vacuum.js b/lib/miio/Vacuum.js index 7a290746..5e9bb0d6 100644 --- a/lib/miio/Vacuum.js +++ b/lib/miio/Vacuum.js @@ -8,22 +8,18 @@ const Tools = require("../Tools"); /** - * @param options {object} - * @param options.ip {string} - * @param options.tokenProvider {function} - * @param options.events {EventEmitter} - * @param options.model {string} + * @param valetudo {Valetudo} * @constructor */ -const Vacuum = function(options) { +const Vacuum = function(valetudo) { const self = this; // roborock.vacuum.s5 or rockrobo.vacuum.v1 - this.model = options.model; - this.tokenProvider = options.tokenProvider; - this.events = options.events; + this.model = valetudo.model; + this.tokenProvider = valetudo.tokenProvider; + this.events = valetudo.events; + this.ip = valetudo.address; - this.ip = options.ip; this.token = this.tokenProvider(); if(this.token.length !== 16) { throw new Error("Invalid token"); diff --git a/lib/webserver/WebServer.js b/lib/webserver/WebServer.js index bb2e7cf0..54f7cd85 100644 --- a/lib/webserver/WebServer.js +++ b/lib/webserver/WebServer.js @@ -25,32 +25,26 @@ const upload = multer({ dest: '/mnt/data/valetudo/uploads' }); /** * - * @param options - * @param options.vacuum {Vacuum} - * @param options.port {number} - * @param options.configuration {Configuration} - * @param options.events {EventEmitter} - * @param options.map {MapDTO} - * @param options.sshManager {sshManager} - * @param options.cronScheduler {cronScheduler} - * @param options.events {EventEmitter} + * @param valetudo {Valetudo} * @constructor */ -const WebServer = function (options) { +const WebServer = function (valetudo) { const self = this; - this.vacuum = options.vacuum; - this.port = options.port; - this.configuration = options.configuration; - this.events = options.events; - this.sshManager = options.sshManager; - this.cronScheduler = options.cronScheduler; - this.events = options.events; - this.cloud = options.cloud; - this.mapManager = options.mapManager; - this.telegramBot = options.telegramBot; - - this.map = options.map; + this.vacuum = valetudo.vacuum; + this.port = valetudo.webPort; + this.configuration = valetudo.configuration; + this.events = valetudo.events; + this.sshManager = valetudo.sshManager; + this.cronScheduler = valetudo.cronScheduler; + this.events = valetudo.events; + this.cloud = valetudo.dummycloud; + this.createInstance = valetudo.createInstance; + this.mapManager = valetudo.mapManager; + this.mqttClient = valetudo.mqttClient; + this.telegramBot = valetudo.telegramBot; + + this.map = valetudo.map; this.mapUploadInProgress = {}; this.basicAuthInUse = false; @@ -99,13 +93,17 @@ const WebServer = function (options) { this.app.put("/api/miio/map_slot_:slotID", function(req, res) { if (!self.mapUploadInProgress[req.params.slotID]) { self.mapUploadInProgress[req.params.slotID] = true; - var data = []; - req.on('data', chunk => data.push(chunk)); - req.on('end', function() { - self.map.snapshots[req.params.slotID] = Buffer.concat(data); - self.mapUploadInProgress[req.params.slotID] = false; - res.sendStatus(200); - }); + var data = [], + ondata = chunk => data.push(chunk), + onend = () => { + req.off('data', ondata); + req.off('end', onend); + self.map.snapshots[req.params.slotID] = Buffer.concat(data); + self.mapUploadInProgress[req.params.slotID] = false; + res.sendStatus(200); + } + req.on('data', ondata); + req.on('end', onend); } else { res.end(); req.connection.destroy(); @@ -209,18 +207,17 @@ const WebServer = function (options) { res.json({res:"success"}); }); - // Telegram settings - this.app.get("/api/get_telegram_config", function (req, res) { + this.app.get("/api/telegram_config", function (req, res) { res.json(self.configuration.get("telegramBot")); }); - this.app.get("/api/get_telegram_status", function (req, res) { + this.app.get("/api/telegram_status", function (req, res) { res.json({ - running: self.telegramBot.getStatus() - }); + running: !self.telegramBot ? 1 : self.telegramBot.getStatus() + }); // if we have telegramBot = null then status is assumed to be 1 = disconnected }); - this.app.put("/api/set_telegram_config", function (req, res) { + this.app.put("/api/telegram_config", function (req, res) { self.configuration.set("telegramBot", { enabled: req.body.enabled, token: req.body.token, @@ -232,7 +229,11 @@ const WebServer = function (options) { sendConsumablesEvery: req.body.sendConsumablesEvery, notifyStatusTypes: +req.body.notifyStatusTypes || 0 }); - self.telegramBot.initiate(); + if (req.body.enabled) { + self.telegramBot && self.telegramBot.reload() || self.createInstance("tgbot"); + } else { + self.telegramBot && self.telegramBot.stop(); + } res.json({res:"success"}); }); @@ -242,13 +243,12 @@ const WebServer = function (options) { telegramBotCfg.clients = telegramBotCfg.clients.filter(client => client.id !== +req.params.clientID); if (telegramBotCfg.clients.length !== len) { self.configuration.set("telegramBot", telegramBotCfg); - self.telegramBot.initiate(); + self.telegramBot.reload(); res.json({res:"success"}); } else { res.status(404).send("No telegrambot with selected id."); } }); - // Telegram end this.app.get("/api/get_fw_version", function (req, res) { fs.readFile("/etc/os-release", function (err, data) { @@ -351,6 +351,9 @@ const WebServer = function (options) { req.body.coordinates, +req.body.fanpower || null ]; + if (!self.cronScheduler) { + self.createInstance("cron"); + } let checkTask = self.cronScheduler.createSchedule(ntimer,true); if (checkTask !== true) { res.status(400).send("invalid timer: " + (checkTask || 'unspecified')); @@ -378,8 +381,11 @@ const WebServer = function (options) { if (idx < 0) { res.status(404).send("No timer with selected id."); } else { - ztimers[idx][0] = req.body.enabled || false; + ztimers[idx][0] = !!req.body.enabled || false; self.configuration.set("ztimers", ztimers); + if (!self.cronScheduler) { + self.createInstance("cron"); + } self.cronScheduler.resetSchedules(); res.status(201).json({message: "ok"}); } @@ -533,8 +539,10 @@ const WebServer = function (options) { if (err) { res.status(500).send(err.toString()); } else { - self.cronScheduler.timezone = req.body.new_zone; - self.cronScheduler.resetSchedules(); + if (self.cronScheduler) { + self.cronScheduler.timezone = req.body.new_zone; + self.cronScheduler.resetSchedules(); + } res.json(data); } }) @@ -1336,7 +1344,7 @@ const WebServer = function (options) { self.mapDistributionQueue = []; self.mapDistributionCB = []; - async function asyncUploadWorker() { + async function mapUploadWorker() { while (true) { await new Promise((resolve,reject) => { if (!self.mapDistributionQueue.length) { @@ -1354,7 +1362,7 @@ const WebServer = function (options) { } for (let i = 0; i < 4; i++) { // <-- number of simultaneous uploads allowed to run - asyncUploadWorker(); + mapUploadWorker(); } self.events.on("valetudo.map", () => { @@ -1365,7 +1373,7 @@ const WebServer = function (options) { }); // make sleeping workers know that queue has changed for (let i = 0; i < self.mapDistributionQueue.length && 0 < self.mapDistributionCB.length; i++) { - self.mapDistributionCB.shift()(); + this.mapDistributionCB.shift()(); } }); From 15415e842d5b2004a836744a204f34b003d58e19 Mon Sep 17 00:00:00 2001 From: Erinome Date: Mon, 25 May 2020 12:08:34 +0300 Subject: [PATCH 014/172] add mqtt configuration page to settings closes #206 --- client/locales/bg.json | 13 +++ client/locales/de.json | 13 +++ client/locales/en.json | 41 ++++++---- client/locales/es.json | 13 +++ client/locales/fi.json | 13 +++ client/locales/fr.json | 13 +++ client/locales/hu.json | 13 +++ client/locales/it.json | 13 +++ client/locales/lv.json | 13 +++ client/locales/nl.json | 13 +++ client/locales/pl.json | 13 +++ client/locales/ru.json | 13 +++ client/settings-mqtt.html | 161 +++++++++++++++++++++++++++++++++++++ client/settings.html | 6 +- lib/webserver/WebServer.js | 25 ++++++ 15 files changed, 361 insertions(+), 15 deletions(-) create mode 100644 client/settings-mqtt.html diff --git a/client/locales/bg.json b/client/locales/bg.json index 6728742c..29251bb0 100644 --- a/client/locales/bg.json +++ b/client/locales/bg.json @@ -250,6 +250,8 @@ "webInterfaceDesc": "Промяна на настройките на уеб интерфейса", "accessControlTitle": "Права за достъп", "accessControlDesc": "SSH ключове и HTTP автентикация", + "mqttTitle": "MQTT", + "mqttDesc": "Преглед и промяна на настройките на MQTT", "telegramTitle": "Telegram бот", "telegramDesc": "Активиране и настройки за Telegram бот", "loading": "зареждане...", @@ -464,6 +466,17 @@ "hintText": "Винаги можете да поставите устройството в режим на точка за достъп, консултирайте се с ръководството за употреба как да нулирате настройките на Wifi.", "appliedOK": "Промените са приложени успешно. Страницата ще се презареди автоматично след натискане на бутона \"OK\", но може да се наложи да промените URL адреса в адресната лента, тъй като устройството ще бъде свързано към друга мрежа." }, + "mqtt": { + "settings": "Настройки на MQTT", + "url": "URL:", + "capath": "CA път (за SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Публикуване на карта:", + "save": "Запазване на конфигурацията" + }, "telegram": { "explanation": "Създайте нов чат в Telegram и потърсете акаунта \"Botfather\". Създайте в него нов бот с командата /newbot, копирайте получения токен и го въведете на тази страница.", "general": "Настройки за Telegram", diff --git a/client/locales/de.json b/client/locales/de.json index 6968faee..f6fbc013 100644 --- a/client/locales/de.json +++ b/client/locales/de.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Webinterface-Parameter anpassen", "accessControlTitle": "Zugangskontrolle", "accessControlDesc": "Einstellen von SSH-Schlüsseln und HTTP-Authentifizierung", + "mqttTitle": "MQTT", + "mqttDesc": "Anzeigen und Ändern der MQTT-Einstellungen", "telegramTitle": "Telegram-Bot", "telegramDesc": "Einschalten und konfigurieren der Telegram-Bot-Einstellungen", "loading": "Laden...", @@ -465,6 +467,17 @@ "hintText": "Es kann jederzeit zum integrierten WLAN-Hotspot zurückgekehrt werden, Informationen zum Zurücksetzen der Wifi-Einstellungen finden Sie in Ihrem Benutzerhandbuch.", "appliedOK": "Neue WLAN-Anmeldeinformationen wurden erfolgreich angewandt. Nach dem Drücken auf OK wird die Seite aktualisiert. Sie müssen voraussichtlich die Adresse auf die neue IP des Roboters ändern, da der Roboter versucht, eine Verbindung zum neuen WLAN herzustellen. (ggf. anderer DHCP Bereich, Routereinstellungen prüfen)" }, + "mqtt": { + "settings": "MQTT-Einstellungen", + "url": "URL:", + "capath": "CA-Pfad (für SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Kartendaten veröffentlichen:", + "save": "Konfiguration speichern" + }, "telegram": { "explanation": "Erstellen Sie einen neuen Chat und suchen Sie nach \"Botfather\".\nErstellen Sie einen neuen Bot mit /newbot.\nNach der Erstellung kopieren Sie den Token und fügen Sie ihn auf der Seite ein. Das hier gesetzte Passwort wird zur Authentifizierung des Bots verwendet.", "general": "Telegram-Einstellungen", diff --git a/client/locales/en.json b/client/locales/en.json index 43c52b54..e06a4e18 100644 --- a/client/locales/en.json +++ b/client/locales/en.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Change web interface parameters", "accessControlTitle": "Access Control", "accessControlDesc": "Configure SSH keys and HTTP authentication", + "mqttTitle": "MQTT", + "mqttDesc": "View and change MQTT settings", "telegramTitle": "Telegram Bot", "telegramDesc": "Enable and configure Telegram bot settings", "loading": "loading...", @@ -450,20 +452,31 @@ "enableMultimapConfirm": "This feature is not a part of roborock functionality but rather a number of hacks around it. While it may work well, it could also cause a factory reset if something unexpectedly goes wrong. Do you still want to continue?" }, "wifi": { - "currentConnection": "Current Connection", - "status": "Status", - "ssid": "SSID", - "signal": "Signal", - "txBitrate": "TX Bitrate", - "settings": "Wifi Settings", - "password": "Password", - "save": "Save new Wifi configuration", - "connected": "Connected", - "notConnected": "Not connected", - "confirm": "Are you sure you want to apply the new Wifi settings?", - "hint": "Hint", - "hintText": "You can always revert back to the integrated Wifi Hotspot, consult your user manual on how to reset Wifi settings.", - "appliedOK": "Successfully applied new wifi credentials. After pressing OK the page will refresh. However, you will most likely need to change the URL since the robot will try to connect to the new Wifi." + "currentConnection": "Current Connection", + "status": "Status", + "ssid": "SSID", + "signal": "Signal", + "txBitrate": "TX Bitrate", + "settings": "Wifi Settings", + "password": "Password", + "save": "Save new Wifi configuration", + "connected": "Connected", + "notConnected": "Not connected", + "confirm": "Are you sure you want to apply the new Wifi settings?", + "hint": "Hint", + "hintText": "You can always revert back to the integrated Wifi Hotspot, consult your user manual on how to reset Wifi settings.", + "appliedOK": "Successfully applied new wifi credentials. After pressing OK the page will refresh. However, you will most likely need to change the URL since the robot will try to connect to the new Wifi." + }, + "mqtt": { + "settings": "MQTT Settings", + "url": "URL:", + "capath": "CA Path (optional):", + "qos": "Quality of Service:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Provide map data:", + "save": "Save MQTT configuration" }, "telegram": { "explanation": "Create a new chat in Telegram and search for \"Botfather\" account, create a new bot with /newbot, then copy the token and insert on this page. The password set here will be used to auth on the bot.", diff --git a/client/locales/es.json b/client/locales/es.json index 9d03d08b..fe7b017d 100644 --- a/client/locales/es.json +++ b/client/locales/es.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Cambiar los parámetros de la interfaz Web", "accessControlTitle": "Control de accesos", "accessControlDesc": "Configurar claves SSH y autentificación HTTP", + "mqttTitle": "MQTT", + "mqttDesc": "Ver y cambiar la configuración de MQTT", "telegramTitle": "Telegram Bot", "telegramDesc": "Activar y configurar Bot de Telegram", "loading": "cargando...", @@ -465,6 +467,17 @@ "hintText": "Siempre puede volver al punto de acceso Wifi integrado, consulte su manual de usuario sobre cómo restablecer la configuración de Wifi.", "appliedOK": "Se aplicaron con éxito nuevas credenciales Wifi. Después de presionar OK, la página se actualizará. Sin embargo, lo más probable es que necesite cambiar la URL ya que el robot intentará conectarse al nuevo Wifi." }, + "mqtt": { + "settings": "Configuraciones MQTT", + "url": "URL:", + "capath": "Ruta de CA (para SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Publicar datos del mapa:", + "save": "Guardar configuración" + }, "telegram": { "explanation": "Cree un nuevo chat en Telegram y busque la cuenta \"Botfather\", cree un nuevo bot con / newbot, luego copie el token e insértelo en esta página.", "general": "Configuración de Telegram", diff --git a/client/locales/fi.json b/client/locales/fi.json index 498caa3c..cbb66fcf 100644 --- a/client/locales/fi.json +++ b/client/locales/fi.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Muuta käyttöliittymän parametrejä", "accessControlTitle": "Pääsyn hallinta", "accessControlDesc": "Määrittele SSH-avaimet ja HTTP-autentikaatio", + "mqttTitle": "MQTT", + "mqttDesc": "Tarkastele ja muuta MQTT-asetuksia", "telegramTitle": "Telegram-botti", "telegramDesc": "Ota Telegram-botti käyttöön tai muuta sen asetuksia.", "loading": "ladataan...", @@ -465,6 +467,17 @@ "hintText": "Voit aina palata takaisin integroituun Wifi-hotspotiin. Katso käyttöoppaasta, kuinka Wifi-asetukset nollataan.", "appliedOK": "Wifi-tunnusten tallennus onnistui. Sivu latautuu uudelleen, kun painat OK. Todennäköisesti joudut muuttamaan URLia, koska imuri yhdistää uuteen verkkoon." }, + "mqtt": { + "settings": "MQTT-asetukset", + "url": "URL:", + "capath": "CA-polku (SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Julkaise karttatiedot:", + "save": "Tallenna kokoonpano" + }, "telegram": { "explanation": "Luo uusi Telegram-chat ja etsi \"Botfather\" tiliä, luo uusi botti komennolla /newbot ja kopioi tokeni ja syötä se tälle sivulle.", "general": "Telegram-asetukset", diff --git a/client/locales/fr.json b/client/locales/fr.json index 52391891..2463fe71 100644 --- a/client/locales/fr.json +++ b/client/locales/fr.json @@ -250,6 +250,8 @@ "webInterfaceDesc": "Modifier les paramètres de l'interface Web", "accessControlTitle": "Contrôle d'accès", "accessControlDesc": "Configurer les clés SSH et l'authentification HTTP", + "mqttTitle": "MQTT", + "mqttDesc": "Afficher et modifier les paramètres MQTT", "telegramTitle": "Telegram Bot", "telegramDesc": "Activer et configurer les paramètres du bot Telegram", "loading": "chargement...", @@ -464,6 +466,17 @@ "hintText": "Vous pouvez toujours revenir au point d'accès Wifi intégré, consultez votre manuel d'utilisation pour savoir comment réinitialiser les paramètres Wifi.", "appliedOK": "Les nouvelles informations d'identification wifi ont été appliquées avec succès. Après avoir appuyé sur OK, la page sera actualisée. Cependant, vous devrez probablement modifier l'URL car le robot tentera de se connecter au nouveau Wifi." }, + "mqtt": { + "settings": "Paramètres MQTT", + "url": "URL:", + "capath": "Chemin d'accès CA (pour SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Publier la carte:", + "save": "Enregistrer la configuration" + }, "telegram": { "explanation": "Créez un nouveau chat dans Telegram et recherchez le compte \"Botfather\", créez un nouveau bot avec /newbot, puis copiez le jeton et insérez-le sur cette page.", "general": "Paramètres télégramme", diff --git a/client/locales/hu.json b/client/locales/hu.json index 813f7aed..eedab7c5 100644 --- a/client/locales/hu.json +++ b/client/locales/hu.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Webes felület paramétereinek beállítása", "accessControlTitle": "Hozzáférési beállítások", "accessControlDesc": "SSH kulcsok és HTTP autentikáció beállítása", + "mqttTitle": "MQTT", + "mqttDesc": "Az MQTT beállításainak megtekintése és módosítása", "telegramTitle": "Telegram Bot", "telegramDesc": "Telegram bot engedélyezése és beállítása", "loading": "betöltés...", @@ -465,6 +467,17 @@ "hintText": "Bármikor vissza tudod állítani a beépített Wi-Fi hotspot módot a fedél alatti RESET gomb megnyomásával.", "appliedOK": "Sikeresen beállításra került az új Wi-Fi konfiguráció. Az OK gomb megnyomása után az oldal frissülni fog. De nagy valószínűséggel az URL-t meg kell változtatni, mivel a robot megpróbál csatlakozni az új Wi-Fi ponthoz." }, + "mqtt": { + "settings": "MQTT beállítások", + "url": "URL:", + "capath": "CA út (SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Térképadatok közzététele:", + "save": "Mentse az MQTT konfigurációt" + }, "telegram": { "explanation": "Indíts egy új beszélgetést Telegramon a \"Botfather\" bottal, majd készíts egy új botot a /newbot paranccsal, majd illeszd be ide a kapott Tokent.", "general": "Telegram beállítások", diff --git a/client/locales/it.json b/client/locales/it.json index 8f337a58..7e4f2ecb 100644 --- a/client/locales/it.json +++ b/client/locales/it.json @@ -250,6 +250,8 @@ "webInterfaceDesc": "Cambia i parametri dell'interfaccia web", "accessControlTitle": "Impostazioni di accesso", "accessControlDesc": "Impostazioni chiavi SSH e autenticazione HTTP", + "mqttTitle": "MQTT", + "mqttDesc": "Visualizza e modifica le impostazioni MQTT", "telegramTitle": "Bot Telegram", "telegramDesc": "Abilita e imposta il Bot Telegram", "loading": "caricamento...", @@ -464,6 +466,17 @@ "hintText": "Puoi ripristinare la modalità hotspot Wi-Fi integrata del robot in qualsiasi momento, premendo il pulsante RESET sotto il coperchio (vicino ai LED).", "appliedOK": "La nuova configurazione Wi-Fi è stata salvata correttamente. Premendo il pulsante OK si aggiorna la pagina. Molto probabilmente dovrai cambiare l'URL dato che il robot si collegherá al nuova rete Wi-Fi." }, + "mqtt": { + "settings": "Impostazioni MQTT", + "url": "URL:", + "capath": "CA Path (per SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Pubblica mappa:", + "save": "Salva la configurazione MQTT" + }, "telegram": { "explanation": "Crea una nuova chat in Telegram e cerca \"Botfather\" , crea un nuovo bot con /newbot, poi copia il token e inseriscilo in questa pagina .", "general": "Telegram impostazioni", diff --git a/client/locales/lv.json b/client/locales/lv.json index ce66331f..4aa24ece 100644 --- a/client/locales/lv.json +++ b/client/locales/lv.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Mainiet tīmekļa saskarnes parametrus", "accessControlTitle": "Piekļuves kontrole", "accessControlDesc": "Konfigurējiet SSH atslēgas un HTTP autentifikāciju", + "mqttTitle": "MQTT", + "mqttDesc": "Skatiet un mainiet MQTT iestatījumus", "telegramTitle": "Telegram Bots", "telegramDesc": "Ieslēgt un konfigurēt Telegram bota uzstādījumus", "loading": "ielādē...", @@ -465,6 +467,17 @@ "hintText": "Jūs vienmēr varat iestatīt ierīci piekļuves punkta režīmā; skatiet lietotāja rokasgrāmatā sniegtos norādījumus par Wifi iestatījumu atiestatīšanu.", "appliedOK": "Jaunie wifi akreditācijas dati tika veiksmīgi piemēroti. Pēc pogas nospiešanas lapa tiks atsvaidzināta. Tomēr, visticamāk, būs jāmaina URL saite, jo robots mēģinās izveidot savienojumu ar jauno Wifi." }, + "mqtt": { + "settings": "MQTT iestatījumi", + "url": "URL:", + "capath": "CA ceļš (SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Publicēt kartes datus:", + "save": "Saglabājiet MQTT konfigurāciju" + }, "telegram": { "explanation": "Izveidojiet jaunu tērzēšanu Telegramā un atrodiet kontu \"Botfather\", izveidojiet jaunu robotu ar komandu /newbot, pēc tam nokopējiet saņemto token un ielīmējiet to šajā lapā. Šeit iestatītā parole tiks izmantota, lai autentificētu botu.", "general": "Telegram uzstādījumi", diff --git a/client/locales/nl.json b/client/locales/nl.json index 41234d4e..669288b3 100644 --- a/client/locales/nl.json +++ b/client/locales/nl.json @@ -270,6 +270,8 @@ "webInterfaceDesc": "Configureren van de webinterface-opties", "accessControlTitle": "Toegang", "accessControlDesc": "Configureren van de SSH sleutels en HTTP authenticatie", + "mqttTitle": "MQTT", + "mqttDesc": "MQTT instellingen bekijken en wijzigen", "telegramTitle": "Telegram Bot", "telegramDesc": "Activeren en configureren van de Telegram bot", "loading": "Wordt geladen...", @@ -484,6 +486,17 @@ "hintText": "Je kunt altijd terugkeren naar de geïntegreerde Wifi Hotspot, raadpleeg uw gebruikershandleiding voor het resetten van Wifi-instellingen.", "appliedOK": "De Wifi instellingen zijn succesvol opgeslagen. Door op OK te klikken wordt de webinterface ververst. Het kan zijn dat je het adres dient aan te passen, omdat de verbinding nu anders loopt." }, + "mqtt": { + "settings": "MQTT-Instellingen", + "url": "URL:", + "capath": "CA pad (voor SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Publiceer kaartgegevens:", + "save": "Configuratie opslaan" + }, "telegram": { "explanation": "Maak een nieuwe chat aan en zoek het \"Botfather\" account, creer een nieuwe bot met /newbot, kopieer en plak het token in het tokenveld alhier.", "general": "Telegram instellingen", diff --git a/client/locales/pl.json b/client/locales/pl.json index ff8825dd..65ec643d 100644 --- a/client/locales/pl.json +++ b/client/locales/pl.json @@ -272,6 +272,8 @@ "webInterfaceDesc": "Zmień parametry interfejsu internetowego", "accessControlTitle": "Kontrola dostępu", "accessControlDesc": "Skonfiguruj klucze SSH i uwierzytelnianie HTTP", + "mqttTitle": "MQTT", + "mqttDesc": "Wyświetl i zmień ustawienia MQTT", "telegramTitle": "Telegram Bot", "telegramDesc": "Włącz i skonfiguruj ustawienia bota Telegram", "loading": "Ładowanie...", @@ -486,6 +488,17 @@ "hintText": "Zawsze możesz wrócić do zintegrowanego hotspotu Wi-Fi, zapoznaj się z instrukcją obsługi dotyczącą resetowania ustawień Wi-Fi.", "appliedOK": "Pomyślnie zastosowano nowe poświadczenia Wi-Fi. Po naciśnięciu OK strona zostanie odświeżona. Jednak najprawdopodobniej będziesz musiał zmienić adres URL, ponieważ robot spróbuje połączyć się z nowym Wi-Fi." }, + "mqtt": { + "settings": "Ustawienia MQTT", + "url": "URL:", + "capath": "Ścieżka CA (dla SSL):", + "qos": "QoS:", + "identifier": "Identifier:", + "prefix": "Topic Prefix:", + "autoprefix": "Autoconfiguration Prefix:", + "mapdata": "Opublikuj dane mapy:", + "save": "Zapisz konfigurację MQTT" + }, "telegram": { "explanation": "Utwórz nowy czat w Telegramie i wyszukaj konto „Botfather”, utwórz nowego bota za pomocą / newbot, a następnie skopiuj token i wstaw na tej stronie. Hasło ustawione tutaj zostanie użyte do autoryzacji bota.", "general": "Ustawienia Telegram", diff --git a/client/locales/ru.json b/client/locales/ru.json index d9d6ec58..f29e49cb 100644 --- a/client/locales/ru.json +++ b/client/locales/ru.json @@ -251,6 +251,8 @@ "webInterfaceDesc": "Изменение настроек веб-интерфейса", "accessControlTitle": "Права доступа", "accessControlDesc": "SSH-ключи и HTTP-авторизация", + "mqttTitle": "MQTT", + "mqttDesc": "Просмотр и изменение параметров MQTT", "telegramTitle": "Бот Telegram", "telegramDesc": "Включение и настройка бота для Telegram", "loading": "загрузка...", @@ -469,6 +471,17 @@ "hintText": "Вы всегда можете перевести устройство в режим точки доступа, смотрите инструкцию по сбросу настроек Wifi в руководстве пользователя.", "appliedOK": "Изменения успешно применены. Страница будет автоматически перезагружена после нажатия на кнопку \"OK\", но, возможно, вам понадобится поменять URL в адресной строке, так как устройство станет подключено к другой сети." }, + "mqtt": { + "settings": "Настройки MQTT", + "url": "URL:", + "capath": "Файл CA (опционально):", + "qos": "QoS:", + "identifier": "Идентификатор:", + "prefix": "Префикс:", + "autoprefix": "Префикс автонастройки:", + "mapdata": "Публиковать данные карты:", + "save": "Сохранить конфигурацию" + }, "telegram": { "explanation": "Создайте новый чат в Telegram и найдите аккаунт \"Botfather\", создайте у него нового бота командой /newbot, затем скопируйте полученный токен и вставьте на этой странице. Пароль задается для авторизации на боте.", "general": "Настройки Telegram", diff --git a/client/settings-mqtt.html b/client/settings-mqtt.html new file mode 100644 index 00000000..dcd5c305 --- /dev/null +++ b/client/settings-mqtt.html @@ -0,0 +1,161 @@ + + +
+ Settings +
+
MQTT
+
+
+
+ + + MQTT Settings + + +
+ Enabled: +
+ +
+ +
+ URL: +
+ +
+ +
+ CA Path (optional): +
+ +
+ +
+ Quality of Service: +
+ +
+ +
+ Identifier: +
+ +
+ +
+ Topic Prefix: +
+ +
+ +
+ Autoconfiguration Prefix: +
+ +
+ +
+ Provide map data: +
+ +
+
+ + + +
+ Save MQTT configuration +
+
+
+ + + + +
diff --git a/client/settings.html b/client/settings.html index 531ac3ee..3482fe98 100644 --- a/client/settings.html +++ b/client/settings.html @@ -39,13 +39,17 @@
Access Control
Configure SSH keys and HTTP authentication
+ +
MQTT
+
View and change MQTT settings
+
Telegram Bot
Enable and configure Telegram bot settings
From 2ffb0a9e1089fb929b08f9710d47a863a43df44a Mon Sep 17 00:00:00 2001 From: Erinome Date: Tue, 26 May 2020 14:02:54 +0300 Subject: [PATCH 018/172] attempt to use two slots when restoring a map looks like manufacturer's software forcefully caches loaded room data and that could lead to wrong room names being used after map restoration --- lib/MapManager.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/MapManager.js b/lib/MapManager.js index ce8257c6..9fd88c83 100644 --- a/lib/MapManager.js +++ b/lib/MapManager.js @@ -10,6 +10,8 @@ const MapManager = function(valetudo) { this.configuration = valetudo.configuration; this.vacuum = valetudo.vacuum; this.events = valetudo.events; + + this.tempIdx = 0; }; MapManager.prototype.storeMap = function(name, callback) { @@ -68,11 +70,11 @@ MapManager.prototype.loadMap = function(name, callback) { throw "required files at slot '"+name+"' missing"; } if (data['lab_status'] === 1 && data['msg_ver'] === 3) { // for 2008+ fw - fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/last_map", "/mnt/data/rockrobo/user_map2"); + fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/last_map", "/mnt/data/rockrobo/user_map" + (self.tempIdx+1)); if (fs.existsSync("/mnt/data/valetudo/maps/" + name + "/PersistData_1.data")) { - fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/PersistData_1.data", "/mnt/data/rockrobo/PersistData_4.data"); - } else if (fs.existsSync("/mnt/data/rockrobo/PersistData_4.data")) { - fs.unlinkSync("/mnt/data/rockrobo/PersistData_4.data"); + fs.copyFileSync("/mnt/data/valetudo/maps/" + name + "/PersistData_1.data", "/mnt/data/rockrobo/PersistData_" + (self.tempIdx+3) + ".data"); + } else if (fs.existsSync("/mnt/data/rockrobo/PersistData_" + (self.tempIdx+3) + ".data")) { + fs.unlinkSync("/mnt/data/rockrobo/PersistData_" + (self.tempIdx+3) + ".data"); } } else { optionalFiles.concat(cleanedFiles).forEach(file => { @@ -96,10 +98,11 @@ MapManager.prototype.loadMap = function(name, callback) { } } if (data['lab_status'] === 1 && data['msg_ver'] === 3) { - self.vacuum.recoverMap(2,function (err, data2) { + self.vacuum.recoverMap((self.tempIdx+1),function (err, data2) { if (err) { return Promise.reject(err.toString()); } + self.tempIdx ^= 1; callback(null, "ok"); }); } else if (data['lab_status'] === 1) { From b2cb3ed8930027a2bfa221b9f968f35ddb114250 Mon Sep 17 00:00:00 2001 From: Erinome Date: Wed, 27 May 2020 20:25:21 +0300 Subject: [PATCH 019/172] add an option to reboot device from the web UI closes #66 --- client/locales/bg.json | 21 ++-- client/locales/de.json | 21 ++-- client/locales/en.json | 24 ++-- client/locales/es.json | 22 ++-- client/locales/fi.json | 22 ++-- client/locales/fr.json | 22 ++-- client/locales/hu.json | 22 ++-- client/locales/it.json | 22 ++-- client/locales/lv.json | 22 ++-- client/locales/nl.json | 22 ++-- client/locales/pl.json | 22 ++-- client/locales/ru.json | 22 ++-- client/settings-persistent-data.html | 174 +++++++++++++++------------ client/settings.html | 4 +- lib/webserver/WebServer.js | 10 ++ 15 files changed, 275 insertions(+), 177 deletions(-) diff --git a/client/locales/bg.json b/client/locales/bg.json index a132d9ad..a6e54def 100644 --- a/client/locales/bg.json +++ b/client/locales/bg.json @@ -235,7 +235,7 @@ "timersDesc": "Графици и избор на часова зона", "carpetModeTitle": "Режим на килим", "carpetModeDesc": "Настройка на детектора за килим", - "persistentDataTitle": "Запазване на карта", + "persistentDataTitle": "Запазване на карта и настройки на системата", "persistentDataDesc": "Поддръжка на виртуални стени и забранени зони", "consumablesTitle": "Консумативи", "consumablesDesc": "Броячи за използваните конкумативи", @@ -334,20 +334,20 @@ "notSupported": "Запомнянето на карта се поддържа само от Roborock S5x.", "genericConfirm": "Сигурни ли сте, че искате да продължите?", "genericOverwriteWarning": "Съществуващата информация ще бъде презаписана.", - "deleteData": "Изтрий съхранените данни", + "deleteDataTitle": "Изтрий съхранените данни", + "deleteDataDesc": "Изтрива текущата карта, всички забранени зони и виртуални стени", "deleteDataButton": "Изтрий картата", "deleteDataNowButton": "Изтрий!", - "deleteDataTitle": "Изтрива текущата карта, всички забранени зони и виртуални стени!", "deleteDataConfirm": "Текущата запазена карта, както и всички забранени зони и виртуални стени ще бъдат изтрити!", - "exportDesc": "Запази забранените маркери във Valetudo", + "exportTitle": "Запази забранените маркери във Valetudo", + "exportDesc": "Зарежда забранените зони и виртуалните стени от фърмуера в конфигурацията на Valetudo", "exportButton": "Експорт", "exportNowButton": "Експорт на данни", - "exportTitle": "Зарежда забранените зони и виртуалните стени от фърмуера в конфигурацията на Valetudo", "exportConfirm": "Данните за забранените зони и виртуалните стени ще бъдат заредени от фърмуера на устройството и ще бъдат записани в конфигурацията на Valetudo.", - "importDesc": "Зареди забранените маркери от Valetudo", + "importTitle": "Зареди забранените маркери от Valetudo", + "importDesc": "Зарежда данни за забранени зони и виртуални стени от Valetudo и ги запазва във фърмуера", "importButton": "Импорт", "importNowButton": "Импорт на данни", - "importTitle": "Зарежда данни за забранени зони и виртуални стени от Valetudo и ги запазва във фърмуера", "importConfirm": "Данните за забранените зони и виртуалните стени от конфигурацията на Valetudo ще бъдат изтеглени и запазени във фърмуера на устройството.", "importConfirmDetails": "Готови за импорт {{virtualWallsCount}} и {{forbiddenZonesCount}}.", "exportConfirmDetails": "Готови за експорт {{virtualWallsCount}} и {{forbiddenZonesCount}}.", @@ -358,7 +358,12 @@ "settingsSaved": "Настройките запазени!", "resetOK": "Картата изтрита!", "exportedOK": "Конфигурацията на фърмуера експортирана във Valetudo.", - "importedOK": "Конфигурацията на Valetudo импортирана във фърмуера." + "importedOK": "Конфигурацията на Valetudo импортирана във фърмуера.", + "rebootTitle": "Рестарт устройство", + "rebootDesc": "Ще се опита да рестартира вградената операционна система", + "reboot": "Рестарт", + "rebootConfirm": "Сигурни ли сте, че искате да рестартирате операционната система на устройството?", + "rebootNotice": "Устройството сега се рестартира, моля изчакайте малко за зареждане." }, "soundAndVoice": { "volumeSettings": "Настройка силата на звука", diff --git a/client/locales/de.json b/client/locales/de.json index efe08a45..dd50349e 100644 --- a/client/locales/de.json +++ b/client/locales/de.json @@ -236,7 +236,7 @@ "timersDesc": "Timer und Zeitzoneneinstellungen", "carpetModeTitle": "Teppichmodus", "carpetModeDesc": "Teppichmodus einstellen", - "persistentDataTitle": "Dauerhafte Daten", + "persistentDataTitle": "Dauerhafte Daten und Systemeinstellungen", "persistentDataDesc": "Einstellen des Labormodus um virtuelle Wände, etc. zu aktivieren.", "consumablesTitle": "Verbrauchsmaterialien", "consumablesDesc": "Zählerstände für Verbrauchsmaterialien ansehen und zurücksetzen", @@ -335,20 +335,20 @@ "notSupported": "Leider unterstützt nur der Roborock S5x die permanenten Kartenfunktionen.", "genericConfirm": "Wirklich fortsetzen?", "genericOverwriteWarning": "Zuvor gespeicherte Daten werden überschrieben.", - "deleteData": "Dauerhafte Daten löschen", + "deleteDataTitle": "Dauerhafte Daten löschen", + "deleteDataDesc": "Dies löscht die aktuelle Karte, alle Verbotszonen und virtuellen Wände", "deleteDataButton": "Karten-Reset", "deleteDataNowButton": "Jetzt löschen!", - "deleteDataTitle": "Dies löscht die aktuelle Karte, alle Verbotszonen und virtuellen Wände", "deleteDataConfirm": "Dies löscht die aktuell gespeicherte Karte, alle Verbotszonen und virtuellen Wände.", - "exportDesc": "Exportieren der Verbotszonen und virtuellen Wände in die Valetudo-Konfiguration", + "exportTitle": "Exportieren der Verbotszonen und virtuellen Wände in die Valetudo-Konfiguration", + "exportDesc": "Hier werden Verbotszonen und virtuelle Wanddaten aus der Firmware exportiert und in Valetudo gespeichert", "exportButton": "Exportieren", "exportNowButton": "Daten exportieren", - "exportTitle": "Hier werden Verbotszonen und virtuelle Wanddaten aus der Firmware exportiert und in Valetudo gespeichert", "exportConfirm": "Hier werden Verbotszonen und virtuelle Wände aus der Gerätefirmware exportiert und in der Valetudo-Konfiguration gespeichert.", - "importDesc": "Importiert Verbotszonen aus der Valetudo-Konfiguration", + "importTitle": "Importiert Verbotszonen aus der Valetudo-Konfiguration", + "importDesc": "Hier werden Verbotszonen und virtuelle Wände aus Valetudo importiert und in der Firmware gespeichert", "importButton": "Importieren", "importNowButton": "Daten importieren", - "importTitle": "Hier werden Verbotszonen und virtuelle Wände aus Valetudo importiert und in der Firmware gespeichert", "importConfirm": "Hier werden Verbotszonen und virtuelle Wände aus der Valetudo-Konfiguration importiert und in der Gerätefirmware gespeichert.", "importConfirmDetails": "Bereit zum Import von {{virtualWallsCount}} und {{forbiddenZonesCount}}.", "exportConfirmDetails": "Bereit zum Export von {{virtualWallsCount}} und {{forbiddenZonesCount}}.", @@ -359,7 +359,12 @@ "settingsSaved": "Einstellungen gespeichert!", "resetOK": "Karten zurückgesetzt!", "exportedOK": "Dauerhafte Daten in die Konfiguration exportiert.", - "importedOK": "Dauerhafte Daten in die Konfiguration importiert." + "importedOK": "Dauerhafte Daten in die Konfiguration importiert.", + "rebootTitle": "Gerät neustarten", + "rebootDesc": "Versuchen, das integrierte Betriebssystem neu zu starten", + "reboot": "Rebooten", + "rebootConfirm": "Möchten Sie das Betriebssystem des Geräts wirklich neu starten?", + "rebootNotice": "Das Gerät wird jetzt neu gestartet. Warten Sie etwas, bis es gestartet ist." }, "soundAndVoice": { "volumeSettings": "Lautstärkeeinstellungen", diff --git a/client/locales/en.json b/client/locales/en.json index 1e4a52ea..a4e5bf64 100644 --- a/client/locales/en.json +++ b/client/locales/en.json @@ -236,7 +236,7 @@ "timersDesc": "Manage timers and timezone settings", "carpetModeTitle": "Carpet Mode", "carpetModeDesc": "Configure carpet mode", - "persistentDataTitle": "Persistent Data", + "persistentDataTitle": "Persistent Data & System Settings", "persistentDataDesc": "Configure the lab mode for enabling virtual walls etc", "consumablesTitle": "Consumables", "consumablesDesc": "View/reset consumable usage counters", @@ -335,20 +335,20 @@ "notSupported": "Sorry, only Roborock S5x supports the persistent map features.", "genericConfirm": "Are you sure to proceed?", "genericOverwriteWarning": "Previously saved data will be overwritten.", - "deleteData": "Delete persistent data", + "deleteDataTitle": "Delete persistent data", + "deleteDataDesc": "deletes the current map, all forbidden zones and virtual walls", "deleteDataButton": "Reset Map", "deleteDataNowButton": "Delete now!", - "deleteDataTitle": "This deletes the current map, all forbidden zones and virtual walls!", - "deleteDataConfirm": "This deletes the currently saved map, all forbidden zones and virtual walls.", - "exportDesc": "Export forbidden markers to Valetudo config", + "deleteDataConfirm": "deletes the currently saved map, all forbidden zones and virtual walls", + "exportTitle": "Export forbidden markers to Valetudo configuration", + "exportDesc": "This exports forbidden zones and virtual walls data from firmware and saves it in Valetudo", "exportButton": "Export", "exportNowButton": "Export data", - "exportTitle": "This exports forbidden zones and virtual walls data from firmware and saves it in Valetudo", "exportConfirm": "This exports forbidden zones and virtual walls from device's firmware and saves them to Valetudo configuration.", - "importDesc": "Import forbidden markers from Valetudo config", + "importTitle": "Import forbidden markers from Valetudo configuration", + "importDesc": "This imports forbidden zones and virtual walls data from Valetudo and sets it in firmware", "importButton": "Import", "importNowButton": "Import data", - "importTitle": "This imports forbidden zones and virtual walls data from Valetudo and sets it in firmware", "importConfirm": "This imports forbidden zones and virtual walls from Valetudo configuration and sets them in device's firmware.", "importConfirmDetails": "Ready to import {{virtualWallsCount}} and {{forbiddenZonesCount}}.", "exportConfirmDetails": "Ready to export {{virtualWallsCount}} and {{forbiddenZonesCount}}.", @@ -359,7 +359,13 @@ "settingsSaved": "Settings saved!", "resetOK": "Map reset!", "exportedOK": "Persistent data exported to configuration.", - "importedOK": "Persistent data imported from configuration." + "importedOK": "Persistent data imported from configuration.", + "systemSettingsTitle": "System Settings", + "rebootTitle": "Reboot device", + "rebootDesc": "will attempt to restart the onboard operating system", + "reboot": "Reboot", + "rebootConfirm": "Are you sure you want to reboot the operating system of the device?", + "rebootNotice": "Device is now restarting, please wait a bit for it to boot." }, "soundAndVoice": { "volumeSettings": "Sound Volume Settings", diff --git a/client/locales/es.json b/client/locales/es.json index 3fab8694..cb3c3eb1 100644 --- a/client/locales/es.json +++ b/client/locales/es.json @@ -236,7 +236,7 @@ "timersDesc": "Administrar temporizadores y configuración de la zona horaria", "carpetModeTitle": "Modo alfombra", "carpetModeDesc": "Configurar modo alfombra", - "persistentDataTitle": "Datos persistentes", + "persistentDataTitle": "Datos persistentes y configuraciones del sistema", "persistentDataDesc": "Configurar modo lab para activar muros virtuales, etc", "consumablesTitle": "Consumibles", "consumablesDesc": "Ver/reiniciar contadores de uso de consumibles", @@ -335,20 +335,20 @@ "notSupported": "Lo sentimos, solo Roborock S5x admite las características de mapas persistentes.", "genericConfirm": "¿Estás seguro de continuar?", "genericOverwriteWarning": "Los datos guardados anteriormente se sobreescribirán.", - "deleteData": "Borrar datos persistentes", + "deleteDataTitle": "Borrar datos persistentes", + "deleteDataDesc": "Esto elimina el mapa actual, todas las zonas prohibidas y paredes virtuales", "deleteDataButton": "Reiniciar mapa", "deleteDataNowButton": "¡Borrar ahora!", - "deleteDataTitle": "Esto elimina el mapa actual, todas las zonas prohibidas y paredes virtuales", "deleteDataConfirm": "Esto elimina el mapa guardado, todas las zonas prohibidas y paredes virtuales", - "exportDesc": "Exportar marcadores prohibidos a la configuración de Valetudo", + "exportTitle": "Exportar marcadores prohibidos a la configuración de Valetudo", + "exportDesc": "Esto exporta datos de las zonas prohibidas y muros virtuales del firmware y los guarda en Valetudo", "exportButton": "Exportar", "exportNowButton": "Exportar datos", - "exportTitle": "Esto exporta datos de las zonas prohibidas y muros virtuales del firmware y los guarda en Valetudo", "exportConfirm": "Esto exporta las zonas prohibidas y muros virtuales desde el firmware del dispositivo y los guarda en la configuración de Valetudo.", - "importDesc": "Importar marcadores prohibidos de la configuración de Valetudo", + "importTitle": "Importar marcadores prohibidos de la configuración de Valetudo", + "importDesc": "Esto importa datos de zonas prohibidas y paredes virtuales de Valetudo y lo configura en el firmware", "importButton": "Importar", "importNowButton": "Importar datos", - "importTitle": "Esto importa datos de zonas prohibidas y paredes virtuales de Valetudo y lo configura en el firmware", "importConfirm": "Esto importa zonas prohibidas y muros virtuales desde la configuración de Valetudo y los establece en el firmware del dispositivo.", "importConfirmDetails": "Preparado para importar {{virtualWallsCount}} y {{forbiddenZonesCount}}.", "exportConfirmDetails": "Preparado para exportar {{virtualWallsCount}} y {{forbiddenZonesCount}}.", @@ -359,7 +359,13 @@ "settingsSaved": "Configuración guardada!", "resetOK": "Mapa reiniciado!", "exportedOK": "Datos persistentes exportados a la configuración.", - "importedOK": "Datos persistentes importados desde la configuración." + "importedOK": "Datos persistentes importados desde la configuración.", + "systemSettingsTitle": "Ajustes del sistema", + "rebootTitle": "Reiniciar dispositivo", + "rebootDesc": "Esto intentará reiniciar el sistema operativo integrado", + "reboot": "Reiniciar", + "rebootConfirm": "¿Está seguro de que desea reiniciar el sistema operativo del dispositivo?", + "rebootNotice": "El dispositivo ahora se está reiniciando, espere un momento para que arranque." }, "soundAndVoice": { "volumeSettings": "Ajuste de volumen", diff --git a/client/locales/fi.json b/client/locales/fi.json index 0fd61455..dad39a2a 100644 --- a/client/locales/fi.json +++ b/client/locales/fi.json @@ -236,7 +236,7 @@ "timersDesc": "Hallitset ajastimia ja aikavyöhykkeitä", "carpetModeTitle": "Mattotila", "carpetModeDesc": "Määrittele mattotila", - "persistentDataTitle": "Pysyvä data", + "persistentDataTitle": "Pysyvä data ja järjestelmäasetukset", "persistentDataDesc": "Määrittele labra-tila virtuaalisten seinien jne. käyttämiseksi.", "consumablesTitle": "Vaihdettavat osat", "consumablesDesc": "Tarkastele/nollaa vaihdettavien osien ajastimia", @@ -335,20 +335,20 @@ "notSupported": "Pahoittelut. Vain Roborock S5x tukee tätä ominaisuutta.", "genericConfirm": "Haluatko varmasti jatkaa?", "genericOverwriteWarning": "Aiemmin tallennettu data tullaan ylikirjoittamaan.", - "deleteData": "Poista pysyvä data", + "deleteDataTitle": "Poista pysyvä data", + "deleteDataDesc": "Tämä poistaa nykyisen kartan sekä kaikki kielletyt alueet ja virtuaaliset seinät!", "deleteDataButton": "Nollaa kartta", "deleteDataNowButton": "Poista nyt!", - "deleteDataTitle": "Tämä poistaa nykyisen kartan sekä kaikki kielletyt alueet ja virtuaaliset seinät!", "deleteDataConfirm": "Tämä poistaa nykyisen kartan sekä kaikki kielletyt alueet ja virtuaaliset seinät.", - "exportDesc": "Hae kielletyt merkit Valetudoon", + "exportTitle": "Hae kielletyt merkit Valetudoon", + "exportDesc": "Tämä hakee kielletyt alueet ja virtuaaliset seinät nykyisestä laiteohjelmistosta ja tallentaa ne Valetudoon", "exportButton": "Hae", "exportNowButton": "Hae data", - "exportTitle": "Tämä hakee kielletyt alueet ja virtuaaliset seinät nykyisestä laiteohjelmistosta ja tallentaa ne Valetudoon", "exportConfirm": "Tämä hakee kielletyt alueet ja virtuaaliset seinät nykyisestä laiteohjelmistosta ja tallentaa ne Valetudoon.", - "importDesc": "Tuo kielletyt alueet Valetudosta", + "importTitle": "Tuo kielletyt alueet Valetudosta", + "importDesc": "Tämä tuo kielletyt alueet ja virtuaaliset seinät Valetudosta ja tallentaa ne nykyiseen laiteohjelmistoon", "importButton": "Tuo", "importNowButton": "Tuo data", - "importTitle": "Tämä tuo kielletyt alueet ja virtuaaliset seinät Valetudosta ja tallentaa ne nykyiseen laiteohjelmistoon", "importConfirm": "Tämä tuo kielletyt alueet ja virtuaaliset seinät Valetudosta ja tallentaa ne nykyiseen laiteohjelmistoon.", "importConfirmDetails": "Valmiina tuomaan {{virtualWallsCount}} sekä {{forbiddenZonesCount}}.", "exportConfirmDetails": "Valmiina hakemaan {{virtualWallsCount}} sekä {{forbiddenZonesCount}}.", @@ -359,7 +359,13 @@ "settingsSaved": "Asetukset tallennettu!", "resetOK": "Kartta nollattu!", "exportedOK": "Pysyvä data viety konfiguraatioon.", - "importedOK": "Pysyvä data tuotu konfiguraatiosta." + "importedOK": "Pysyvä data tuotu konfiguraatiosta.", + "systemSettingsTitle": "Järjestelmäasetukset", + "rebootTitle": "Uudelleenkäynnistä laite", + "rebootDesc": "Tämä yrittää käynnistää uudestaan sisäänrakennetun käyttöjärjestelmän", + "reboot": "Reboot", + "rebootConfirm": "Haluatko varmasti käynnistää laitteen käyttöjärjestelmän uudelleen?", + "rebootNotice": "Laite käynnistyy nyt uudelleen, odota vähän, kunnes se käynnistyy." }, "soundAndVoice": { "volumeSettings": "Äänenvoimakkuuden asetukset", diff --git a/client/locales/fr.json b/client/locales/fr.json index 94872668..e0dbe051 100644 --- a/client/locales/fr.json +++ b/client/locales/fr.json @@ -235,7 +235,7 @@ "timersDesc": "Gérer les minuteurs et les paramètres de fuseau horaire", "carpetModeTitle": "Mode tapis", "carpetModeDesc": "Configurer le mode tapis", - "persistentDataTitle": "Persistent Data", + "persistentDataTitle": "Persistent Data et Paramètres Système", "persistentDataDesc": "Configurer le mode laboratoire pour activer les murs virtuels, etc.", "consumablesTitle": "Consommables", "consumablesDesc": "Afficher/réinitialiser les compteurs d'utilisation des consommables", @@ -334,20 +334,20 @@ "notSupported": "Désolé, seul Roborock S5x prend en charge les fonctionnalités de carte persistantes.", "genericConfirm": "Voulez-vous vraiment continuer?", "genericOverwriteWarning": "Les données précédemment enregistrées seront écrasées.", - "deleteData": "Supprimer les données persistantes", + "deleteDataTitle": "Supprimer les données persistantes", + "deleteDataDesc": "Cela supprime la carte actuelle, toutes les zones interdites et les murs virtuels!", "deleteDataButton": "Réinitialiser la carte", "deleteDataNowButton": "Supprimer maintenant!", - "deleteDataTitle": "Cela supprime la carte actuelle, toutes les zones interdites et les murs virtuels!", "deleteDataConfirm": "Ceci supprime la carte actuellement enregistrée, toutes les zones interdites et les murs virtuels.", - "exportDesc": "Exporter les marqueurs interdits vers la configuration Valetudo", + "exportTitle": "Exporter les marqueurs interdits vers la configuration Valetudo", + "exportDesc": "Cela exporte les données des zones interdites et des murs virtuels du firmware et les enregistre dans Valetudo", "exportButton": "Exporter", "exportNowButton": "Exporter les données", - "exportTitle": "Cela exporte les données des zones interdites et des murs virtuels du firmware et les enregistre dans Valetudo", "exportConfirm": "Cela exporte les zones interdites et les murs virtuels du firmware du périphérique et les enregistre dans la configuration Valetudo.", - "importDesc": "Importer des marqueurs interdits depuis la configuration de Valetudo", + "importTitle": "Importer des marqueurs interdits depuis la configuration de Valetudo", + "importDesc": "Cela importe les données des zones interdites et des murs virtuels de Valetudo et les place dans le firmware", "importButton": "Importer", "importNowButton": "Importer des données", - "importTitle": "Cela importe les données des zones interdites et des murs virtuels de Valetudo et les place dans le firmware", "importConfirm": "Cela importe les zones interdites et les murs virtuels de la configuration Valetudo et les place dans le firmware du périphérique.", "importConfirmDetails": "Prêt à importer {{virtualWallsCount}} et {{forbiddenZonesCount}}.", "exportConfirmDetails": "Prêt à exporter {{virtualWallsCount}} et {{forbiddenZonesCount}}.", @@ -358,7 +358,13 @@ "settingsSaved": "Paramètres enregistrés!", "resetOK": "Réinitialisation de la carte!", "exportedOK": "Données persistantes exportées vers la configuration.", - "importedOK": "Données persistantes importées de la configuration." + "importedOK": "Données persistantes importées de la configuration.", + "systemSettingsTitle": "Les paramètres du système", + "rebootTitle": "Redémarrez l'appareil", + "rebootDesc": "Cela tentera de redémarrer le système d'exploitation intégré", + "reboot": "Redémarrer", + "rebootConfirm": "Voulez-vous vraiment redémarrer le système d'exploitation de l'appareil?", + "rebootNotice": "L'appareil redémarre maintenant, veuillez attendre un peu pour qu'il démarre." }, "soundAndVoice": { "volumeSettings": "Paramètre du son", diff --git a/client/locales/hu.json b/client/locales/hu.json index fca738e8..853dc3f7 100644 --- a/client/locales/hu.json +++ b/client/locales/hu.json @@ -236,7 +236,7 @@ "timersDesc": "Időzítők kezelése és időzóna beállítása", "carpetModeTitle": "Szőnyeg mód", "carpetModeDesc": "Szőnyeg mód beállítása", - "persistentDataTitle": "Tárolt adatok", + "persistentDataTitle": "Tárolt adatok és Rendszerbeállítások", "persistentDataDesc": "A fejlesztői mód engedélyezése, amivel elérhetővé válnak a virtuális falak, stb...", "consumablesTitle": "Kellékek", "consumablesDesc": "Kellékek megtekintése és visszaállítása", @@ -335,20 +335,20 @@ "notSupported": "Csak a Roborock S5x szérián elérhető a tárolt térkép funkció.", "genericConfirm": "Biztos vagy benne, hogy engedélyezni akarod?", "genericOverwriteWarning": "Az előzőleg mentett adatok felül lesznek írva.", - "deleteData": "Tárolt térkép adatok törlése", + "deleteDataTitle": "Tárolt térkép adatok törlése", + "deleteDataDesc": "Ezzel törlődik az aktuális térkép az összes tiltott zónával és virtuális falakkal.", "deleteDataButton": "Térkép visszaállítása", "deleteDataNowButton": "Törlés most!", - "deleteDataTitle": "Ezzel törlődik az aktuális térkép az összes tiltott zónával és virtuális falakkal.", "deleteDataConfirm": "Ez törli az aktuális mentett térképet az összes tiltott zónával és virtuális falakkal.", - "exportDesc": "Tiltott jelölők exportálása a Valetudo konfigurációs fájlba", + "exportTitle": "Tiltott jelölők exportálása a Valetudo konfigurációs fájlba", + "exportDesc": "Ez a funkció exportálja a tiltott zónákat és virtuális falakat a robot firmware-jéből és elmenti a Valetudo konfigurációs fájlban", "exportButton": "Exportálás", "exportNowButton": "Adatok exportálása", - "exportTitle": "Ez a funkció exportálja a tiltott zónákat és virtuális falakat a robot firmware-jéből és elmenti a Valetudo konfigurációs fájlban", "exportConfirm": "Ezzel exportálod a tiltott zónákat és virtuális falakat a robot firmware-jéből és elmented a Valetudo konfigurációs fájlba. Biztos folytatod?", - "importDesc": "Tiltott jelölők importálása a Valetudo konfigurációs fájlból.", + "importTitle": "Tiltott jelölők importálása a Valetudo konfigurációs fájlból.", + "importDesc": "A Valetudo konfigurációban tárolt összes tiltott zóna és virtuális fal importálása és beállítása a porszívó firmware-jében.", "importButton": "Importálás", "importNowButton": "Adatok importálása", - "importTitle": "A Valetudo konfigurációban tárolt összes tiltott zóna és virtuális fal importálása és beállítása a porszívó firmware-jében.", "importConfirm": "Ezzel importálásra kerül a Valetudo konfigurációban tárolt összes tiltott zóna és virtuális fal és beállításra kerül a porszívó firmware-jében.", "importConfirmDetails": "Készen állok {{virtualWallsCount}} db virtuális fal és {{forbiddenZonesCount}} db tiltott zóna importálására.", "exportConfirmDetails": "Készen állok {{virtualWallsCount}} db virtuális fal és {{forbiddenZonesCount}} db tiltott zóna exportálására.", @@ -359,7 +359,13 @@ "settingsSaved": "Beállítások mentve!", "resetOK": "Térkép törlése!", "exportedOK": "Tárolt térkép adatok exportálásra kerültek a konfigurációs fájlba.", - "importedOK": "Tárolt térkép adatok importálásra kerültek a konfigurációs fájlból." + "importedOK": "Tárolt térkép adatok importálásra kerültek a konfigurációs fájlból.", + "systemSettingsTitle": "Rendszerbeállítások", + "rebootTitle": "Eszköz újraindítása", + "rebootDesc": "Ez megkísérel újraindítani a fedélzeti operációs rendszert", + "reboot": "Reboot", + "rebootConfirm": "Biztosan újra akarja indítani a készülék operációs rendszerét?", + "rebootNotice": "Az eszköz most újraindul, kérjük, várjon egy kicsit, amíg elindul." }, "soundAndVoice": { "volumeSettings": "Hangerő Beállítások", diff --git a/client/locales/it.json b/client/locales/it.json index 2454dc84..87b726f2 100644 --- a/client/locales/it.json +++ b/client/locales/it.json @@ -235,7 +235,7 @@ "timersDesc": "Gestisci i timer e imposta il fuso orario", "carpetModeTitle": "Modalità tappeto", "carpetModeDesc": "Configura modalità tappeto", - "persistentDataTitle": "Dati persistenti/Lab mode", + "persistentDataTitle": "Dati persistenti/Lab mode e impostazioni di sistema", "persistentDataDesc": "Abilita la modalità Lab per accedere ai muri virtuali, ecc ...", "consumablesTitle": "Componenti", "consumablesDesc": "Visualizza/resetta i timer dei componenti soggetti a usura", @@ -334,20 +334,20 @@ "notSupported": "Mi dispiace, solo i Roborock S50/S55 supportano queste funzioni.", "genericConfirm": "Sei sicuro di voler procedere?", "genericOverwriteWarning": "I dati salvati precedentemente saranno sovrascritti.", - "deleteData": "Cancella dati persistenti", + "deleteDataTitle": "Cancella dati persistenti", + "deleteDataDesc": "Questo cancella l'attuale mappa, tutte le zone proibite e i muri virtuali.", "deleteDataButton": "Cancella mappa", "deleteDataNowButton": "Cancella!", - "deleteDataTitle": "Questo cancella l'attuale mappa, tutte le zone proibite e i muri virtuali.", "deleteDataConfirm": "Questo cancella l'attuale mappa salvata, tutte le zone proibite e i muri virtuali.", - "exportDesc": "Esporta marcatori proibiti nel file di configurazione di Valetudo", + "exportTitle": "Esporta marcatori proibiti nel file di configurazione di Valetudo", + "exportDesc": "Questo esporta le zone probite e i muri virtuali dal firmware e li salva in Valetudo", "exportButton": "Esporta", "exportNowButton": "Esporta dati", - "exportTitle": "Questo esporta le zone probite e i muri virtuali dal firmware e li salva in Valetudo", "exportConfirm": "Questo esporta le zone probite e i muri virtuali dal firmware e li salva nel file config di Valetudo", - "importDesc": "Importa marcatori proibiti dal file config di Valetudo", + "importTitle": "Importa marcatori proibiti dal file config di Valetudo", + "importDesc": "Questo importa le zone probite e i muri virtuali dal file config di Valetudo al firmware", "importButton": "Importa", "importNowButton": "Importa dati", - "importTitle": "Questo importa le zone probite e i muri virtuali dal file config di Valetudo al firmware", "importConfirm": "Questo importa le zone probite e i muri virtuali dal file config di Valetudo e li salva nel firmware del robot", "importConfirmDetails": "Pronto a importare {{virtualWallsCount}} muri virtuali e {{forbiddenZonesCount}} zone proibite.", "exportConfirmDetails": "Pronto a esportare {{virtualWallsCount}} muri virtuali e {{forbiddenZonesCount}} zone proibite.", @@ -358,7 +358,13 @@ "settingsSaved": "Impostazioni salvate!", "resetOK": "Mappa ripristinata!", "exportedOK": "Dati persistenti esportati alla configurazione.", - "importedOK": "Dati persistenti importati dalla configurazione." + "importedOK": "Dati persistenti importati dalla configurazione.", + "systemSettingsTitle": "Impostazioni di sistema", + "rebootTitle": "Riavvia il dispositivo", + "rebootDesc": "Questo tenterà di riavviare il sistema operativo integrato", + "reboot": "Reboot", + "rebootConfirm": "Sei sicuro di voler riavviare il sistema operativo del dispositivo?", + "rebootNotice": "Il dispositivo ora si riavvia, attendere un po 'per l'avvio." }, "soundAndVoice": { "volumeSettings": "Impostazioni volume suono", diff --git a/client/locales/lv.json b/client/locales/lv.json index 8fa72aa0..463cbe0a 100644 --- a/client/locales/lv.json +++ b/client/locales/lv.json @@ -236,7 +236,7 @@ "timersDesc": "Pārvaldīt taimerus un laika joslu iestatījumus", "carpetModeTitle": "Tepiķa režīms", "carpetModeDesc": "Iestatīt paklāja režīmu", - "persistentDataTitle": "Kartes saglabāšana", + "persistentDataTitle": "Kartes saglabāšana un sistēmas iestatījumi", "persistentDataDesc": "Virtuālās sienas un ierobežojumu marķieri", "consumablesTitle": "Palīgmateriāli", "consumablesDesc": "Palīgmateriālu patēriņa skaitītājs", @@ -335,20 +335,20 @@ "notSupported": "Atvainojiet, tikai Roborock S5x atbalsta pastāvīgās kartes funkcijas.", "genericConfirm": "Vai tiešām vēlaties turpināt?", "genericOverwriteWarning": "Iepriekš saglabātie dati tiks pārrakstīti.", - "deleteData": "Dzēst saglabātos datus", + "deleteDataTitle": "Dzēst saglabātos datus", + "deleteDataDesc": "Tas izdzēš pašreizējo karti, visas aizliegtās zonas un virtuālās sienas!", "deleteDataButton": "Atiestatīt karti", "deleteDataNowButton": "Dzēst!", - "deleteDataTitle": "Tas izdzēš pašreizējo karti, visas aizliegtās zonas un virtuālās sienas!", "deleteDataConfirm": "Tas izdzēš pašreiz saglabāto karti, visas aizliegtās zonas un virtuālās sienas.", - "exportDesc": "Eksportēt aizliegtos marķierus uz Valetudo", + "exportTitle": "Eksportēt aizliegtos marķierus uz Valetudo", + "exportDesc": "Tas eksportē aizliegto zonu un virtuālo sienu datus no programmaparatūras un saglabā tos Valetudo", "exportButton": "Eksportēt", "exportNowButton": "Eksportēt datus", - "exportTitle": "Tas eksportē aizliegto zonu un virtuālo sienu datus no programmaparatūras un saglabā tos Valetudo", "exportConfirm": "Tas eksportē aizliegto zonu un virtuālo sienu datus no programmaparatūras un saglabā tos Valetudo konfigurācijā.", - "importDesc": "Importējiet aizliegtus marķierus no Valetudo", + "importTitle": "Importējiet aizliegtus marķierus no Valetudo", + "importDesc": "Tas importē aizliegtās zonas un virtuālo sienu datus no Valetudo un iestata to programmaparatūrā", "importButton": "Importēt", "importNowButton": "Importēt datus", - "importTitle": "Tas importē aizliegtās zonas un virtuālo sienu datus no Valetudo un iestata to programmaparatūrā", "importConfirm": "Tas importē aizliegtās zonas un virtuālās sienas no Valetudo konfigurācijas un iestata tās ierīces programmaparatūrā.", "importConfirmDetails": "Gatavs importēšanai {{virtualWallsCount}} un {{forbiddenZonesCount}}.", "exportConfirmDetails": "Gatavs eksportēšanai {{virtualWallsCount}} un {{forbiddenZonesCount}}.", @@ -359,7 +359,13 @@ "settingsSaved": "Uzstādījumi saglabāti!", "resetOK": "Karte atiestatīta!", "exportedOK": "Konfigurācija eksportēta no programmaparatūras uz Valetudo.", - "importedOK": "Konfigurācija tiek importēta no Valetudo uz programmaparatūru." + "importedOK": "Konfigurācija tiek importēta no Valetudo uz programmaparatūru.", + "systemSettingsTitle": "Sistēmas iestatījumi", + "rebootTitle": "Atsāknēšanas ierīce", + "rebootDesc": "Tas mēģinās restartēt iebūvēto operētājsistēmu", + "reboot": "Atsāknēšana", + "rebootConfirm": "Vai tiešām vēlaties pārstartēt ierīces operētājsistēmu?", + "rebootNotice": "Ierīce tagad tiek restartēta. Lūdzu, nedaudz pagaidiet, līdz tā sākusies." }, "soundAndVoice": { "volumeSettings": "Skaļuma iestatīšana", diff --git a/client/locales/nl.json b/client/locales/nl.json index 5600cafd..2019ce35 100644 --- a/client/locales/nl.json +++ b/client/locales/nl.json @@ -255,7 +255,7 @@ "timersDesc": "Stel timers and timezones in", "carpetModeTitle": "Tapijt Modus", "carpetModeDesc": "Configureren van tapijt instellingen", - "persistentDataTitle": "Persistente Data", + "persistentDataTitle": "Persistente Data en Systeeminstellingen", "persistentDataDesc": "Configureer de opslag voor verboden gebieden en virtuele muren", "consumablesTitle": "Verbruik", "consumablesDesc": "Bekijken/resetten van verbruiksgegevens", @@ -354,20 +354,20 @@ "notSupported": "Sorry, alleen Roborock S5x ondersteunt de persistente map features.", "genericConfirm": "Weet je zeker dat je verder wilt?", "genericOverwriteWarning": "Reeds opgeslagen gegevens worden overschreven.", - "deleteData": "Verwijder persistente data", + "deleteDataTitle": "Verwijder persistente data", + "deleteDataDesc": "Dit verwijdert de huidige map, verboden gebieden and virtuele muren!", "deleteDataButton": "Reset Map", "deleteDataNowButton": "Verwijder!", - "deleteDataTitle": "Dit verwijdert de huidige map, verboden gebieden and virtuele muren!", "deleteDataConfirm": "Dit verwijdert de huidige map, verboden gebieden and virtuele muren.", - "exportDesc": "Exporteer verboden gebieden en virtuele muren naar Valetudo", + "exportTitle": "Exporteer verboden gebieden en virtuele muren naar Valetudo", + "exportDesc": "Dit slaat de verboden gebieden en virtuele muren in Valetudo op", "exportButton": "Exporteer", "exportNowButton": "Exporteer gegevens", - "exportTitle": "Dit slaat de verboden gebieden en virtuele muren in Valetudo op", "exportConfirm": "Dit slaat de verboden gebieden en virtuele muren in Valetudo op.", - "importDesc": "Importeer verboden gebieden en virtuele muren vanuit Valetudo", + "importTitle": "Importeer verboden gebieden en virtuele muren vanuit Valetudo", + "importDesc": "Dit slaat de verboden gebieden en virtuele muren vanuit Valetudo in het robotgeheugen op", "importButton": "Importeer", "importNowButton": "Importeer gegevens", - "importTitle": "Dit slaat de verboden gebieden en virtuele muren vanuit Valetudo in het robotgeheugen op", "importConfirm": "Dit slaat de verboden gebieden en virtuele muren vanuit Valetudo in het robotgeheugen op.", "importConfirmDetails": "Klaar om {{virtualWallsCount}} muren en {{forbiddenZonesCount}} zones te importeren.", "exportConfirmDetails": "Klaar om {{virtualWallsCount}} muren en {{forbiddenZonesCount}} zones te exporteren.", @@ -378,7 +378,13 @@ "settingsSaved": "Instellingen opgeslagen!", "resetOK": "Map reset!", "exportedOK": "Persistente data geexporteerd naar Valetudo.", - "importedOK": "Persistente data geimporteerd vanuit Valetudo." + "importedOK": "Persistente data geimporteerd vanuit Valetudo.", + "systemSettingsTitle": "Systeeminstellingen", + "rebootTitle": "Opnieuw opstarten apparaat", + "rebootDesc": "Dit zal proberen om het boordbesturingssysteem te herstarten", + "reboot": "Opstarten", + "rebootConfirm": "Weet u zeker dat u het besturingssysteem van het apparaat wilt herstarten?", + "rebootNotice": "Apparaat is nu aan het herstarten, wacht een beetje tot het op te starten." }, "soundAndVoice": { "volumeSettings": "Geluidsinstellingen", diff --git a/client/locales/pl.json b/client/locales/pl.json index 5f8a5fc7..13c51f81 100644 --- a/client/locales/pl.json +++ b/client/locales/pl.json @@ -257,7 +257,7 @@ "timersDesc": "Zarządzaj zegarami i ustawieniami stref czasowych", "carpetModeTitle": "Tryb dywanu", "carpetModeDesc": "Skonfiguruj tryb dywanu", - "persistentDataTitle": "Trwałe dane", + "persistentDataTitle": "Trwałe dane i ustawienia systemowe", "persistentDataDesc": "Skonfiguruj tryb laboratoryjny, aby włączyć wirtualne ściany itp", "consumablesTitle": "Materiały eksploatacyjne", "consumablesDesc": "Wyświetl / zresetuj liczniki zużycia materiałów eksploatacyjnych", @@ -356,20 +356,20 @@ "notSupported": "Niestety, tylko Roborock S5x obsługuje trwałe funkcje map.", "genericConfirm": "Czy na pewno chcesz kontynuować?", "genericOverwriteWarning": "Wcześniej zapisane dane zostaną zastąpione.", - "deleteData": "Usuń trwałe dane", + "deleteDataTitle": "Usuń trwałe dane", + "deleteDataDesc": "Spowoduje to usunięcie bieżącej mapy, wszystkich zakazanych stref i wirtualnych ścian!", "deleteDataButton": "Resetuj mapę", "deleteDataNowButton": "Usuń teraz!", - "deleteDataTitle": "Spowoduje to usunięcie bieżącej mapy, wszystkich zakazanych stref i wirtualnych ścian!", "deleteDataConfirm": "Spowoduje to usunięcie aktualnie zapisanej mapy, wszystkich zakazanych stref i wirtualnych ścian.", - "exportDesc": "Eksportuj strefy zakazane do pliku konfiguracji Valetudo", + "exportTitle": "Eksportuj strefy zakazane do pliku konfiguracji Valetudo", + "exportDesc": "To eksportuje zabronione strefy i dane wirtualnych ścian z oprogramowania układowego i zapisuje je w Valetudo", "exportButton": "Eksport", "exportNowButton": "Eksportuj dane", - "exportTitle": "To eksportuje zabronione strefy i dane wirtualnych ścian z oprogramowania układowego i zapisuje je w Valetudo", "exportConfirm": "To eksportuje zabronione strefy i wirtualne ściany z oprogramowania wewnętrznego urządzenia i zapisuje je w konfiguracji Valetudo.", - "importDesc": "Importuj strefy zakazane z pliku konfiguracji Valetudo", + "importTitle": "Importuj strefy zakazane z pliku konfiguracji Valetudo", + "importDesc": "Import zabronionych stref i wirtualych ścian z Valetudo i zapis w oprogramowaniu układowym", "importButton": "Import", "importNowButton": "Zaimportować dane", - "importTitle": "Import zabronionych stref i wirtualych ścian z Valetudo i zapis w oprogramowaniu układowym", "importConfirm": "Importuj zabronionych stref i wirtualnych ścian z konfiguracji Valetudo i zapis w oprogramowaniu urządzenia.", "importConfirmDetails": "Gotowy do importowania {{virtualWallsCount}} i {{forbiddenZonesCount}}.", "exportConfirmDetails": "Gotowy do eksportu {{virtualWallsCount}} i {{forbiddenZonesCount}}.", @@ -380,7 +380,13 @@ "settingsSaved": "Ustawienia zapisane!", "resetOK": "Reset mapy!", "exportedOK": "Trwałe dane eksportowane do konfiguracji.", - "importedOK": "Trwałe dane importowane z konfiguracji." + "importedOK": "Trwałe dane importowane z konfiguracji.", + "systemSettingsTitle": "Ustawienia systemowe", + "rebootTitle": "Uruchom ponownie urządzenie", + "rebootDesc": "Spowoduje to próbę ponownego uruchomienia wbudowanego systemu operacyjnego", + "reboot": "Restart", + "rebootConfirm": "Czy na pewno chcesz zrestartować system operacyjny urządzenia?", + "rebootNotice": "Urządzenie się teraz restartuje. Poczekaj chwilę, aż się uruchomi." }, "soundAndVoice": { "volumeSettings": "Ustawienia głośności dźwięku", diff --git a/client/locales/ru.json b/client/locales/ru.json index 0e9de5e2..837aa722 100644 --- a/client/locales/ru.json +++ b/client/locales/ru.json @@ -236,7 +236,7 @@ "timersDesc": "Расписания и выбор часового пояса", "carpetModeTitle": "Ковроискатель", "carpetModeDesc": "Настройка детектора коврового покрытия", - "persistentDataTitle": "Сохранение карты", + "persistentDataTitle": "Сохранение карты и системные параметры", "persistentDataDesc": "Поддержка виртуальных стен и запретных зон", "consumablesTitle": "Расходные компоненты", "consumablesDesc": "Счетчики использования расходников", @@ -336,20 +336,20 @@ "notSupported": "Сохранение карты поддерживается только в Roborock S5x.", "genericConfirm": "Уверены, что хотите продолжить?", "genericOverwriteWarning": "Старая информация будет перезаписана.", - "deleteData": "Удалить сохраненные данные", + "deleteDataTitle": "Удаление сохраненных данных", + "deleteDataDesc": "удаляет текущую карту, все запретные зоны и виртуальные стены", "deleteDataButton": "Сбросить карту", "deleteDataNowButton": "Удалить!", - "deleteDataTitle": "Удаляет текущую карту, все запретные зоны и виртуальные стены!", "deleteDataConfirm": "Будет удалена текущая сохраненная карта, а также все запретные зоны и виртуальные стены.", - "exportDesc": "Выгрузить запретные маркеры в Valetudo", + "exportTitle": "Выгрузка запретных маркеров в Valetudo", + "exportDesc": "выгружает данные о запретных зонах и виртуальных стенах из прошивки в конфигурацию Valetudo", "exportButton": "Экспорт", "exportNowButton": "Экспорт данных", - "exportTitle": "Выгружает данные о запретных зонах и виртуальных стенах из прошивки в конфигурацию Valetudo", "exportConfirm": "Будут выгружены данные о запретных зонах и виртуальных стенах из прошивки устройства и сохранены в конфигурации Valetudo.", - "importDesc": "Загрузить запретные маркеры из Valetudo", + "importTitle": "Загрузка запретных маркеров из Valetudo", + "importDesc": "загружает данные о запретных зонах и виртуальных стенах из Valetudo и устанавливает их в прошивке", "importButton": "Импорт", "importNowButton": "Импорт данных", - "importTitle": "Загружает данных о запретных зонах и виртуальных стенах из Valetudo и устанавливает их в прошивке", "importConfirm": "Будут загружены данные о запретных зонах и виртуальных стенах из конфигурации Valetudo и установлены в прошивку устройства.", "importConfirmDetails": "Готовы к импорту {{virtualWallsCount}} и {{forbiddenZonesCount}}.", "exportConfirmDetails": "Готовы к экспорту {{virtualWallsCount}} и {{forbiddenZonesCount}}.", @@ -362,7 +362,13 @@ "settingsSaved": "Настройки сохранены!", "resetOK": "Карта сброшена!", "exportedOK": "Конфигурация экспортирована из прошивки в Valetudo.", - "importedOK": "Конфигурация импортирована из Valetudo в прошивку." + "importedOK": "Конфигурация импортирована из Valetudo в прошивку.", + "systemSettingsTitle": "Системные параметры", + "rebootTitle": "Перезапуск устройства", + "rebootDesc": "перезагружает операционную систему", + "reboot": "Рестарт", + "rebootConfirm": "Вы уверены, что хотите перезапустить операционную систему на устройстве?", + "rebootNotice": "Устройство перезапускается, подождите окончания загрузки." }, "soundAndVoice": { "volumeSettings": "Настройка уровня громкости", diff --git a/client/settings-persistent-data.html b/client/settings-persistent-data.html index fad02dc2..7266a99b 100644 --- a/client/settings-persistent-data.html +++ b/client/settings-persistent-data.html @@ -8,69 +8,86 @@ + + + Persistent Data Configuration - - - Persistent data or "lab mode" is a feature of the Roborock S5x which allows saving forbidden zones and virtual walls. It also allows the robot to drive back to the dock wherever it is and keeps the map from being rotated. - - + - - -