diff --git a/app.js b/app.js index af8a750..e236d9b 100644 --- a/app.js +++ b/app.js @@ -464,12 +464,24 @@ function createApp() { }); // download model endpoint - app.get("/download-model", (req, res) => { - const modelPath = path.join(__dirname, "models", "modelo.viabilidade.csv"); - if (!fs.existsSync(modelPath)) return res.status(404).send("Modelo não encontrado"); - return res.download(modelPath, "modelo.viabilidade.csv"); +app.get("/download-model/:name", (req, res) => { + const name = req.params.name; + const safeName = path.basename(name); // evita ../ + const filePath = path.join(__dirname, "models", safeName); + if (!fs.existsSync(filePath)) return res.status(404).send("Arquivo não encontrado"); + return res.download(filePath, safeName); }); + // lista os arquivos disponíveis em /models + app.get("/download-models/list", (req, res) => { + const modelDir = path.join(__dirname, "models"); + if (!fs.existsSync(modelDir)) return res.status(404).json({ error: "Pasta de modelos não encontrada" }); + const files = fs.readdirSync(modelDir).filter((f) => fs.statSync(path.join(modelDir, f)).isFile()); + return res.json({ files }); + }); + + + // download result endpoint app.get("/download/:name", (req, res) => { const name = req.params.name; diff --git a/models/modelo.viabilidade.csv b/models/modelo.viabilidade-cep.csv similarity index 100% rename from models/modelo.viabilidade.csv rename to models/modelo.viabilidade-cep.csv diff --git a/models/modelo.viabilidade-geolocalizacao.csv b/models/modelo.viabilidade-geolocalizacao.csv new file mode 100644 index 0000000..a02845d --- /dev/null +++ b/models/modelo.viabilidade-geolocalizacao.csv @@ -0,0 +1,5957 @@ +latitude;longitude;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;; +;;;;;;� +;;;;;;� diff --git a/public/index.html b/public/index.html index e34d221..59dcf91 100644 --- a/public/index.html +++ b/public/index.html @@ -37,7 +37,7 @@
Consulta em lote:

- Faça um upload de um arquivo .CSV com a primeira coluna com os CEPs e a segunda coluna com o número do logradouro. O resultado da consulta será baixado automaticamente em um arquivo .CSV em seu computador. Caso precise baixar o modelo de arquivo para upload, clique em baixar modelo. + Faça um upload de um arquivo .CSV com a primeira coluna com os CEPs e a segunda coluna com o número do logradouro. O resultado da consulta será baixado automaticamente em um arquivo .CSV em seu computador. Caso precise baixar os modelos de arquivo para upload, clique em "Baixar Modelos".

@@ -45,7 +45,7 @@
- +
diff --git a/public/main.js b/public/main.js index 226cb0e..e6a4b4e 100644 --- a/public/main.js +++ b/public/main.js @@ -69,10 +69,38 @@ document.getElementById('btnConsultaCep').addEventListener('click', async () => }); // baixar modelo -const modelBtn = document.getElementById('card__button-download'); -if (modelBtn) { - modelBtn.addEventListener('click', (e) => { - // inicia download do endpoint que serve o modelo - window.location.href = '/download-model'; +// botão que inicia download de todos os modelos individualmente +document.addEventListener("DOMContentLoaded", () => { + const btn = document.getElementById("card__button-download"); + if (!btn) return; + + btn.addEventListener("click", async (e) => { + e.preventDefault(); + try { + const resp = await fetch("/download-models/list"); + if (!resp.ok) throw new Error("Não foi possível obter lista de modelos"); + const data = await resp.json(); + const files = data.files || []; + + if (!files.length) { + alert("Nenhum arquivo de modelo disponível"); + return; + } + + // Para cada arquivo, cria um e clica nele para iniciar download individual + files.forEach((fname) => { + const url = "/download-model/" + encodeURIComponent(fname); + const a = document.createElement("a"); + a.href = url; + a.download = fname; + // necessário anexar no DOM para funcionar em alguns navegadores + document.body.appendChild(a); + a.click(); + a.remove(); + }); + } catch (err) { + console.error("Erro ao baixar modelos:", err); + alert("Erro ao iniciar downloads: " + (err.message || err)); + } }); -} +}); \ No newline at end of file